浅析加密算法四【Hill密码】

一、简介

Hill密码又称希尔密码是运用基本矩阵论原理的替换密码,属于多表代换密码的一种,由 L e s t e r S . H i l l Lester S. Hill LesterS.Hill在1929年发明。

随着科技的日新月异和人们对信用卡、计算机的依赖性的加强,密码学显得愈来愈重要。密码学是一门关于加密和解密、密文和明文的学科。若将原本的符号代换成另一种符号,即可称之为广义的密码。狭义的密码主要是为了保密,是一种防止窃文者得知内容而设的另一种符号文字,也是一般人所熟知的密码。
使用信用卡、网络账号及密码、电子信箱、电子签名等都需要密码。为了方便记忆,许多人用生日、电话号码、门牌号码记做密码,但是这样安全性较差。
为了使密码更加复杂,更难解密,产生了许多不同形式的密码。密码的函数特性是明文对密码为一对一或一对多的关系,即明文是密码的函数。传统密码中有一种叫移位法,移位法基本型态是加法加密系统 C = P + s ( m o d   m ) C=P+s(mod \ m) C=P+s(mod m)。一般来说,我们以 1 1 1 表示 A , 2 A,2 A2 表示 B , … … , 25 B,……,25 B……25 表示 Y Y Y 26 26 26 表示Z,以此类推。由于 s = 0 s=0 s=0 时相当于未加密,而 0 ≤ s ≤ m − 1 0≤s≤m-1 0sm1 s ≥ m s≥m sm 都可用 0 ≤ s ≤ m − 1 0≤s≤m-1 0sm1 取代),因此,整个系统只有 m − 1 m-1 m1 种变化。换言之,只要试过 m − 1 m-1 m1 次,机密的信息就会泄漏出去。
由此看来,日常生活中的密码和传统的密码的可靠性较差,我们有必要寻求一种容易将字母的自然频度隐蔽或均匀化,从而有利于统计分析的安全可靠的加密方法。 希尔密码能基本满足这一要求

二、原理

2.1 Hill加密原理

  • 对于每一个字母,我们将其转化为对应的数字,一般来说我们使用的是 A A A 对应的 0 0 0 B B B 对应的 1 1 1 然后一次类推,当然你也可以自己指定一个字母表,然后一一对应
  • 我们将明文转化为一个 1 1 1 维的向量 (即: 1 × n 1\times n 1×n 的矩阵)
  • 然后我们将这个 1 1 1 维的向量和一个 n × n n\times n n×n 的密钥矩阵相乘,得到一个 1 1 1 维的向量,然后对这个矩阵模上 26 26 26
  • 然后再通过字母表将这个 n n n 维矩阵转化为密文

解密 的话只需要将密文乘上密文矩阵的 逆矩阵 就好啦, Hill 密码能较好地抵抗统计分析法,对抗唯密文攻击的强度较高,但易受到已知明文攻击。破译的难度也会随着矩阵的阶数规模变大变得难以破解

2.2 矩阵求逆原理

在上一篇博客中降到了关于矩阵求逆的高斯消元方法:
传送门:https://acmer.blog.csdn.net/article/details/125012646

三、 举例

我们的明文为:ACM,我们想将其加密,我们得到的一个密钥矩阵如下:
[ 2   1   1 3   2   1 2   1   2 ] \begin{bmatrix} 2 \ 1 \ 1 \\ 3 \ 2 \ 1 \\ 2 \ 1 \ 2 \\ \end{bmatrix} 2 1 13 2 12 1 2

  1. 我们将明文转为一个 1 1 1 维向量:

[ 0   2   12   ] \begin{bmatrix} 0 \ 2 \ 12 \ \end{bmatrix} [0 2 12 ]

  1. 对两个矩阵做一个乘法

[ 0   2   12 ] × [ 2   1   1 3   2   1 2   1   2 ] = [ 30   16   26 ] = [ 4   16   0   ] \begin{bmatrix} 0 \ 2 \ 12\\ \end{bmatrix} \times \begin{bmatrix} 2 \ 1 \ 1 \\ 3 \ 2 \ 1 \\ 2 \ 1 \ 2 \\ \end{bmatrix} =\begin{bmatrix} 30 \ 16 \ 26 \end{bmatrix} =\begin{bmatrix} 4 \ 16 \ 0 \ \end{bmatrix} [0 2 12]× 2 1 13 2 12 1 2 =[30 16 26]=[4 16 0 ]

  1. 将新得到的 1 1 1 维向量按照字母表转化为密文:
    在这里插入图片描述

得到密文:EQA

在这里插入图片描述

四、代码

4.1 加密代码

#include<bits/stdc++.h>
using namespace std;
#define N 100
#define mod 26
struct Matrix{
	int n,m;
	int mp[N][N];
	void init(int n,int m) {
		this->n = n;
		this->m = m;
		for(int i = 0;i <= n; ++i) 
			for(int j = 0;j <= m; ++j)
				mp[i][j] = 0;
	}
};

Matrix mult(Matrix L,Matrix R) {//乘法
	if(L.m != R.n) return L;
	Matrix M;
	M.init(L.n,R.m);
	for(int i = 0;i < L.n; ++i) {
		for(int j = 0;j < R.m; ++j){
			for(int k = 0;k < L.m; ++k) {
				M.mp[i][j] = (M.mp[i][j] + L.mp[i][k] * R.mp[k][j]) % mod;
			}
		}
	}
	return M;
}

void HIll(){
	Matrix a,b;
	string S;
	cout<<"请输入需要加密的明文"<<endl;
	cin>>S;
	transform(S.begin(),S.end(),S.begin(), ::toupper);
	int len = S.size();
	cout<<"请输入"<<len<<"X"<<len<<"的密钥矩阵"<<endl;
	a.init(len,len);
	b.init(1,len);
	
	for(int i = 0;i < len; ++i)
		for(int j = 0;j < len; ++j)
			scanf("%d",&a.mp[i][j]);
	for(int i = 0;i < len; ++i) 
		b.mp[0][i] = int(S[i] - 'A');
	for(int i = 0;i < len; ++i) 
		cout<<b.mp[0][i]<<" \n"[i == len-1];
	
	Matrix c = mult(b,a);
	string ans = "";
	for(int i = 0;i < len; ++i)
		ans += char('A' + c.mp[0][i]);
	cout<<"加密后的密文为:\n"<<ans<<endl;
}


int main()
{
	HIll();
	return 0;
}
/*
ACM
2 1 1
3 2 1
2 1 2

ans = EQA
----------------
ACT
6 24 1
13 16 10
20 17 15	

ans = QRT
----------------
cyber
10 5 12 0 0
3 14 21 0 0
8 9 11 0 0
0 0 0 11 8
0 0 0 3 7
ans = WRTRV
*/

4.2 解密代码

由于矩阵求逆用的是浮点高斯,那么有可能逆矩阵就是一个浮点数或者,所以至于要怎么处理(四舍五入、向上向下取整)就取决于需求者了,所以我这里也就不放出代码了,道理明白就行。

### Hill Cipher 算法概述 Hill Cipher 是一种基于线性代数的多字母替换密码技术,其核心在于通过矩阵运算完成加密和解密过程。该算法的安全性和效率取决于所选矩阵的维度 \( m \),\( m \) 越大,则安全性越高,但计算复杂度也随之上升[^2]。 --- ### 使用 PHP 实现 Hill Cipher 的加密与解密 以下是使用 PHP 编写的一个完整的 Hill Cipher 加密与解密示例代码: #### 准备工作 为了简化实现,假设明文字母表仅包含 A-Z 和忽略大小写的处理方式。同时,定义一个简单的 2×2 可逆矩阵作为密钥。 ```php <?php function modInverse($a, $m) { for ($x = 0; $x < $m; $x++) { if (($a * $x) % $m == 1) { return $x; } } return null; } // 定义字符到数值映射函数 function charToNum($char) { return ord(strtoupper($char)) - ord('A'); } // 数值到字符反向映射函数 function numToChar($num) { return chr(($num % 26) + ord('A')); } // 矩阵乘法并取模 function matrixMultiplyMod($matrix1, $matrix2, $modulus) { $result = []; foreach ($matrix1 as $rowIndex => $row) { $newRow = []; foreach (array_keys(current($matrix2)) as $colIndex) { $sum = 0; foreach ($row as $key => $value) { $sum += ($value * $matrix2[$key][$colIndex]); } $newRow[] = $sum % $modulus; } $result[] = $newRow; } return $result; } // 加密函数 function encryptHillCipher($plaintext, $keyMatrix) { $plaintext = strtoupper(preg_replace('/[^A-Z]/', '', $plaintext)); $length = strlen($plaintext); $blockSize = count($keyMatrix); // 如果文本长度不是 block size 的倍数,填充 X while ($length % $blockSize != 0) { $plaintext .= 'X'; $length++; } $ciphertext = ''; for ($i = 0; $i < $length; $i += $blockSize) { $vector = array_map('charToNum', str_split(substr($plaintext, $i, $blockSize))); $encryptedVector = matrixMultiplyMod([$vector], $keyMatrix, 26)[0]; $ciphertext .= implode('', array_map('numToChar', $encryptedVector)); } return $ciphertext; } // 解密函数 function decryptHillCipher($ciphertext, $keyMatrix) { $blockSize = count($keyMatrix); $det = round(array_sum(array_map(function ($index) use ($keyMatrix) { return pow(-1, $index) * $keyMatrix[0][$index] * $keyMatrix[1][abs(1 - $index)]; }, range(0, $blockSize - 1)))) % 26; $adjugateKey = [ [$keyMatrix[1][1], (-$keyMatrix[0][1])], [(-$keyMatrix[1][0]), $keyMatrix[0][0]] ]; $inverseDet = modInverse($det, 26); if (!$inverseDet) { throw new Exception("The key is not invertible."); } $invKeyMatrix = array_map(function ($element) use ($inverseDet) { return ($element * $inverseDet) % 26; }, $adjugateKey); return encryptHillCipher($ciphertext, $invKeyMatrix); // 利用相同逻辑进行解密 } // 测试数据 $keyMatrix = [[3, 3], [2, 5]]; // 示例可逆矩阵 $plaintext = "HELLO"; try { echo "Plaintext: " . $plaintext . "\n"; $ciphertext = encryptHillCipher($plaintext, $keyMatrix); echo "Ciphertext: " . $ciphertext . "\n"; $decryptedText = decryptHillCipher($ciphertext, $keyMatrix); echo "Decrypted Text: " . $decryptedText . "\n"; } catch (Exception $e) { echo "Error: " . $e->getMessage(); } ?> ``` 上述代码实现了基本的 Hill Cipher 加密与解密功能,并提供了测试样例[^1]。 --- ### 关键点解析 1. **密钥矩阵的选择** 密钥矩阵必须满足两个条件: a. 行列式的绝对值需小于等于 26 并且与 26 互质; b. 需要存在对应的逆矩阵以便于解密操作。 2. **加解密流程** - 明文被分组为固定长度(由密钥矩阵决定),不足部分补充特定字符; - 每一组经过矩阵变换后得到对应密文片段; - 解密则利用密钥矩阵的逆矩阵恢复原始消息。 3. **扩展性** 若希望支持更大范围的消息集或者增强安全性能,可以通过增大密钥矩阵尺寸来提升难度[^3]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MangataTS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值