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;
}