Hill 密码简介
Hill 密码是一种多字母代替密码。
Hill 密码要求首先将明文分成同等规模的若干个分组(最后一个分组不足时需要填充),每一个分组被整体加密变换,即 Hill 密码属于分组加密。
Hill 密码算法的基本思想
将每一个分组中的 d 个连续的明文字母通过线性变换(与密钥矩阵相乘),转换为 d个密文字母。
我们输入字符串“paymoremoney”对其进行加密和解密,再配上一个可逆的矩阵,就可以完成这个对称算法,代码如下:
#include <iostream> #include <vector> #include <string> using namespace std; string E(string str) { string res=""; vector<vector<int>> K; vector<int> temp={17,17,5}; K.push_back(temp); temp.clear(); vector<int> temp2={21,18,21}; K.push_back(temp2); temp2.clear(); vector<int> temp3={2,2,19}; K.push_back(temp3); temp3.clear(); for(int i=0;i<4;i++) { int a1=str[i*3+0]-'a'; int b1=str[i*3+1]-'a'; int c1=str[i*3+2]-'a'; cout<<a1<<'\t'<<b1<<'\t'<<c1<<endl; int a2=(a1*K[0][0]+b1*K[1][0]+c1*K[2][0])%26; int b2=(a1*K[0][1]+b1*K[1][1]+c1*K[2][1])%26; int c2=(a1*K[0][2]+b1*K[1][2]+c1*K[2][2])%26; cout<<a2<<'\t'<<b2<<'\t'<<c2<<endl; cout<<"**************************"<<endl; res+='a'+a2; res+='a'+b2; res+='a'+c2; } return res; } string D(string str) { string res=""; vector<vector<int>> K={{4,9,15},{15,17,6},{24,0,17}}; for(int i=0;i<4;i++) { int a1=str[i*3+0]-'a'; int b1=str[i*3+1]-'a'; int c1=str[i*3+2]-'a'; cout<<a1<<'\t'<<b1<<'\t'<<c1<<endl; int a2=(a1*K[0][0]+b1*K[1][0]+c1*K[2][0])%26; int b2=(a1*K[0][1]+b1*K[1][1]+c1*K[2][1])%26; int c2=(a1*K[0][2]+b1*K[1][2]+c1*K[2][2])%26; cout<<a2<<'\t'<<b2<<'\t'<<c2<<endl; cout<<"**************************"<<endl; res+='a'+a2; res+='a'+b2; res+='a'+c2; } return res; } int main() { // vector<vector<int>> K={{'17','17','5'},{'21','18','21'},{'2','2','19'}} ; string str="paymoremoney"; string str2=E(str); cout<<str2<<endl; string str3=D(str2); cout<<str3<<endl; return 0; }