Sunteți pe pagina 1din 6

Universitatea de Stat din Moldova Facultatea de Matematica si Informatica

Criptarea textelor cu ajutorul algoritmului Caesar si Affine

Student: Olaru Sergiu Grupa: IA 31 Profesor: I. Craciun

Chisinau 2013

Affine: Cifrul afin este un tip de cifru de substitutie monoalphabetica. n care fiecare liter ntr-un alfabet este mapat la echivalentul su numeric, criptate folosind o functie matematic simpl, i convertita napoi intr-un text. Functia de criptare pentru o singur liter este:

Unde modulus m este marimea alfabetului si a si b sunt cheile cifrului. a trebuie sa fie ales ca sa fie relativ prima cu m si b este oricare numar mai mic decit m. Functia de decriptare este:

unde a-1 este inversa modular multiplicativa a lui a modulo m Exemplu: Pentru literele de la A la Z , ele vor avea urmatoarele valori:

AB C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

Vom cripta textul Affine vom lua a sa fie 5 si b sa fie 8 , si m = 26 , 26 de litere Pentru a vom avea (5*0 + 8) mod 26 = 8 Pentru f (5*5 + 8 ) mod 26 = 10 Decriptarea : 5-1 mod 26 = 21 Pentru I : 21(8-8) mod 26 = 0 Text (5x +8) mod 26 Text criptat 21(y-8) mod 26 Text decriptat A 8 I 0 A F 7 H 5 F F 7 H 5 F I 22 W 8 I N 21 V 13 N E 2 C 4 E

Caesar:

Transformarea poate fi prezentata alineind 2 alfabete : Daca cheia va fi 3 atunci alfabetul va fi rotat la stinga cu 3 pozitii
Plain: Cipher: ABCDEFGHIJKLMNOPQRSTUVWXYZ DEFGHIJKLMNOPQRSTUVWXYZABC

Criptarea:

Decriptarea:

Textul: C A E S A R Criptat: f d h v d u

Program in C++:

#include "stdafx.h" #include <iostream> #include <string> using namespace std; char encrypted[26]=""; char* alphabeat = "abcdefghijklmnopqrstuvwxyz"; void Encrypted(char* plaintext,int a, int b) { for( int i=0; i < strlen(plaintext); i++) for(int j=0; j < 26; j++) { if(plaintext[i]==alphabeat[j]) { encrypted[i] = alphabeat[(a*j + b)%26]; cout<<encrypted[i]; } } } int findInverse(int a) { int x = 2;

do{ x++; }while(!(((a*x)%26)==1)); return x; } void Decrypted(int a,int b) { int x; int decrypted; int aInverse = findInverse(a); for(int i = 0; i < strlen(encrypted); i++) { for(int j = 0; j < 26; j++) { if(encrypted[i]==alphabeat[j])

x = j; } if(aInverse*(x-b)<0) { decrypted = (aInverse*(x-b) *(-1)); decrypted %= 26; decrypted = 26 - decrypted; } else decrypted = aInverse*(x-b) % 26; cout<<alphabeat[decrypted]; } } //----------------------------------------void Caesar(int a,char* plaintext) { cout<<"\nEncrypted text:"<<endl; for( int i=0; i < strlen(plaintext); i++) for(int j=0; j < 26; j++) { if(plaintext[i]==alphabeat[j]) { cout<<alphabeat[(j+a)%26]; plaintext[i]=alphabeat[(j+a)%26]; break; } } cout<<"\nDecrypted text:"<<endl; for(int i=0;plaintext[i]!=0;i++) for(int j=0;j<26;j++) if(plaintext[i]==alphabeat[j]) cout<<alphabeat[(j+26-a)%26]; } int _tmain(int argc, _TCHAR* argv[]) { cout<<"Enter plaintext to be encrypted: "; char plaintext[26] = ""; cin.getline(plaintext,26); cout<<"Enter the key a (The value a must be chosen such that a and 26 are coprime):"; int a; cin>>a;

cout<<"Enter b (less than 26):"; int b; cin>>b; cout<<"Encrypted: "; Encrypted(plaintext,a,b); cout<<endl; cout<<"Decrypted: "; Decrypted(a,b); cout<<"\n"<<endl; cout<<"Caesar Cipher with key "<<a<<endl; Caesar(a,plaintext); cin.ignore(); cin.get(); return 0; }

S-ar putea să vă placă și