对称加密与攻击案例分析
字数 1657 2025-08-18 11:38:41
对称加密与攻击案例分析教学文档
一、对称加密概述
对称加密算法分为两类:
- 对称加密:通信双方共享相同密钥
- 非对称加密:使用公钥/私钥对
对称加密通常与非对称加密结合使用:用对称加密加密明文,再用非对称加密加密对称密钥。
对称加密分类
-
流加密(Stream Ciphers):
- 逐字节加密数据
- 示例:RC4算法
- 原理:以密钥为种子产生随机数序列,与明文逐字节异或
-
块加密(Block Ciphers):
- 逐块加密数据(常见块大小:128位、256位)
- 示例:AES、DES、3DES、Towfish
- 需要填充(Padding)对齐块边界
填充(Padding)
PKCS#7填充方式:
- 不论数据是否对齐块边界都进行填充
- 填充内容为填充字节数
- 示例(块大小8字节):
- 'AAAAAAA' + '\x01'
- 'AAAAAA' + '\x02\x02'
- 'AA' + '\x06'*6
- 'A' + '\x07'*7
- '\x08'*8
二、块加密模式
1. ECB模式(Electronic CodeBook)
- 每个明文块独立加密
- 相同明文块产生相同密文块
- 缺陷:泄露明文模式信息(如图像加密后仍可见轮廓)
2. CBC模式(Cipher-Block Chaining)
- 每个明文块加密前与前一个密文块异或
- 第一个块使用初始化向量(IV)异或
- 特性:翻转一个密文块的某一位,会导致下一个明文块相同位翻转
三、常见攻击案例分析
1. 流加密密钥重用攻击(Stream Cipher Reuse Attack)
原理:
- 相同密钥K生成相同随机序列C
- E(A) = A xor C
- E(B) = B xor C
- E(A) xor E(B) = A xor B
- 已知B时可计算A = E(A) xor E(B) xor B
防御:
- 不重用流加密密钥
- 加密前将密钥与随机数nonce组合
2. ECB块重排攻击
原理:
- ECB模式下块独立加密
- 攻击者可重排密文块组合成合法新密文
示例:
- 假设cookie格式:
admin=0;username=pan@@@@ - 设置用户名为
pan@@@@admin=1; - 加密后将包含
admin=1;的块替换原始admin=0;块
防御:
- 加密后添加MAC校验
- 注意:应先加密后MAC,顺序相反可能导致安全问题
3. CBC Padding Oracle攻击
前提条件:
- 使用CBC模式和PKCS#7填充
- 服务器对不同填充状态返回不同响应
攻击步骤:
-
解密最后一个字节:
- 修改前一个密文块(C1)的最后一个字节
- 当服务器返回填充有效时:
- P2[15] = 0x01
- 计算I2[15] = P2[15] xor C1'[15]
- 原始P2[15] = I2[15] xor C1[15]
-
解密前一个字节:
- 固定C1[15]使P2[15]=0x02
- 爆破C1[14]直到填充有效
- 计算I2[14] = 0x02 xor C1'[14]
- 原始P2[14] = I2[14] xor C1[14]
-
重复过程:
- 从后向前逐字节解密整个块
- 对所有块应用相同方法(除第一个块需特殊处理)
防御:
- 使用加密后MAC
- 对所有错误返回相同响应
- 使用认证加密模式如GCM
四、总结与最佳实践
-
流加密:
- 避免密钥重用
- 结合nonce使用
-
块加密:
- 避免使用ECB模式
- CBC模式需配合MAC
- 对所有错误返回相同响应
-
通用建议:
- 优先使用认证加密模式(如AES-GCM)
- 密钥管理至关重要
- 理解所使用加密算法的基本原理和限制
五、参考实现
Padding Oracle攻击示例代码
(见原文完整Python示例)
关键点回顾
- 流加密密钥重用导致明文泄露
- ECB模式块独立性导致重排攻击
- CBC填充预言攻击利用服务器响应差异
- 所有攻击都源于加密方案使用不当而非算法本身缺陷
通过理解这些攻击原理,可以更好地设计和实现安全的加密系统。