Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรม C++ เพื่อใช้งาน Hill Cypher


อิงจากพีชคณิตเชิงเส้น เลขศูนย์ Hill เป็นรหัสแทนที่โพลีกราฟิกในการเข้ารหัส

ในการเข้ารหัสข้อความ: สตริงคีย์และสตริงข้อความแสดงเป็นรูปแบบเมทริกซ์ จากนั้นคูณกับโมดูโล 26 เมทริกซ์คีย์ควรมีผกผันเพื่อถอดรหัสข้อความ

ในการถอดรหัสข้อความ: ข้อความที่เข้ารหัสจะถูกคูณด้วยเมทริกซ์คีย์ผกผันที่ใช้สำหรับการเข้ารหัสกับโมดูโล 26 เพื่อรับข้อความถอดรหัส

ตัวอย่าง

เมทริกซ์คีย์

1 0 1
2 4 0
3 5 6

สตริงข้อความ 'ABC' ในรูปแบบเมทริกซ์ -

0
1
2

สำหรับการเข้ารหัส

หลังจากคูณเมทริกซ์สองตัวแล้วเราจะได้

2
4
17

ซึ่งจะเป็นข้อความเข้ารหัส ‘CER’

สำหรับการถอดรหัส

ค่าผกผันของเมทริกซ์คีย์คือ -

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

ตอนนี้หลังจากคูณเมทริกซ์ผกผันของเมทริกซ์คีย์ด้วยเมทริกซ์ข้อความที่เข้ารหัสแล้วจะเป็น -

0
1
2

ซึ่งสตริงข้อความเดิมคือ 'ABC'

นี่คือโปรแกรม C++ ที่ใช้ตัวอย่างข้างต้น

อัลกอริทึม

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.

ตัวอย่าง

#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();
}

ผลลัพธ์

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