现代密码学是基于密钥安全的(毕竟密码算法是公开的),经过权威机构认证的密码算法都是安全的,故而密钥的安全在很大程度上决定了密码体系的安全。如此以来,通过攻击来获取密钥便成了获取明文最直接的方式。接下来我们介绍4种常用的加密攻击方法,看看它们是如何得到密钥的!
加密算法就像保险箱,但黑客总有办法找到漏洞。本文将用电影级比喻+真实漏洞案例,拆解密码学中经典的四大攻击模式,让你彻底看懂黑客的“撬锁秘籍”。
一、唯密文攻击(Ciphertext Only Attack):蒙眼开锁大师
原理
-
攻击条件:黑客只有密文,不知道任何明文或密钥(最弱攻击条件,但难度最高)。 -
类比场景:给你一段外星文字,要求破译其语言规律。
真实案例
-
二战恩尼格玛密码机:盟军通过统计密文中字母频率(如德语中"E"出现最多),破解德军通信。 -
WEP无线加密破解:利用RC4算法弱点,收集足够多的密文后反推密钥。
技术演示(凯撒密码暴力破解)
defcaesar_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加密文件破解:利用文件头固定格式(如"PKx03x04"表示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危险写法)
# 危险!直接对明文进行幂运算defunsafe_rsa_encrypt(p, e, n):return pow(p, e, n)# 应使用OAEP填充from Crypto.Cipher import PKCS1_OAEPcipher = 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代码片段:
defpad_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)
|
|
|
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
实战指南:开发者自查清单
-
是否使用ECB模式? → 立即改为CBC或GCM; -
RSA是否带填充? → 确认使用OAEP而非"裸"RSA; -
错误提示是否统一? → 所有解密错误返回相同信息; -
密钥是否足够随机? → 使用 secrets
模块而非random
安全警句:加密不是“魔法”——错误的使用方式会让最坚固的算法变成“纸门”。理解攻击模型,才能设计出真正安全的系统。
原文始发于微信公众号(全栈安全):针对加密密钥的4种攻击全揭秘
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论