现代密码学是基于密钥安全的(毕竟密码算法是公开的),经过权威机构认证的密码算法都是安全的,故而密钥的安全在很大程度上决定了密码体系的安全。如此以来,通过攻击来获取密钥便成了获取明文最直接的方式。接下来我们介绍4种常用的加密攻击方法,看看它们是如何得到密钥的!
加密算法就像保险箱,但黑客总有办法找到漏洞。本文将用电影级比喻+真实漏洞案例,拆解密码学中经典的四大攻击模式,让你彻底看懂黑客的“撬锁秘籍”。
一、唯密文攻击(Ciphertext Only Attack):蒙眼开锁大师
原理
- 攻击条件:黑客只有密文,不知道任何明文或密钥(最弱攻击条件,但难度最高)。
- 类比场景:给你一段外星文字,要求破译其语言规律。
真实案例
- 二战恩尼格玛密码机:盟军通过统计密文中字母频率(如德语中"E"出现最多),破解德军通信。
- WEP无线加密破解:利用RC4算法弱点,收集足够多的密文后反推密钥。
技术演示(凯撒密码暴力破解)
def caesar_brute_force(ciphertext):
for shift in range(26):
plaintext = ''.join([chr((ord(c) - ord('A') - shift) % 26 + ord('A'))
if c.isupper() else c for c in ciphertext])
print(f"Shift {shift}: {plaintext}")
caesar_brute_force("KHOR") # 尝试所有偏移量,最终发现shift=3时解密为"HELO"
防御方案
- 使用现代强加密算法(如AES-256)
- 增加随机性(如初始化向量IV)
二、已知明文攻击(Known Plaintext Attack):间谍的“密码字典”
可以通过如下场景来简单理解,比如我们在敌方内部能够安插一个间谍,虽然这个间谍地位无法接触到绝密资料,但可以“正常”发出一些不太重要的“密文”被敌方截获。这样我们就知道了一些不重要密文的准确内容(已知明文),时情形就与上面(唯密文攻击)有了变化,即已知密文、已知明文、已知算法,求加密密钥。也就是通过已知明文攻击我们刻意制造了获得密钥的可能性。
原理
- 攻击条件:黑客掌握部分明文-密文对(相比唯密文攻击,攻击者可获得更多的信息),可用于破解其他密文。
- 类比场景:已知"APPLE"对应密文"XQQZH",破解"XQQZHL"的含义。
已知明文攻击的核心在于利用系统设计或人为操作中的“可预测性”,最终绕过加密保护。
经典案例
- Zip加密文件破解:利用文件头固定格式(如"PK\x03\x04"表示ZIP压缩包),反推加密密钥。
- HTTPS流量解密:若已知某个页面的HTML结构(如登录按钮ID),可针对性分析加密流量。
实战:DES算法漏洞利用
DES算法因密钥长度短(56位),已知明文对时可在数小时内破解:
# 使用John the Ripper工具破解
john --format=des --wordlist=passwords.txt hashes.txt
防御方案
- 使用带随机盐值的加密模式(如CBC模式)
- 定期更换密钥
三、选择明文攻击(Chosen Plaintext Attack):定制钥匙模具
已知明文攻击(KPA)是指攻击者拥有一些明文和对应的密文,但这些信息不一定是攻击者需要的,也就是说即使有这些明密文对,可能无法直接破解密钥或找到规律。而选择明文攻击(CPA)时,攻击者可以主动选择任意明文并获取对应的密文,这样攻击者可以更有针对性地构造输入,从而更快地分析出加密算法的弱点。
原理
- 攻击条件:黑客可任意选择明文并获取对应密文(常见于公钥加密系统)。
- 类比场景:让锁匠制作100把钥匙模具(密钥库),通过测试找出能开锁的那把(加密密钥)。
通过对敌方算法的大量研究分析,如果对方加密一些特定的内容,根据其密文,就可以知道密钥。
比如,将某种算法用大量不同的密钥加密“你好”等术语,生成一个特定的数据库。这样一旦敌方加密了这些内容,就相当于将密钥直接告诉对方。
选择明文攻击创造了更高概率和更加方便得到密钥的条件。然而随着技术的发展,选择明文攻击这种古老的攻击手段已经无法奏效了。
核弹级案例:RSA选择明文攻击
若使用RSA加密时未填充(即"教科书式RSA"),攻击者可构造特殊明文获取密钥:
- 选择明文
p = 2
,获取密文c = 2^e mod N
; - 计算
gcd(c, N)
可能得到私钥。
代码漏洞示例(Python危险写法)
# 危险!直接对明文进行幂运算
def unsafe_rsa_encrypt(p, e, n):
return pow(p, e, n)
# 应使用OAEP填充
from Crypto.Cipher import PKCS1_OAEP
cipher = PKCS1_OAEP.new(public_key)
ciphertext = cipher.encrypt(p)
防御方案
- 强制使用填充方案(如RSA-OAEP)
- 禁用ECB等确定性加密模式
四、选择密文攻击(Chosen Ciphertext Attack):欺骗解密黑盒
CCA攻击是指攻击者能够获得对解密机的访问权限,通过选择对攻击有利的特定密文及其对应的明文,求解密钥或从截获的密文求解相应明文的密码分析方法。
原理
- 攻击条件:黑客可提交任意密文给系统并获得解密结果(最高权限攻击,因为获得了解密机的访问权限)。
- 类比场景:给保险箱客服打电话,谎称忘记密码,通过客服反馈调整猜测。
选择明文攻击、选择密文攻击分别已知加密黑盒、解密黑盒,分别根据明文、密文缩小破解范围,再进行穷举破解得到加密密钥。
史诗级漏洞:Padding Oracle攻击
- 攻击目标:AES-CBC等使用填充的加密模式;
- 攻击步骤:
- 发送篡改的密文块C’给服务器;
- 根据服务器返回的"Padding Error"调整攻击;
- 逐字节破解明文。
Padding Oracle攻击原理:CBC模式解密时需验证填充字节。若服务器返回“填充错误”与“解密错误”的不同响应,攻击者可利用此差异恢复明文。
PoC代码片段:
def pad_oracle_attack(ciphertext):
for i in range(256):
modified_cipher = ciphertext[:-16] + xor(ciphertext[-16:], i)
if send_to_server(modified_cipher) != "Padding Error":
return i # 成功破解一个字节
防御方案
- 使用认证加密(AEAD,Authenticated Encryption with Associated Data)如AES-GCM;
- 统一返回错误信息(不泄露具体错误类型)
总结:四大攻击防御矩阵
前两种攻击方式(唯密文攻击、已知明文攻击)只能被动等待,因为他们无法得知加密机和解密机,无法自己构造明密文对。虽然更容易执行攻击,但攻破的难度也比较高。
后两种攻击方式(选择明文攻击、选择密文攻击)是主动攻击,他们可以主动提供相关的明文或者密文,得到对应的密文或者明文,虽然攻破的难度变低了,但却加大了执行攻击的难度(因为要获得加密机和解密机的权限)。
CCA攻击中,虽然攻击者可以获得解密机,但是解密机有一个限制,你不能直接使用想要解密的密文,否则就变成社会工程学攻击了。
从攻击者执行攻击的难度来看:
唯密文攻击(COA) < 已知明文攻击(KPA) < 选择明文攻击(CPA) < 选择密文攻击(CCA)
从攻击者攻破密码方案的难度来看:
唯密文攻击(COA) > 已知明文攻击(KPA) > 选择明文攻击(CPA) > 选择密文攻击(CCA)
攻击类型 | 关键防御手段 | 推荐技术方案 |
---|---|---|
唯密文攻击(COA) | 强算法+密钥复杂度 | AES-256, ChaCha20 |
已知明文攻击(KPA) | 随机化加密输出 | CBC+随机IV, HMAC |
选择明文攻击(CPA) | 标准化填充方案 | RSA-OAEP, PKCS#7 |
选择密文攻击(CCA) | 认证加密+错误隐藏 | AES-GCM, 抗CCA算法 |
实战指南:开发者自查清单
- 是否使用ECB模式? → 立即改为CBC或GCM;
- RSA是否带填充? → 确认使用OAEP而非"裸"RSA;
- 错误提示是否统一? → 所有解密错误返回相同信息;
- 密钥是否足够随机? → 使用
secrets
模块而非random
安全警句:
加密不是“魔法”——错误的使用方式会让最坚固的算法变成“纸门”。理解攻击模型,才能设计出真正安全的系统。
互动话题:
你在项目中遇到过哪种加密攻击?欢迎留言分享你的“抗攻击”经验!
关注我,带你用“人话”读懂技术硬核! 🔥