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