逆矩阵在希尔密码中的应用

简介: 逆矩阵在希尔密码中的应用

今天看到这样的一个密码问题。研究了一下简单写了如下代码,由于不太了解求逆矩阵的方法,所以A矩阵的逆矩阵直接给定了。如果有知道求逆矩阵方法的大神方便的话请给指点一下。

1. #include <bits/stdc++.h>
2. using namespace std;
3. int A[3][3]={
4.  {3,0,4},
5.  {7,1,6},
6.  {5,0,9}}; //密钥矩阵
7. int An[3][3]={
8.  {5,0,18},
9.  {25,1,20},
10.   {3,0,19}}; //A矩阵的逆矩阵
11. int n=3,m=4;//n行 m列
12. int B[3][4];
13. int C[3][4];
14. string s_yuan="iamsointoyou";
15. string s_mi="alfottxzwcdb";
16. void Do_B(string s){//将源码转换成数字矩阵
17.   int t=0;
18.   for(int j=0;j<m;j++)
19.     for(int i=0;i<n;i++)
20.       B[i][j]=(s[t++]-'a'+1)%26;
21. }
22. void Do_C(){//将数字矩阵C转换成密码 并输出
23.   for(int j=0;j<m;j++)
24.     for(int i=0;i<n;i++)
25.       if(C[i][j]==0) cout<<'z';
26.   else cout<<(char)(C[i][j]-1+'a');
27.   cout<<endl;
28. }
29. void Mul_GZ(int A[3][3],int B[3][4] ){//加密矩阵 A[][]*B[][]=C[][]
30.   for(int i=0;i<n;i++)
31.     for(int j=0;j<m;j++){
32.     C[i][j]=0;
33.     for(int k=0;k<n;k++)
34.       C[i][j]+=A[i][k]*B[k][j];
35.     C[i][j]%=26;//结果取模26
36.   }
37. }
38. void Prin(int x[][4]){//矩阵输出函数
39.   //矩阵输出
40.   for(int i=0;i<n;i++){
41.     for(int j=0;j<m;j++) cout<<x[i][j]<<" ";
42.     cout<<endl;
43.   }
44. }
45. int main()
46. { 
47.   cout<<"源码:"<<s_yuan<<endl;
48.   Do_B(s_yuan); 
49.   cout<<"源码转换成为数字矩阵B:"<<endl;
50.   Prin(B);//输出矩阵B
51.   Mul_GZ(A,B);//矩阵A*矩阵B=矩阵C
52.   cout<<"矩阵C:"<<endl;
53.   Prin(C);//输出矩阵C
54.   cout<<"将数字矩阵C转换成密码 并输出"<<endl;
55.   Do_C();//将数字矩阵C转换成密码 并输出
56.   cout<<endl;
57.   Do_B(s_mi); 
58.   cout<<"密码转换成为数字矩阵B:"<<endl;
59.   Prin(B);
60.   Mul_GZ(An,B);
61.   cout<<"将数字矩阵C转换成原码 并输出"<<endl;
62.   Do_C();
63.   return 0;
64. }

结果输出:

 

相关文章
|
7月前
线性代数——(期末突击)行列式(下)-行列式按行展开、范德蒙行列式、克拉默法则
线性代数——(期末突击)行列式(下)-行列式按行展开、范德蒙行列式、克拉默法则
250 7
|
8月前
|
算法 测试技术 C++
【数学归纳法 组合数学】容斥原理
【数学归纳法 组合数学】容斥原理
|
8月前
D - 11(逆元好题)
D - 11(逆元好题)
|
算法 搜索推荐 C++
穷举法
穷举法
143 0
穷举法
蓝桥杯:暴力求解四平方和
蓝桥杯:暴力求解四平方和
63 0
|
数据安全/隐私保护
希尔密码(Hill)
希尔密码(Hill)
145 0
【AcWing】差分及其应用
所谓差分,就是前缀和的逆运算
87 0
|
数据安全/隐私保护
变异凯撒题解
变异凯撒题解
174 0
变异凯撒题解