ヒルサイファーを実装するためのC++プログラム
線形代数に基づくヒル暗号は、暗号化におけるポリグラフィック換字式暗号です。
メッセージを暗号化するには: キー文字列とメッセージ文字列は、マトリックス形式で表されます。次に、それらはモジュロ26に対して乗算されます。メッセージを復号化するには、キー行列に逆行列が必要です。
メッセージを復号化するには: 暗号化されたメッセージに、モジュロ26に対する暗号化に使用される逆キーマトリックスを掛けて、復号化メッセージを取得します。
例
キーマトリックス
1 0 1 2 4 0 3 5 6
マトリックス形式のメッセージ文字列「ABC」-
0 1 2
暗号化用
上記の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
-
AVLツリーを実装するためのC++プログラム
AVLツリーは自己平衡二分探索木であり、左右のサブツリーの高さの差がすべてのノードで複数になることはありません。 ツリーの回転は、AVLツリーの要素の順序を妨げることなく構造を変更する操作です。ツリー内で1つのノードを上に移動し、1つのノードを下に移動します。これは、ツリーの形状を変更したり、小さいサブツリーを下に移動したり、大きいサブツリーを上に移動したりして高さを低くしたりするために使用され、多くのツリー操作のパフォーマンスが向上します。回転の方向は、木のノードが移動する側に依存しますが、他の人は、どの子がルートの場所をとるかに依存すると言います。これは、AVLツリーを実装するためのC+
-
STLにSet_Symmetric_differenceを実装するC++プログラム
これは、set_symmetric_differenceを実装するためのC++プログラムです。 2つのセットの対称差は、一方のセットには存在するが、もう一方のセットには存在しない要素によって構築されます。 一般的な集合演算は-です セットユニオン 交差点を設定 対称集合の差または排他的論理和 差または減算を設定 アルゴリズム Begin Declare set vector v and iterator st. Initialize st = set_symmetric_difference (set1, set1 + n, set2, se