news 2026/4/18 10:01:21

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/18 3:49:11

政府公告发布:多方言版本同步生成覆盖更广人群

政府公告发布&#xff1a;多方言版本同步生成覆盖更广人群 —— GLM-TTS 技术深度解析 在一场突如其来的社区核酸检测通知中&#xff0c;某南方城市的居民却听到了熟悉的乡音——不是标准普通话&#xff0c;而是带着本地口音的粤语播报&#xff1a;“各位街坊请注意&#xff0c…

作者头像 李华
网站建设 2026/4/17 16:46:39

时序数据库选型避坑指南:一个老工程师的实战心得

为什么要写这篇文章 做了好多年数据相关的工作&#xff0c;这两年被问得最多的问题就是&#xff1a;“我们想上时序数据库&#xff0c;该选哪个&#xff1f;” 说实话&#xff0c;这个问题没有标准答案。但我发现很多团队在选型时踩的坑都差不多&#xff0c;要么是被厂商的PPT忽…

作者头像 李华
网站建设 2026/4/17 23:46:13

【2025最新】基于SpringBoot+Vue的智慧社区居家养老健康管理系统管理系统源码+MyBatis+MySQL

摘要 随着人口老龄化趋势的加剧&#xff0c;智慧社区居家养老健康管理系统的需求日益增长。传统养老模式在资源分配、服务效率及健康监测等方面存在明显不足&#xff0c;难以满足现代社会的养老需求。智慧社区居家养老健康管理系统通过整合物联网、大数据和人工智能技术&#x…

作者头像 李华
网站建设 2026/4/18 3:49:56

阿里云和华为云AI教育产品有哪些创新功能?

阿里云和华为云在AI教育领域推出了多项创新功能&#xff0c;通过大模型技术、智能教学平台和个性化学习系统&#xff0c;为教育行业提供全方位的智能化解决方案。一、阿里云AI教育创新功能1. 通义千问大模型教育应用阿里云基于通义千问大模型打造了Qwen3-Learning学习大模型&am…

作者头像 李华
网站建设 2026/4/18 5:32:31

一站式PHP开发环境搭建指南:集成Apache、MySQL与php

搭建PHP环境是学习Web开发的第一道关卡。本文提供一份经过验证的一站式解决方案&#xff0c;详细演示如何集成Apache服务器、PHP解析引擎和MySQL数据库&#xff0c;并配置phpMyAdmin进行可视化管理。文中包含详细的配置代码、版本推荐和常见问题排查指南&#xff0c;旨在帮助您…

作者头像 李华