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

Chương trình C ++ để triển khai Hill Cypher

Dựa trên đại số tuyến tính Mật mã Hill là một mật mã thay thế đa phương trong mật mã.

Để mã hóa tin nhắn: Chuỗi khóa và chuỗi thông báo được biểu diễn dưới dạng ma trận. Sau đó, chúng được nhân lên, theo mô-đun 26. Ma trận khóa phải có nghịch đảo để giải mã thông điệp.

Để giải mã tin nhắn: Thông điệp được mã hóa được nhân với ma trận khóa nghịch đảo được sử dụng để mã hóa theo modulo 26 để nhận được thông báo giải mã.

Ví dụ

Ma trận khóa

1 0 1
2 4 0
3 5 6

Chuỗi thông báo ‘ABC’ ở dạng ma trận -

0
1
2

Để mã hóa

Sau khi nhân hai ma trận trên, chúng ta nhận được,

2
4
17

Đó sẽ là tin nhắn được mã hóa ‘CER’

Để giải mã

Nghịch đảo của ma trận khóa là -

1.09091 0.227273 -0.181818
-0.545455 0.136364 0.0909091
-0.0909091 -0.227273 0.181818

Bây giờ sau khi nhân ma trận nghịch đảo của ma trận khóa với ma trận thông báo được mã hóa là -

0
1
2

Chuỗi thông báo ban đầu là "ABC".

Đây là một chương trình C ++ để triển khai ví dụ trên.

Thuật toán

Begin
Function getKeyMatrix()
   For i = 0 to 2
      For j = 0 to 3
      Take the elements of matrix a[i][j] as input.
         m[i][j] = a[i][j]
      done
   done
   Take the message string as user input.
   For i = 0 to 2
      msg[i][0] = mes[i] - 65
   done
End
Begin
Function encrypt()
   For i = 0 to 2
      For j = 0 to 0
         For k = 0 to 2
            en[i][j] = en[i][j] + a[i][k] * msg[k][j]
   Take modulo 26 for each element of the matrix obtained by multiplication and print the encrypted message.
End
Begin
Function decrypt()
   Call function inversematrix()
   For i = 0 to 2
      For j = 0 to 0
         For k = 0 to 2
            de[i][j] = de[i][j] + b[i][k] * en[k][j]
Take modulo 26 of the multiplication to get the original message.

Ví dụ

#include<iostream>
#include<math.h>
using namespace std;
float en[3][1], de[3][1], a[3][3], b[3][3], msg[3][1], m[3][3];
void getKeyMatrix() { //get key and message from user
   int i, j;
   char mes[3];
   cout<<"Enter 3x3 matrix for key (should have inverse):\n";
   for(i = 0; i < 3; i++)
   for(j = 0; j < 3; j++) {
      cin>>a[i][j];
      m[i][j] = a[i][j];
   }
   cout<<"\nEnter a string of 3 letter(use A through Z): ";
   cin>>mes;
   for(i = 0; i < 3; i++)
   msg[i][0] = mes[i] - 65;
}
void encrypt() { //encrypts the message
   int i, j, k;
   for(i = 0; i < 3; i++)
   for(j = 0; j < 1; j++)
   for(k = 0; k < 3; k++)
   en[i][j] = en[i][j] + a[i][k] * msg[k][j];
   cout<<"\nEncrypted string is: ";
   for(i = 0; i < 3; i++)
   cout<<(char)(fmod(en[i][0], 26) + 65); //modulo 26 is taken for each element of the matrix obtained by multiplication
}
void inversematrix() { //find inverse of key matrix
   int i, j, k;
   float p, q;
   for(i = 0; i < 3; i++)
   for(j = 0; j < 3; j++) {
      if(i == j)
         b[i][j]=1;
      else
         b[i][j]=0;
   }
   for(k = 0; k < 3; k++) {
      for(i = 0; i < 3; i++) {
         p = m[i][k];
         q = m[k][k];
         for(j = 0; j < 3; j++) {
            if(i != k) {
               m[i][j] = m[i][j]*q - p*m[k][j];
               b[i][j] = b[i][j]*q - p*b[k][j];
            }
         }
      }
   }
   for(i = 0; i < 3; i++)
   for(j = 0; j < 3; j++)
   b[i][j] = b[i][j] / m[i][i];
   cout<<"\n\nInverse Matrix is:\n";
   for(i = 0; i < 3; i++) {
      for(j = 0; j < 3; j++)
      cout<<b[i][j]<<" ";
      cout<<"\n";
   }
}
void decrypt() { //decrypt the message
   int i, j, k;
   inversematrix();
   for(i = 0; i < 3; i++)
   for(j = 0; j < 1; j++)
   for(k = 0; k < 3; k++)
   de[i][j] = de[i][j] + b[i][k] * en[k][j];
   cout<<"\nDecrypted string is: ";
   for(i = 0; i < 3; i++)
   cout<<(char)(fmod(de[i][0], 26) + 65); //modulo 26 is taken to get the original message
   cout<<"\n";
}
int main() {
   getKeyMatrix();
   encrypt();
   decrypt();
}

Đầu ra

Enter 3x3 matrix for key (should have inverse):
1
0
1
2
4
0
3
5
6

Enter a string of 3 letter(use A through Z): ABC

Encrypted string is: CER

Inverse Matrix is:
1.09091 0.227273 -0.181818
-0.545455 0.136364 0.0909091
-0.0909091 -0.227273 0.181818

Decrypted string is: ABC