Aspecte teoretice:
Sistemul de cifrare Hill este o metodă de substituție poligrafică bazată pe calcule efectuate în algebra mod p.
În faza de preprocesare delimitatorul de spațiu este ignorat sau înlocuit cu caracterul cel mai puțin frecvent din limba în care este textul clar (în limba română Q).
Algoritmul procesează un bloc de date M de n caractere (litere), cheia de cifrare fiind reprezentată de o matrice K de dimensiune n x n, inversabilă mod p.
Există două subclase ale algoritmului Hill pentru care regulile de cifrare diferă prin ordinea în care se efectuează înmulțirile: o primă subclasă are ca regulă de cifrare operația de înmulțire C=MK cu descifrarea M=CK-1 iar a doua clasă folosește ca regulă de cifrare înmulțirea C=KM având descifrarea corespunzătoare M=K-1C.
Dacă matricea K este simetrică (matricea K și transpusa ei sunt egale) atunci regulile de cifrare pentru cele două subclase sunt echivalente.
În cazul alfabetului latin p=26, cheia de cifrare K trebuie să fie o matrice inversabilă mod 26.
Exemplu:
Să se cifreze mesajul: ”BLAZE OF GLORY”. Algoritmul utilizat este cifrul lui Hill (2×2), cheia de cifrare fiind matricea:
Prin înlocuirea literelor din cheie cu pozițiile corespunzătoare din alfabet (A – 0; B – 1; etc.) se obține:
Textul clar se sparge în blocuri de 2 caractere, care se cifrează pe rând. De exemplu, BL corespunde matricii:
M = ( 1 11)
Diagrama se cifrează în:
Deci, BL se cifrează în GL. Se continuă în mod analog. În final se obține:
GLFSS MPBDT HB.
Implementare:
// CriptareHillCPP.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include<iostream> #include<string> #include<stdio.h> using namespace std; class hill { public: string msg, k; int *enc; int key[3][3], inv[3][3]; hill(string a, string b) { msg = a; k = b; int i, j, l = 0; cout << "\nMatricea Cheie : " << endl; for (i = 0; i<3; i++) { for (j = 0; j<3; j++) { if (l >= k.size()) { key[i][j] = 'x' - 'a' + 1; } else { key[i][j] = k[l] - 'a' + 1; } cout << key[i][j] << " "; l++; } cout << endl; } cout << endl; while (msg.size() % 3 != 0) { msg = msg + 'x'; } cout << "Mesajul extins : "; cout << msg << endl; enc = new int[msg.size()]; } void encrypt() { int i, j, l, m; for (l = 0; l<msg.size();) { m = l; for (i = 0; i<3; i++) { enc[l] = (key[i][0] * (msg[m] - 'a' + 1) + key[i][1] * (msg[m + 1] - 'a' + 1) + key[i][2] * (msg[m + 2] - 'a' + 1)) % 26 + 'a' - 1; cout << (char)enc[l]; l++; } } } }; int main() { string s, k; cout << "Introduceti mesajul de criptat: " << endl; fflush(stdin); getline(cin, s); cout << "Introduceti cheia de criptare: " << endl; fflush(stdin); getline(cin, k); hill h(s, k); cout << endl; cout << "Mesajul criptat este : "; h.encrypt(); cout << endl; system("pause"); }
Rezultat:
poti posta si codul sursa pentru decriptare …multumesc anticipat
LikeLike