基于CBC模式的Hill密码实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

在密码分组链接模式(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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值