Szyfrowanie metodą przestawieniową-Pascal

  • 9 Odpowiedzi
  • 5012 Wyświetleń

0 użytkowników i 1 Gość przegląda ten wątek.

*

Offline Progressive

  • ***
  • 251
  • Płeć: Mężczyzna
  • Heavy Reggae!
  • Sprzęt: HP iPAQ 214; iPad2; Milestone; iPhone 4S
Szyfrowanie metodą przestawieniową-Pascal
« dnia: Maj 10, 2010, 17:43:41 »
Jak w temacie, potrzebuję pomocy w realizacji programu którego zadaniem ma być szyfrowanie/deszyfrowanie tekstu metodą przestawieniową. Użytkownik może sam wprowadzić parametry szyfrowania(szerokość kolumny) oraz wybierać między szyfrowaniem a deszyfrowaniem. Maksymalna długość wprowadzonego tekstu może wynosić maksymalnie 250 znaków(dopuszczalne duże, małe litery, cyfry, znaki interpunkcyjne). 

Potrafię sklecić możliwość wyboru między deszyfrowaniem a szyfrowaniem, nie mam jednak pomysłu na realizację samego rdzenia programu czyli części deszyfrującej/szyfrującej. Jedyne co mi się udało to uzyskanie w miarę pomyślnych efektów przy szyfrowaniu z góry określonej ilości kolumn(użytkownik nie ma wyboru). Nie jest jednak to co chciałbym osiągnąć. Nie mam również pojęcia jak zrealizować deszyfrowanie zakodowanego tekstu.

Jeżeli jakiś bardziej doświadczony i obeznany z tematem kolega(a takich z pewnością tu nei brakuje) mógłby pomóc i naprowadzić na metodę rozwiązania byłbym bardzo wdzieczny.

*

Offline kotex

  • **
  • 156
  • Płeć: Mężczyzna
  • Sprzęt: Nokia 808
Odp: Szyfrowanie metodą przestawieniową-Pascal
« Odpowiedź #1 dnia: Maj 10, 2010, 19:09:50 »
Pisałem nie jeden program tego typu ale w C++. Szyfrowanie i deszyfrowanie dajmy na to wyrazu polegalo na przesunieciu kazdego pojedynczego symbolu(znaku) o pewna unikalna jednorazowa wartosc ktora odnosila sie do zapisu tego symbolu w kodzie ASCII. Kazdy symbol zostawal osobno odbierany i przesuwany w ASCII o <x> w "lewo" badz w "prawo". Nie wiem czy rozumiesz co mam na mysli  :). Najprosciej czyli na poczatek tak sobie zrob ze bedzie ci przesuwal zawsze o ta sama wartosc w ta sama strone, pozniej o wartosc jaka ty mu wskazesz, pozniej o wartosc jaka ty mu wskazesz i strone rowniez, pozniej tworzysz spboe wzor na odpowiedni ciag arytmetyczny ktory gdzie ( <a(indeks)> w zapisie matematycznym ) a(1), a(2), a(3), ..., a(n) zaleznie od znakow calego zdania (da sie zczytac odpowiednia funkcja str...costam w c++) odpowiada wartosci przesuniecia kazdego kolejnego znaku odnosnie do indeksu i do tego np. wartosci podzielne przez 4 beda przesuniete w lewo a pozostale w prawo. Deszyfrowanie to oczywiscie wszystkie kroki po kolei robimy od tylu. Tak zaszyfrowane zdanie nie wiem czy ktos jest w stanie rozszyfrowac ? Jak znajde stary podrecznik to podrzuce ci kod takiego podstawowego szyfrowania w C++ o ile tam znajde to. pamietam to jak dzis. Pisalem taki program na 5 z programowania w technikum ;)  :ok:
« Ostatnia zmiana: Maj 10, 2010, 19:16:12 wysłana przez kotex »
Siemens C25 -> Siemens M35i -> Samsung X100 -> Nokia 7650 -> Motorolla L7 -> SE V630@K550 -> Nokia 6300 -> Nokia E62 -> Nokia 6301 -> E-TEN X800 -> Nokia E71 -> HTC HD2 + Nokia 6700 -> BB9780 -> Nokia 808

*

Offline blady.bb

  • ****
  • 720
  • Płeć: Mężczyzna
  • Sprzęt: HTC Universal, HTC Leo
Odp: Szyfrowanie metodą przestawieniową-Pascal
« Odpowiedź #2 dnia: Maj 10, 2010, 19:13:20 »
Szkoda, że Pascal bo chętnie bym się podjął.
HTC Universal [G3]
Radio: 1.17.00
ROM: Tomal v8.81 Regular (64MB device) WM6.1 - Hybrid Build: 21042.1.6.0
MiniSMS

*

Offline Progressive

  • ***
  • 251
  • Płeć: Mężczyzna
  • Heavy Reggae!
  • Sprzęt: HP iPAQ 214; iPad2; Milestone; iPhone 4S
Odp: Szyfrowanie metodą przestawieniową-Pascal
« Odpowiedź #3 dnia: Maj 10, 2010, 19:14:49 »
Niestety, musi to być koniecznie Pascal, nic innego nie wchodzi w grę.

Po pewnych zabiegach udało mi się skonstruować coś takiego:
program szyfrowanie;
uses crt;
const n=250;
var
   a:array[1..100,1..100] of char;
   s:string[n];
   k,b,c,d,e,f,g,h:integer;
begin
clrscr;
write('Podaj tekst do zaszyfrowania: ');
readln(s);
write('Podaj szerokosc kolumny: ');
readln(k);
f:=length(s);
b:=f div k + 1;
e:=0;

             for c:=1 to b do
                 begin
                 writeln;
                 for d:=1 to k do
                 begin
                 e:=e+1;
                 a[c,d]:=s[e];
                 write(a[c,d]);
                 end;
                 end;
writeln('Oto zaszyfrowany tekst: ');
for c:=1 to k do
begin
for d:=1 to b do
write(a[d,c]);
end;
readln;
end.

O dziwo to działa, jednak brakuje mi jeszcze opcji deszyfrowania. Może mógłby ktoś coś doradzić?
« Ostatnia zmiana: Maj 10, 2010, 19:28:18 wysłana przez Progressive »

*

Offline globalbus

  • Ekspert PDA
  • ******
  • 6139
  • Płeć: Mężczyzna
  • Power User // ROM Developer
  • Sprzęt: N900
Odp: Szyfrowanie metodą przestawieniową-Pascal
« Odpowiedź #4 dnia: Maj 10, 2010, 21:17:53 »
Jak to uczniom komplikują życie. Chodzi o szyfr Cezara, tak? Implementacja w C++ to jak kotex mówił, parę chwil. Nie masz możliwości w pascalu jakoś zrobić podobnie?
"Wiedza zdobyta samodzielnie jest więcej warta niż przekazana przez inną osobę"

"ponieważ gotowanie to nie jest copy/paste"
paypal

*

Offline Progressive

  • ***
  • 251
  • Płeć: Mężczyzna
  • Heavy Reggae!
  • Sprzęt: HP iPAQ 214; iPad2; Milestone; iPhone 4S
Odp: Szyfrowanie metodą przestawieniową-Pascal
« Odpowiedź #5 dnia: Maj 10, 2010, 22:05:21 »
Nie, to nie Szyfr Cezara. Ten który muszę wykorzystać działa na zasadzie:
rower jest zapisywane w kolumnach jako np:
ro
we
r
A następnie odczytywane kolumnami w dół, w tym przypadku rwroe.
Szerokość kolumn definiuje użytkownik. Mam teraz jedynie problem z deszyfrowaniem.

*

Offline kotex

  • **
  • 156
  • Płeć: Mężczyzna
  • Sprzęt: Nokia 808
Odp: Szyfrowanie metodą przestawieniową-Pascal
« Odpowiedź #6 dnia: Maj 11, 2010, 17:36:10 »
W C++ banalna sprawa. Tworzysz stringowa albo charowa (tez powinna dzialac) tablice o watosci wskazanej przez ciebie po czym stosujesz funkcje zczytujaca kazdy kolejny symbol(nie pamietam jak sie nazywala, nie mam jednak starego podrecznika) w wyrazie poprzez petle for (odpowiednio skonfigurowanej odnosnie twojej szerokosci kolumny) i importujesz odczytywane symbole do wczesniej utworzonej tablicy. I to by bylo na tyle. Deszyfrowanie robisz poprostu przez odczytywanie wartosci tablicy ale od tylu do przodu tez za pomoca petli for. W tym przypadku stosujac tablice dwuwymiarowa mozesz kazdy wyraz umiescic w innym wymiarze. Natomiast jesli chodzi o Turbo Pascal to ci nie pomoge bo nie czaje go.


Siemens C25 -> Siemens M35i -> Samsung X100 -> Nokia 7650 -> Motorolla L7 -> SE V630@K550 -> Nokia 6300 -> Nokia E62 -> Nokia 6301 -> E-TEN X800 -> Nokia E71 -> HTC HD2 + Nokia 6700 -> BB9780 -> Nokia 808

*

Offline globalbus

  • Ekspert PDA
  • ******
  • 6139
  • Płeć: Mężczyzna
  • Power User // ROM Developer
  • Sprzęt: N900
Odp: Szyfrowanie metodą przestawieniową-Pascal
« Odpowiedź #7 dnia: Maj 16, 2010, 20:18:23 »
z nudów napisałem na brudno w c++ (jako element przygotowania do matury :P)
Jeśli ci się przyda to dobrze.
#include <cstdlib>
#include <iostream>
#include <string>
#include <cmath>
using namespace std;

int main()
{
    const int k=3, z=50; //liczba przesunięć
    char tablica[z][k]={0};
    char tablica2[z][k]={0};
    string source;
    string result, result2;
    cout<<"Wprowadz ciag";
    cin>>source;
    unsigned int n=0, t=0;
    n=source.size();
    //crypt
    for(int i=0;i<n; i++)
    {
     t=floor(i/k);
     tablica[t][i%k]=source[i];
    }
   
    cout<<"\n";

    for(int i=0; i<k;i++)
    {
            for(int j=0; j<ceil(n/k)+1;j++)
            {
            if(tablica[j][i]==0)
            break;
            else
            result=result+tablica[j][i];
            }
    }
    cout<<result;
    //decrypt
    int x=0;
    for(int i=0; i<k;i++)
    {
            for(int j=0; j<ceil(n/k);j++)
            {
            tablica2[j][i]=result[x];
            x++;
            }
    }
    for(int i=0;i<n; i++)
    {
    t=floor(i/k);
    result2=result2+tablica2[t][i%k];
    }
    cout<<"\n"<<result2;
    system("PAUSE");
    return EXIT_SUCCESS;
}
"Wiedza zdobyta samodzielnie jest więcej warta niż przekazana przez inną osobę"

"ponieważ gotowanie to nie jest copy/paste"
paypal

*

Offline kotex

  • **
  • 156
  • Płeć: Mężczyzna
  • Sprzęt: Nokia 808
Odp: Szyfrowanie metodą przestawieniową-Pascal
« Odpowiedź #8 dnia: Maj 17, 2010, 20:45:06 »
z nudów napisałem na brudno w c++ (jako element przygotowania do matury :P)
Jeśli ci się przyda to dobrze.
#include <cstdlib>
#include <iostream>
#include <string>
#include <cmath>
using namespace std;

int main()
{
    const int k=3, z=50; //liczba przesunięć
    char tablica[z][k]={0};
    char tablica2[z][k]={0};
    string source;
    string result, result2;
    cout<<"Wprowadz ciag";
    cin>>source;
    unsigned int n=0, t=0;
    n=source.size();
    //crypt
    for(int i=0;i<n; i++)
    {
     t=floor(i/k);
     tablica[t][i%k]=source[i];
    }
   
    cout<<"\n";

    for(int i=0; i<k;i++)
    {
            for(int j=0; j<ceil(n/k)+1;j++)
            {
            if(tablica[j][i]==0)
            break;
            else
            result=result+tablica[j][i];
            }
    }
    cout<<result;
    //decrypt
    int x=0;
    for(int i=0; i<k;i++)
    {
            for(int j=0; j<ceil(n/k);j++)
            {
            tablica2[j][i]=result[x];
            x++;
            }
    }
    for(int i=0;i<n; i++)
    {
    t=floor(i/k);
    result2=result2+tablica2[t][i%k];
    }
    cout<<"\n"<<result2;
    system("PAUSE");
    return EXIT_SUCCESS;
}

Dlaczego nie uzywasz funkcji ? Wszystko w main wladowane  :mysli:
Siemens C25 -> Siemens M35i -> Samsung X100 -> Nokia 7650 -> Motorolla L7 -> SE V630@K550 -> Nokia 6300 -> Nokia E62 -> Nokia 6301 -> E-TEN X800 -> Nokia E71 -> HTC HD2 + Nokia 6700 -> BB9780 -> Nokia 808

*

Offline globalbus

  • Ekspert PDA
  • ******
  • 6139
  • Płeć: Mężczyzna
  • Power User // ROM Developer
  • Sprzęt: N900
Odp: Szyfrowanie metodą przestawieniową-Pascal
« Odpowiedź #9 dnia: Maj 17, 2010, 21:02:31 »
mówiłem, że na brudno? :wink: Po prostu napisałem, bez formatowania, bez komentarzy, bez optymalizacji (pętla przejeżdża więcej razy niż to konieczne).

Połączone: Maj 18, 2010, 14:53:30
Progressive, wiszę ci duże piwo za ten temat, dzisiaj na maturze z informatyki rozszerzonej był ten sam algorytm, tylko w prostszej postaci :ok:
Podaj konto albo paypala na PW to ci coś dorzucę na flachę :wink:
« Ostatnia zmiana: Maj 18, 2010, 14:53:30 wysłana przez globalbus »
"Wiedza zdobyta samodzielnie jest więcej warta niż przekazana przez inną osobę"

"ponieważ gotowanie to nie jest copy/paste"
paypal