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