Trong mật mã Affine, mỗi chữ cái trong bảng chữ cái được ánh xạ tới số tương đương của nó, là một loại mật mã thay thế đơn pha. Mã hóa được thực hiện bằng một hàm toán học đơn giản và được chuyển đổi trở lại thành một chữ cái.
Các chữ cái trong bảng chữ cái có kích thước m lần đầu tiên được ánh xạ tới các số nguyên trong phạm vi 0… m-1, trong mật mã Affine,
'Chìa khóa' cho mật mã Affine bao gồm 2 số, a và b. a nên được chọn tương đối nguyên tố đối với m.
Mã hóa
Để biến đổi số nguyên, nó sử dụng số học mô-đun mà mỗi ký tự bản rõ tương ứng với thành một số nguyên khác tương ứng với một ký tự văn bản mật mã. Chức năng mã hóa cho một chữ cái là
E ( x ) = ( a x + b ) mod m modulus m: size of the alphabet a and b: key of the cipher.
Giải mã
Trong giải mã, hãy chuyển đổi từng ký tự văn bản mật mã thành các giá trị nguyên của chúng. Chức năng giải mã là
D ( x ) = a^-1 ( x - b ) mod m a^-1 : modular multiplicative inverse of a modulo m. i.e., it satisfies the equation 1 = a^-1 mod m.
Đây là một chương trình C ++ để thực hiện quá trình này.
Thuật toán
Begin Function encryption(string m) for i = 0 to m.length()-1 if(m[i]!=' ') c = c + (char) ((((a * (m[i]-'A') ) + b) % 26) + 'A') else c += m[i] return c End Begin Function decryption(string c) Initialize a_inverse = 0 Initialize flag = 0 For i = 0 to 25 flag = (a * i) % 26 if (flag == 1) a_inverse = i done done For i = 0 to c.length() - 1 if(c[i]!=' ') m = m + (char) (((a_inverse * ((c[i]+'A' - b)) % 26)) + 'A') else m = m+ c[i] done End
Ví dụ
#include<bits/stdc++.h> using namespace std; static int a = 7; static int b = 6; string encryption(string m) { //Cipher Text initially empty string c = ""; for (int i = 0; i < m.length(); i++) { // Avoid space to be encrypted if(m[i]!=' ') // added 'A' to bring it in range of ASCII alphabet [ 65-90 | A-Z ] c = c + (char) ((((a * (m[i]-'A') ) + b) % 26) + 'A'); else //else append space character c += m[i]; } return c; } string decryption(string c) { string m = ""; int a_inverse = 0; int flag = 0; //Find a^-1 (the multiplicative inverse of a //in the group of integers modulo m.) for (int i = 0; i < 26; i++) { flag = (a * i) % 26; //Check if (a * i) % 26 == 1, //then i will be the multiplicative inverse of a if (flag == 1) { a_inverse = i; } } for (int i = 0; i < c.length(); i++) { if(c[i] != ' ') // added 'A' to bring it in range of ASCII alphabet [ 65-90 | A-Z ] m = m + (char) (((a_inverse * ((c[i]+'A' - b)) % 26)) + 'A'); else //else append space character m += c[i]; } return m; } int main(void) { string msg = "TUTORIALSPOINT"; string c = encryption(msg); cout << "Encrypted Message is : " << c<<endl; cout << "Decrypted Message is: " << decryption(c); return 0; }
Đầu ra
Encrypted Message is : JQJAVKGFCHAKTJ Decrypted Message is: TUTORIALSPOINT