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

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

今天看到这样的一个密码问题。研究了一下简单写了如下代码,由于不太了解求逆矩阵的方法,所以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. }

结果输出:

 

目录
打赏
0
0
0
0
3
分享
相关文章
【Leetcode -796.旋转字符串 -804.唯一摩尔斯密码词】
【Leetcode -796.旋转字符串 -804.唯一摩尔斯密码词】
57 0
初阶OI素数算法——埃拉托尼斯筛
时间复杂度比较优秀且易于理解的素数筛选法
103 0
【洛谷 P1928】外星密码 题解(递归+字符串)
外星密码挑战涉及解压缩由重复子串压缩的字符串,如`[3FUN]`代表`FUNFUNFUN`。输入是一行压缩过的字符串,输出是解压缩的结果。代码使用递归方法,遇到`[`读取重复次数并解压下一层,遇到`]`返回当前层结果,否则直接添加字符。样例输入`AC[3FUN]`输出`ACFUNFUNFUN`。处理的数据限制为解压后长度在20000内,最多十重压缩。
167 0
【力扣·每日一题】372. 超级次方(欧拉降幂 快速幂)
【力扣·每日一题】372. 超级次方(欧拉降幂 快速幂)
112 0
【力扣·每日一题】372. 超级次方(欧拉降幂 快速幂)
每日一题 | LeetCode 454 四数相加Ⅱ
每日一题 | LeetCode 454 四数相加Ⅱ
123 0
每日一题1054:计算素数和
题目描述 输入两个正整数m和n(m<n),求m到n之间(包括m和n)所有素数的和,要求定义并调用函数isprime(x)来判断x是否为素数。
256 0