Computer >> Máy Tính >  >> Lập trình >> C ++

Chương trình C ++ để triển khai mật mã liên kết

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