news 2026/5/2 19:47:29

别再死记硬背了!用Python代码复现凯撒密码和维吉尼亚密码,5分钟搞懂古典密码学

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再死记硬背了!用Python代码复现凯撒密码和维吉尼亚密码,5分钟搞懂古典密码学

用Python代码复现凯撒密码和维吉尼亚密码:5分钟掌握古典密码学精髓

古典密码学不仅是现代加密技术的基石,更是一把打开计算机安全思维的钥匙。当我们用Python亲手实现这些诞生于两千年前的加密算法时,会发现它们精妙的设计思想至今仍在影响我们的数字安全体系。本文将通过可运行的代码示例,带你穿越时空体验密码学的进化历程。

1. 为什么需要学习古典密码

在量子计算和AES加密成为热点的今天,学习凯撒密码这类"古老玩具"似乎有些不合时宜。但真正做过密码开发的人都知道,理解古典密码的三大价值:

  1. 思维训练:古典密码展现了最纯粹的加密思想,是理解混淆、扩散等现代密码学概念的绝佳入口
  2. 安全启蒙:通过破解这些简单密码,能建立对侧信道攻击、频率分析等技术的直觉认知
  3. 历史传承:维吉尼亚密码的多表替代思想,直接催生了现代流密码的设计范式
# 古典密码与现代密码的传承关系示意 class CipherEvolution: def __init__(self): self.ancient = ["凯撒密码", "维吉尼亚密码"] self.modern = ["AES", "ChaCha20"] def show_lineage(self): return f"{' → '.join(self.ancient)} → 现代{self.modern[1]}流密码"

2. 凯撒密码:轮转的艺术

公元前58年,凯撒大帝用这个简单的字母移位方法保护军事通信。其核心是模运算思想——当字母移动超出范围时,从另一端继续计数。

2.1 加密算法实现

凯撒密码的数学表达为:

  • 加密:E(x) = (x + key) mod 26
  • 解密:D(x) = (x - key) mod 26
def caesar_encrypt(text: str, shift: int) -> str: result = [] for char in text: if char.isupper(): result.append(chr((ord(char) + shift - 65) % 26 + 65)) elif char.islower(): result.append(chr((ord(char) + shift - 97) % 26 + 97)) else: result.append(char) return ''.join(result) # 示例:向右移动3位 plaintext = "ATTACK at dawn" encrypted = caesar_encrypt(plaintext, 3) # 输出:DWWDFN dw gdzq

2.2 安全缺陷与破解演示

凯撒密码的致命弱点在于密钥空间太小(仅25种可能),通过频率分析可以轻松破解:

from collections import Counter def frequency_attack(ciphertext: str): freq = Counter(c for c in ciphertext if c.isalpha()) common_letter = freq.most_common(1)[0][0] # 假设密文中最高频字母对应明文的'e' probable_shift = (ord(common_letter) - ord('e')) % 26 return caesar_encrypt(ciphertext, -probable_shift) # 破解示例 cracked_text = frequency_attack("DWWDFN dw gdzq") # 可能输出原始明文

3. 维吉尼亚密码:多表替代的革命

16世纪法国 cryptographer Blaise de Vigenère 提出的改进方案,通过引入密钥字实现动态位移,有效抵抗了单一字母频率分析。

3.1 加密过程解析

维吉尼亚密码的核心创新在于:

  • 使用关键词作为位移模式
  • 每个明文字母采用不同的位移量
  • 形成周期性多表替代系统
def vigenere_encrypt(text: str, keyword: str) -> str: key_repeated = (keyword * (len(text) // len(keyword) + 1))[:len(text)] result = [] for i, char in enumerate(text): if char.isalpha(): shift = ord(key_repeated[i].upper()) - 65 result.append(caesar_encrypt(char, shift)) else: result.append(char) return ''.join(result) # 使用关键词"KEY"加密 vigenere_encrypt("meet me at midnight", "KEY") # 输出:WIQC WI KE AQVLWIQC

3.2 安全增强与局限

虽然维吉尼亚密码安全性显著提升,但仍有被攻破的可能:

攻击方法原理防御难度
卡西斯基测试寻找重复密文片段推断密钥长度中等
弗里德曼测试统计字母分布偏差较高
已知明文攻击利用部分已知明文-密文对
def find_repeats(ciphertext: str, min_len=3): """卡西斯基测试核心代码""" repeats = {} for i in range(len(ciphertext) - min_len): segment = ciphertext[i:i+min_len] if segment in repeats: repeats[segment].append(i) else: repeats[segment] = [i] return {k:v for k,v in repeats.items() if len(v)>1}

4. 从古典到现代:密码学思维演进

当我们对比这两种古典密码,会发现它们已经蕴含了现代密码设计的核心要素:

凯撒密码的启示

  • 算法公开性(Kerckhoffs原则雏形)
  • 密钥保密的重要性
  • 暴力破解的威胁

维吉尼亚密码的贡献

  • 引入密钥扩展概念
  • 多轮变换思想
  • 混淆与扩散的早期实践
# 现代密码学中的维吉尼亚思想变体 class ModernVigenere: def __init__(self, key): self.key = self._key_expansion(key) def _key_expansion(self, key): """类似AES的密钥扩展算法""" return key * 4 # 简化的示例 def encrypt(self, plaintext): # 模拟CTR模式加密 return bytes([p ^ k for p,k in zip(plaintext, self.key)])

5. 动手实验:构建完整加密系统

让我们综合运用两种古典密码,创建一个增强版加密方案:

  1. 先用维吉尼亚密码混淆明文结构
  2. 再用凯撒密码进行二次加密
  3. 添加简单的校验机制
class EnhancedCipher: def __init__(self, vigenere_key: str, caesar_shift: int): self.v_key = vigenere_key self.c_shift = caesar_shift def encrypt(self, text: str) -> str: # 第一阶段:维吉尼亚加密 stage1 = vigenere_encrypt(text, self.v_key) # 第二阶段:凯撒加密 stage2 = caesar_encrypt(stage1, self.c_shift) # 添加校验值(简单示例) checksum = sum(ord(c) for c in stage2) % 100 return f"{stage2}${checksum:02d}" def decrypt(self, ciphertext: str) -> str: # 验证校验和 msg, checksum = ciphertext.rsplit('$', 1) if sum(ord(c) for c in msg) % 100 != int(checksum): raise ValueError("Checksum mismatch!") # 逆向解密 stage1 = caesar_encrypt(msg, -self.c_shift) return vigenere_encrypt(stage1, self.v_key) # 维吉尼亚解密与加密相同

在实际项目中测试这个混合加密器:

cipher = EnhancedCipher("SECRET", 5) encrypted = cipher.encrypt("Top secret message") decrypted = cipher.decrypt(encrypted) # 应恢复原始明文

通过这个实验,我们可以直观感受到:现代加密算法本质上都是在解决古典密码暴露出的安全问题,只是数学复杂度更高、实现机制更精密。

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

通过 API Key 管理与访问控制功能精细化管控团队资源使用

通过 API Key 管理与访问控制功能精细化管控团队资源使用 1. 团队 API Key 管理的基本场景 在企业级大模型应用开发中,团队通常需要多个 API Key 来区分不同部门或项目的资源使用。Taotoken 控制台提供了完整的 API Key 生命周期管理功能,管理员可以创…

作者头像 李华
网站建设 2026/5/2 19:43:25

告别官方数据集!手把手教你用自定义点云数据训练RandLA-Net(附数据预处理完整代码)

从零构建自定义点云数据集:RandLA-Net实战迁移指南 当我在第一次尝试将激光雷达采集的工地现场数据导入RandLA-Net时,系统报出的KeyError: semantic_kitti错误让我意识到——官方数据集与真实业务数据的鸿沟远比想象中更深。这个在学术界表现优异的点云分…

作者头像 李华
网站建设 2026/5/2 19:38:19

别只刷题了!用这5个心理学模型,真正看懂你的情绪与行为模式

解码情绪与行为:5个心理学模型帮你跳出思维陷阱 1. 情绪ABC模型:重新定义你的情绪触发点 情绪ABC模型由心理学家阿尔伯特艾利斯提出,它彻底改变了我们对情绪反应的理解方式。这个模型将情绪产生过程分解为三个关键环节: A&#xf…

作者头像 李华