提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
在密码分组链接模式(CBC)下使用hill密码加密解密字符串。
一、希尔密码原理
hill密码原理的介绍可以参考百度,就是矩阵乘法求模运算,建议使用MATLAB实际操作一下会更快明白原理。
二、要求
能够输出算法配置参数以及每一轮加解密结果,明文是超过512bit的有意义的英文句子。
三、注意事项
Hill密码最重要的就是要找到一个可逆方阵,且矩阵的每个元素都是整数,逆矩阵也一样,这样的矩阵其行列式的值为1或者-1。要注意的是在加密矩阵要在模数n下可逆,也就是说n改变了,相应的逆矩阵也要改变。
这里寻找可以矩阵的方法可以参考一篇论文:
[1]徐小华,黎民英.Hill密码加密解密时矩阵的求法[J].电脑与信息技术,2010,18(02):31-33.
前提:要知道找到维数很大的方阵是不容易的,我使用的4*4的方阵就是论文中的一个例子。
四、代码实现
1.编写各种函数
主要就是几个函数:
1.生成初始向量:CBC模式要求
vector<int> generateInitialVector() {
vector<int> temp;
for (int i = 0; i < 4; i++)
temp.push_back(rand() % 128);
return temp;
}
2.明文初始化:使用字符对应的ASCII码进行运算,在加密前存储每个字符的ASCII码
vector< vector<int>> plaintextMatrixInitialization(string plaintext) {
int length = plaintext.size();//size()只包含字符串有效字符
int row = ceil(length / 4.0);
vector< vector<int>> temp(row, vector<int>(4, 0));//n行4列,最末一行不够填充0
for (int i = 0; i < length; i++)
{
//直接存储ascii码
temp[i / 4][i % 4] = (int)plaintext[i];
}
return temp;
}
3.加密函数
//加密
vector< vector<int>> encryption(vector<int> initialVector, vector< vector<int>> plaintextMatrix,
vector<vector <int>> keyMatrix, string& ciphertext) {
vector<vector <int>>encryptedInput(plaintextMatrix.size(),vector<int>(4,0));
vector<vector <int>>temp(plaintextMatrix.size(), vector<int>(4, 0));
//第一行特殊处理异或初始向量
encryptedInput[0] = xorOfRowVector(plaintextMatrix[0], initialVector);
cout << "第01轮加密结果:";
for (int i = 0; i < 4; i++) {
temp[0][i] = temporaryValue(keyMatrix[i], encryptedInput[0]);
cout << setw