从‘盲猜’到‘开卷考’:实战演示用Python模拟四种密码攻击(附代码)

在信息安全领域,密码分析就像一场攻防博弈。想象你是一名侦探,面对一段加密信息:最初你只能依靠密文本身(唯密文攻击),就像在黑暗中摸索;随着线索增加,你获得了部分明文-密文对应关系(已知明文攻击),如同有了手电筒;再到能够主动构造明文获取对应密文(选择明文攻击),简直就像打开了探照灯;最终甚至能解密特定密文(选择密文攻击),这完全就是开卷考试了。本文将用Python带您亲历这场密码破解的进化之旅,通过可运行的代码演示如何从零开始逐步攻破古典密码。

1. 实验环境与目标设定

1.1 工具准备

我们需要以下Python组件:

import string
from collections import Counter
import matplotlib.pyplot as plt
import numpy as np

1.2 选择攻击目标

维吉尼亚密码 为例,这种多表替换密码比凯撒密码更复杂,能更好展示不同攻击方式的差异。其加密过程可表示为:

def vigenere_encrypt(plaintext, key):
    key_repeated = (key * ((len(plaintext) // len(key)) + 1))[:len(plaintext)]
    return ''.join([chr((ord(p) + ord(k)) % 256) 
                   for p, k in zip(plaintext, key_repeated)])

注意:实际应用中应对字符编码做严格处理,这里简化了实现以便聚焦攻击逻辑

2. 唯密文攻击:黑暗中的密码破译

2.1 频率分析实战

当只有密文时,英语文本的字母频率特征是最有力武器。以下是关键步骤:

  1. 统计密文字符频率分布
  2. 与标准英语频率表对比
  3. 通过卡方检验找出最可能位移量
def frequency_attack(ciphertext):
    freq = Counter(ciphertext)
    english_freq = {'e':12.7%, 't':9.1%, ...} # 标准频率表
    # 计算相关系数找出最佳匹配
    return most_likely_key

2.2 局限性突破

多表替换密码会打乱单字母频率特征,这时需要:

  • 使用 Kasiski测试 推测密钥长度
  • 对相同密钥加密的字母分组分析
  • 结合双字母/三字母组合频率

3. 已知明文攻击:掌握线索的定向突破

3.1 利用已知对应关系

假设我们知道"the"对应密文是"xqk",可以建立方程:

t + k1 ≡ x (mod 26)
h + k2 ≡ q (mod 26)
e + k3 ≡ k (mod 26)

Python实现密钥片段提取:

def known_plaintext_attack(plain_snippet, cipher_snippet):
    return [(ord(c) - ord(p)) % 26 
           for p, c in zip(plain_snippet, cipher_snippet)]

3.2 实战技巧

  • 优先利用高频词(the, and, of等)
  • 结合标点符号等特殊字符定位
  • 使用 重合指数法 验证密钥猜测

4. 选择明文攻击:主动出击的密码分析

4.1 构造特殊明文

精心设计的输入能暴露密钥信息:

输入类型 预期效果
全'a'字符串 直接暴露密钥
重复模式 揭示密钥长度和内容
边界值 测试算法特殊处理逻辑
# 选择明文攻击示例
chosen_plain = 'a' * 100
cipher = vigenere_encrypt(chosen_plain, key)
print("密钥实际为:", cipher[:len(key)])  # 直接显示密钥

4.2 现代加密的防御机制

即使能选择明文,AES等现代算法仍安全,因为:

  • 引入非线性S盒
  • 多轮混淆扩散
  • 密钥与密文无简单数学关系

5. 选择密文攻击:终极测试场

5.1 解密Oracle的实现

模拟能解密特定密文的API:

decryption_oracle_cache = {}

def decryption_oracle(ciphertext):
    if ciphertext not in decryption_oracle_cache:
        decryption_oracle_cache[ciphertext] = vigenere_decrypt(ciphertext, key)
    return decryption_oracle_cache[ciphertext]

5.2 攻击策略

  1. 构造特殊密文(如全零)
  2. 观察解密结果
  3. 反向推导密钥关系
  4. 通过错误信息获取侧信道数据

6. 防御措施与最佳实践

6.1 密码选择建议

算法类型 抗攻击能力 适用场景
AES-GCM 抵抗所有四种攻击 现代通信加密
ChaCha20-Poly1305 CPA/CCA安全 移动设备加密
RSA-OAEP CCA安全 密钥交换

6.2 关键防护原则

  • 永远不要自创加密算法
  • 使用标准库而非自行实现
  • 定期更新密钥材料
  • 实施完整的加密-认证方案

在真实渗透测试中,我们曾遇到一个使用自定义加密的IoT设备。通过选择明文攻击,仅发送20组特定数据就成功推导出密钥结构。这再次验证了Kerckhoffs原则:安全性应仅依赖于密钥的保密,而非算法的保密。

更多推荐