news 2026/10/18 21:10:18

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-Z→0-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/10/12 10:40:57

微博话题运营:发起#我的AI声音日记#等互动活动

微博话题运营中的AI声音革命&#xff1a;从#我的AI声音日记#看GLM-TTS的落地实践 在微博热搜榜上&#xff0c;“#我的AI声音日记#”悄然走红。点开活动页面&#xff0c;用户只需录一段几秒钟的语音&#xff0c;就能生成一条“听起来完全像自己”的AI语音日记——语气自然、节奏…

作者头像 李华
网站建设 2026/10/18 0:10:33

接口自动化(四):logging 日志配置 + Allure 测试报告从安装到使用

一、logging⽇志模块 1.1介绍 logging模块核心概念 logging是 Python 标准库的日志工具&#xff0c;核心作用是记录程序运行信息&#xff08;如调试信息、错误、运行状态&#xff09;&#xff0c;支持输出到控制台 / 文件 / 网络等&#xff0c;还能按日志级别过滤信息。 1.…

作者头像 李华
网站建设 2026/10/18 21:09:01

谁才是远程办公的终极利器?2026年七大主流远程控制软件深度对决

一、前言当居家办公的临时通知再次弹出&#xff0c;当你急需调取公司电脑里的那份关键文件&#xff0c;或是为远方的父母解决一个电脑又卡了的难题时&#xff0c;你是否也会陷入这样的困境&#xff1f;- 眼前的远程软件突然连接失败&#xff0c;进度在焦急等待中一分一秒流逝&a…

作者头像 李华
网站建设 2026/10/12 0:31:23

P2P分发试验:探索基于BitTorrent的模型共享新模式

P2P分发试验&#xff1a;探索基于BitTorrent的模型共享新模式 在AI大模型时代&#xff0c;动辄数GB甚至数十GB的模型文件已成为常态。无论是Stable Diffusion的权重包、LLaMA系列的语言模型&#xff0c;还是像GLM-TTS这样的语音合成系统&#xff0c;传统HTTP下载方式早已不堪重…

作者头像 李华
网站建设 2026/10/11 2:46:32

【2025最新】基于SpringBoot+Vue的助农管理系统管理系统源码+MyBatis+MySQL

摘要 随着乡村振兴战略的深入推进&#xff0c;助农管理系统的需求日益增长。传统的农业管理模式效率低下&#xff0c;信息流通不畅&#xff0c;难以满足现代化农业发展的需求。助农管理系统通过整合农业生产、销售、物流等环节&#xff0c;帮助农民提高生产效率&#xff0c;拓宽…

作者头像 李华
网站建设 2026/10/14 18:02:26

前后端分离中小型制造企业质量管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程

摘要 随着制造业数字化转型的加速推进&#xff0c;中小型制造企业对质量管理系统的需求日益增长。传统质量管理模式存在数据孤岛、流程繁琐、实时性差等问题&#xff0c;难以满足现代制造企业对高效、精准、协同管理的需求。本文针对中小型制造企业的特点&#xff0c;设计并实…

作者头像 李华