来源于我的博客
希尔加密法
根据字典序将字母转化为数字(0-25)
设定密钥矩阵(n*n),将明文转化为r*n的矩阵
将明文矩阵与密钥矩阵相乘即可得到密文矩阵(结果模26),再将其转化为字母即可.
以3*3密钥矩阵为例:(确保密钥矩阵能求逆)
int key[3][3] = {
6,13,20,
24,16,17,
1,10,15
};
假设明文CAT,C=2,A=0,T=19,明文矩阵:(2,0,19)T
则密文矩阵:
[(6,13,20)T(24,16,17)T(1,10,15)T]×(2,0,19)T
=(31,216,325)T=(5,8,13)T(mod 26)
密文:5=F , 8=I, 13=N :FIN
解密:
将密文矩阵×密钥矩阵的逆即可
密文:5=F , 8=I, 13=N :FIN
密钥矩阵的逆:
[(8,21,21)T(5,8,12)T(10,21,8)T]×(5,8,13)T
=(2,0,19)T
即为明文CAT
C++实现(固定矩阵为3*3):
#include#includeusing namespace std;
string f = { "CATCATCAT" };
string alphabet = { "ABCDEFGHIJKLMNOPQRSTUVWXYZ" };
string alphabetl = { "abcdefghijklmnopqrstuvwxyz" };
int key[3][3] = {
6,13,20,
24,16,17,
1,10,15
};
int keyM[3][3] = {
8,21,21,
5,8,12,
10,21,8
};
string reCreateStr(string f) {
string g;
for (int i = 0;i < f.size();i++) {
if ((int)(f[i])>64 && (int)(f[i]) <&nbs