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