news 2026/5/1 9:44:01

C++:Hill密码加解密算法(附带源码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++:Hill密码加解密算法(附带源码)

项目背景详细介绍

在密码学的发展历史中,Hill 密码(Hill Cipher)是一种非常经典的多字母代换密码,由美国数学家Lester S. Hill于 1929 年提出。

与凯撒密码、维吉尼亚密码等逐字符加密算法不同,Hill 密码的核心思想是:

将明文分组后,用矩阵乘法进行整体加密

这使得 Hill 密码在当时具备了较强的抗频率分析能力,是线性代数首次大规模应用于密码学的代表算法


Hill 密码在教学与工程中的意义

虽然 Hill 密码在现代密码学中已经不具备实际安全性,但它依然具有非常重要的价值:

  1. 密码学课程的经典算法

  2. 线性代数 + 编程的最佳结合示例

  3. 面试中常见的“矩阵密码”考点

  4. 理解现代分组密码思想的基础

👉一句话总结
Hill 密码不是为了“安全”,而是为了让你真正理解密码学的数学本质


项目需求详细介绍

一、基础功能需求

  1. 实现 Hill 密码加密算法

  2. 实现 Hill 密码解密算法

  3. 支持任意 2×2 或 3×3 密钥矩阵

  4. 支持英文字母明文(A-Z)


二、进阶功能需求

  1. 自动补齐明文长度

  2. 支持模 26 运算

  3. 检查密钥矩阵是否可逆

  4. 代码结构清晰,适合教学


三、加密模型说明

  • 字符集:A-Z0-25

  • 运算规则:模 26

  • 分组长度:等于密钥矩阵阶数


相关技术详细介绍

一、Hill 密码数学原理

1. 明文向量表示

将明文按分组转换为向量:

"ACT" → [0, 2, 19]^T


2. 密钥矩阵

例如 3×3 密钥矩阵:

| 6 24 1 | | 13 16 10 | | 20 17 15 |


3. 加密公式

C = K × P (mod 26)


4. 解密公式

P = K⁻¹ × C (mod 26)


二、关键难点

  1. 矩阵求逆(模 26)

  2. 行列式是否与 26 互质

  3. 模逆元的计算

👉 这是 Hill 密码实现的技术核心。


三、模逆元说明

若:

a × a⁻¹ ≡ 1 (mod 26)

a⁻¹a在模 26 下的逆元。


实现思路详细介绍

一、整体实现流程

加密流程

  1. 明文转换为数字

  2. 按矩阵阶数分组

  3. 矩阵乘法

  4. 模 26

  5. 转换回字符


解密流程

  1. 计算密钥矩阵逆矩阵

  2. 密文转换为数字

  3. 矩阵乘法

  4. 模 26

  5. 转换回字符


二、设计原则

  1. 数学逻辑清晰

  2. 步骤显式实现

  3. 不依赖第三方库

  4. 教学友好优先


完整实现代码

/********************************************************* * 文件名:HillCipher.cpp * 功能:Hill 密码加密与解密完整实现 * 说明:支持 2x2 / 3x3 密钥矩阵,模 26 *********************************************************/ #include <iostream> #include <vector> #include <string> using namespace std; const int MOD = 26; /** * 求 a 在 mod 下的逆元 */ int modInverse(int a, int mod) { a = (a % mod + mod) % mod; for (int x = 1; x < mod; x++) { if ((a * x) % mod == 1) return x; } return -1; } /** * 矩阵乘法(mod 26) */ vector<int> multiply( const vector<vector<int>>& mat, const vector<int>& vec) { int n = vec.size(); vector<int> result(n, 0); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { result[i] += mat[i][j] * vec[j]; } result[i] %= MOD; } return result; } /** * 计算 2x2 矩阵的逆矩阵(mod 26) */ vector<vector<int>> inverse2x2( const vector<vector<int>>& m) { int det = (m[0][0] * m[1][1] - m[0][1] * m[1][0]) % MOD; int invDet = modInverse(det, MOD); vector<vector<int>> inv(2, vector<int>(2)); inv[0][0] = m[1][1] * invDet % MOD; inv[0][1] = -m[0][1] * invDet % MOD; inv[1][0] = -m[1][0] * invDet % MOD; inv[1][1] = m[0][0] * invDet % MOD; for (auto& row : inv) for (int& x : row) x = (x % MOD + MOD) % MOD; return inv; } /** * Hill 加密 */ string encrypt( const string& text, const vector<vector<int>>& key) { int n = key.size(); string result; for (size_t i = 0; i < text.size(); i += n) { vector<int> block(n, 23); // 用 X 填充 for (int j = 0; j < n && i + j < text.size(); ++j) { block[j] = text[i + j] - 'A'; } vector<int> cipher = multiply(key, block); for (int x : cipher) result += char(x + 'A'); } return result; } /** * Hill 解密 */ string decrypt( const string& cipher, const vector<vector<int>>& invKey) { int n = invKey.size(); string result; for (size_t i = 0; i < cipher.size(); i += n) { vector<int> block(n); for (int j = 0; j < n; ++j) { block[j] = cipher[i + j] - 'A'; } vector<int> plain = multiply(invKey, block); for (int x : plain) result += char(x + 'A'); } return result; } /** * 测试主函数 */ int main() { vector<vector<int>> key = { {3, 3}, {2, 5} }; string plain = "HELLO"; cout << "明文: " << plain << endl; string cipher = encrypt(plain, key); cout << "密文: " << cipher << endl; vector<vector<int>> invKey = inverse2x2(key); string decrypted = decrypt(cipher, invKey); cout << "解密: " << decrypted << endl; return 0; }

代码详细解读

1.modInverse

  • 计算整数在模 26 下的乘法逆元

  • 是矩阵求逆的关键函数


2.multiply

  • 实现矩阵与向量的乘法

  • 用于加密与解密核心运算


3.inverse2x2

  • 计算 2×2 密钥矩阵的逆矩阵

  • 包含行列式与模逆元计算


4.encrypt

  • 将明文分组

  • 执行矩阵乘法

  • 生成密文字符序列


5.decrypt

  • 使用逆矩阵恢复明文

  • 验证加密正确性


项目详细总结

通过本项目,你可以完整掌握:

  1. Hill 密码的数学原理

  2. 矩阵密码的编程实现

  3. 模运算与逆元概念

  4. 密码学中线性代数的应用

这是一个:

  • 密码学经典入门算法

  • 数学与编程结合的典范

  • 面试与课堂的高价值示例

  • 现代分组密码的思想源头


项目常见问题及解答

Q1:为什么密钥矩阵必须可逆?


否则无法解密,系统不可逆。


Q2:为什么模 26?


因为英文字母共 26 个。


Q3:Hill 密码安全吗?


不安全,但教学价值极高。


扩展方向与性能优化

一、功能扩展方向

  1. 支持 3×3 / n×n 矩阵

  2. 自动检查密钥合法性

  3. 支持小写字母

  4. 支持文件加解密


二、工程与算法扩展

  1. 高斯消元求逆矩阵

  2. 通用模逆矩阵模板

  3. 与 AES 分组思想对比

  4. 攻击示例(已知明文攻击)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 10:59:52

生日祝福视频:朋友声音合成专属问候语特效

生日祝福视频&#xff1a;朋友声音合成专属问候语特效 在一场无法到场的生日派对上&#xff0c;一段熟悉的声音响起&#xff1a;“小美&#xff0c;还记得我们第一次逃课去看海吗&#xff1f;今天你又长大了一岁&#xff0c;但在我眼里&#xff0c;你还是那个敢追公交车的疯丫头…

作者头像 李华
网站建设 2026/5/1 7:23:50

Windows批处理脚本:非技术人员也能批量生成音频

Windows批处理脚本&#xff1a;非技术人员也能批量生成音频 在教育机构忙着为视障学生录制教材、媒体公司争分夺秒制作有声新闻的今天&#xff0c;一个现实问题摆在面前&#xff1a;如何让没有编程基础的普通人&#xff0c;也能高效地用AI生成高质量语音&#xff1f;这不仅是技…

作者头像 李华
网站建设 2026/5/1 8:30:50

RS232通信中的地线作用深度剖析

地线不是“配角”&#xff1a;RS232通信中你不可忽视的电平命脉在嵌入式开发和工业现场&#xff0c;我们常会遇到这样的情形&#xff1a;两台设备明明接好了TX、RX&#xff0c;串口调试工具也打开了&#xff0c;但数据就是收不到&#xff1b;或者偶尔能通&#xff0c;一开机大功…

作者头像 李华
网站建设 2026/5/1 8:30:42

插件生态构建:支持Chrome扩展等形式灵活调用

插件生态构建&#xff1a;支持Chrome扩展等形式灵活调用 在智能浏览器插件日益成为人机交互“轻入口”的今天&#xff0c;用户不再满足于简单的网页翻译或广告拦截功能。他们希望浏览器能真正“听懂”内容、“说出”情感——比如让新闻播报带上亲人的声音&#xff0c;让电子书朗…

作者头像 李华