ďťż

Ładny brzuch

Witam,

Z Internetu doczytałem takich kilka rzeczy, niestety informacje nie są
sprawdzone z jakąkolwiek uczciwą książką:

1. szyfr Cezara
~~~~~~~~~~~~~~~
f(a)=(a+k) mod N

gdzie:
a - pozycja litery w alfabecie
k - przesunięcie w prawo, tutaj const int 3 w prawo
N - długość alfabetu, tutaj angielski 26 znaków, tj
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

2. szyfr Przerzedzony (oparty na mnożeniach)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
f(a)=(s*k) mod N

gdzie:
s - pozycja litery w alfabecie
k - przesunięcie

analogia do Cezara, ale z mnożeniem

3. szyfr afiniczny (połączenie 1 cezara i 2 przerzedzony)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
f(a)=( (a*k1) + k0 ) mod N

gdzie:
a - pozycja litery w alfabecie
k0 - przesunięcie w prawo
k1 - współczynnik przerzedzenia

/** Myślę, że afiniczny napisze się "analogicznie" do Cezara */

Próba realizacji szyfru afinicznego, czy słuszna?

// 1. Wpisz stopiePrzerzedzenia // 2. Wpisz przesuniecie w prawo // 3. _drukowanymi_ wpisz slowo // 4. CTRL + Z // 5. powinien byc wynik #include <iostream.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <math.h> int main() { int znak; int stopienPrzerzedzenia,przesunWprawo; cout << "Podaj stopien przerzedzenia: " << endl; cin >> stopienPrzerzedzenia; cout << "Podaj przesuniecie w prawo: " << endl; cin >> przesunWprawo; while ( (znak = getchar()) != EOF ) { if ( (znak >= 65) && (znak <= 90) ) { znak = znak - 65; znak = (znak * stopienPrzerzedzenia) + przesunWprawo; znak = fmod(znak,26); znak = znak + 65; putchar(znak); } /** // kolejne ify dopisze, czyli // if ( (znak>=97) && (znak<=122) ) { // } // if ((znak>=48) && (znak<=57)) { // } */ } system("PAUSE"); }

Mam jeszcze taką próbę deszyfrowania, jednak np.
podając ZQBKXP powinno wyjść WTOREK. Jest inaczej.

Fragment deszyfrowania:

while((znak = getchar()) != EOF) { if((znak>=65) && (znak<=90)) { znak /= stopienPrzerzedzenia; znak += przesuniecieWprawo; putchar(znak); } }



Do programu szyfrującego:
Co się stanie jak będziesz chciał zaszyfrować literę "z" (bądź "9"), albo w tekście będą same duże litery??
Nie widze powtórzeń Alfabetu np:
Szyfrujemy Z (90 kod dziesiętny);
Stopień przesunięcia = 2;
Przesuń w Prawo = 12;
Wynik 90*2+12=192;

Kody ASCII kończą się na 127 (dlatego wystarczy typ short)

Do deszyfrującego:
Źle do tego podeszłeś (proponuje kartke i pare nie przespanych nocy :) )

A tak na marginesie SZYFR CEZARA TO SAMO PRZESUNIęCIE O 3 W PRAWO BEZ DZIELEń I TYM PODOBNYCH czyli zamiast A będzie D, Z -> C

Uzupełniony kod:

#include <iostream.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <math.h> int main() { int znak; int stopienPrzerzedzenia,przesunWprawo; cout << "Podaj stopien przerzedzenia: " << endl; cin >> stopienPrzerzedzenia; cout << "Podaj przesuniecie w prawo: " << endl; cin >> przesunWprawo; while ( (znak = getchar()) != EOF ) { // duze znaki if ( (znak >= 65) && (znak <= 90) ) { znak = znak - 65; znak = (znak * stopienPrzerzedzenia) + przesunWprawo; znak = fmod(znak,26); znak = znak + 65; putchar(znak); } // male znaki else if ((znak>=97) && (znak<=122)) { znak = znak -97; znak = (znak * stopienPrzerzedzenia) + przesunWprawo; znak = fmod(znak,26); znak = znak + 97; putchar(znak); } // cyfry else if ((znak>=48) && (znak<=57)) { znak = znak - 48; znak = (znak * stopienPrzerzedzenia) + przesunWprawo; znak = fmod(znak,10); znak = znak + 48; putchar(znak); } } system("PAUSE"); }


Szyfrujemy Z (90 kod dziesiętny);
Stopień przesunięcia = 2;
Przesuń w Prawo = 12;
Wynik 90*2+12=192;
u mnie

2*90+12=192;
fmod(192, 26)=10;
10+65=75; // znak K


1. szyfr Cezara
~~~~~~~~~~~~~~~
f(a)=(a+k) mod N

gdzie:
a - pozycja litery w alfabecie
k - przesunięcie w prawo, tutaj const int 3 w prawo
N - długość alfabetu, tutaj angielski 26 znaków



A tak na marginesie SZYFR CEZARA TO SAMO PRZESUNIęCIE O 3 W PRAWO BEZ DZIELEń I TYM PODOBNYCH czyli zamiast A będzie D, Z -> C Po co te drukowane litery? Napisałem definicję szyfru Cezara inną od Twojej?


Kody ASCII kończą się na 127 (dlatego wystarczy typ short)

Kody ASCII kończą się na numerze 256?
int czy short, może jednak unsigned int, ale czy mocno zmieni to
sens algorytmu szyfrowania? Jak się czepiać, to co tam...

Jak ktoś będzie szukał wzorów, to znalazłem w Sieci.
Niestety nie dysponuję jeszcze "tą" książką z WNT o kryptografii w praktyce z przykładami w ANSI C,
więc:

Szyfr afiniczny(szyfrowanie, deszyfrowanie):
E(a,b,x)=a*x+b(mod 26) D(a,b,x)=a`*(x-b)(mod 26).
Użytkownik TAXIarz edytował ten post 01 maj 2007, 22:34
if (fmod (znak,26!=0)) znak=(fmode(znak,26))+65; else znak=znak+65;

Powinno chodzić :)
jeszcze posiedze nad dekodowaniem, ale dzisiaj chyba nie zrobie bo po wczorajszej nocy troszeczkę głowa mnie boli :P

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •