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