news 2026/2/14 3:03:19

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/2/5 8:48:11

播客节目自动化:基于脚本批量生成系列音频内容

播客节目自动化&#xff1a;基于脚本批量生成系列音频内容 在播客行业竞争日益激烈的今天&#xff0c;内容更新频率与制作质量之间的矛盾愈发突出。许多独立创作者面临这样的困境&#xff1a;精心撰写的脚本&#xff0c;却因录音时间长、后期剪辑繁琐而迟迟无法发布&#xff1b…

作者头像 李华
网站建设 2026/2/13 3:40:16

Java SpringBoot+Vue3+MyBatis 足球社区管理系统系统源码|前后端分离+MySQL数据库

摘要 随着互联网技术的快速发展&#xff0c;体育社区平台的用户需求日益增长&#xff0c;传统的足球社区管理系统在用户体验、数据交互和功能扩展性方面存在诸多不足。足球作为全球最受欢迎的体育运动之一&#xff0c;其社区管理系统的智能化、高效化成为研究热点。现代足球社区…

作者头像 李华
网站建设 2026/2/6 10:04:25

【2025最新】基于SpringBoot+Vue的足球社区管理系统管理系统源码+MyBatis+MySQL

摘要 足球作为全球最受欢迎的体育运动之一&#xff0c;拥有庞大的粉丝群体和社区文化。随着互联网技术的快速发展&#xff0c;足球爱好者对线上交流平台的需求日益增长&#xff0c;传统的论坛和社交媒体已无法满足用户对专业化、系统化社区管理的需求。足球社区管理系统旨在为球…

作者头像 李华
网站建设 2026/2/8 12:03:24

课程设计全流程:Multisim仿真电路图实例演示

从零开始做滤波器&#xff1a;用Multisim实战搭建一个有源带通电路你有没有过这样的经历&#xff1f;学完《模拟电子技术》的滤波器章节&#xff0c;公式背了一堆&#xff0c;“虚短”“虚断”张口就来&#xff0c;可一旦要自己设计一个中心频率1kHz、带宽合适、增益稳定的带通…

作者头像 李华
网站建设 2026/2/9 13:10:58

【人工智能通识专栏】第二十五讲:制作幻灯片

【人工智能通识专栏】第二十五讲&#xff1a;制作幻灯片 在上讲中&#xff0c;我们学习了如何用可视化图表让数据和模型结果“会说话”。今天&#xff0c;我们进入AI科创项目展示的“门面”环节——制作幻灯片&#xff08;PPT&#xff09;。在2026年的各类AI竞赛&#xff08;如…

作者头像 李华