RSA-OAEP(RSA最优非对称加密填充)算法
RSA-OAEP是一种结合RSA加密和OAEP填充的算法,用于提升RSA的安全性。它通过随机化和哈希函数防止选择密文攻击,并确保明文在加密前满足特定结构。
1. 背景与基本概念
- RSA的弱点:原始RSA加密若直接处理短明文或重复模式,易受攻击(如共模攻击、低指数攻击)。
- OAEP的作用:将明文通过填充扩展为随机化、结构化的消息,避免明文直接暴露于代数性质中。
2. OAEP填充结构
OAEP填充需要以下组件:
- 哈希函数(如SHA-256):生成固定长度的哈希值。
- 掩码生成函数(MGF):通常基于哈希函数,将短种子扩展为任意长度的掩码。
填充过程分为两步:
步骤1:编码明文
假设:
- 明文 \(m\)(长度为 \(k\) 字节)
- 哈希函数输出长度为 \(h\) 字节
- RSA模数 \(n\) 的字节长度为 \(k\),要求 \(k > h + 1\)。
- 生成随机数:随机生成一个 \(h\) 字节的种子 \(r\)。
- 扩展明文:将明文 \(m\) 填充到长度为 \(k - h - 1\) 的字符串 \(PS\)(可能包含零字节)。
- 计算数据块 \(DB\):
\[ DB = Hash(Label) \parallel PS \parallel 0x01 \parallel m \]
其中 \(Label\) 是可选字符串(通常为空),\(Hash(Label)\) 是 \(h\) 字节,\(PS\) 的长度确保 \(DB\) 总长度为 \(k - h - 1\)。
4. 用MGF生成掩码:
\[ mask = MGF(r, k - h - 1) \]
MGF的常见实现是MGF1:多次哈希种子与计数器,拼接结果。
5. 掩码DB:
\[ maskedDB = DB \oplus mask \]
- 掩码种子:
\[ maskedSeed = r \oplus MGF(maskedDB, h) \]
最终编码后的消息为:
\[EM = maskedSeed \parallel maskedDB \]
步骤2:RSA加密
- 将 \(EM\) 转换为整数 \(x\)(大端序)。
- 计算密文:
\[ c = x^e \mod n \]
3. 解密过程
- RSA解密:计算 \(x = c^d \mod n\),将 \(x\) 转换为字节串 \(EM\)。
- 解析EM:分离前 \(h\) 字节为 \(maskedSeed\),剩余部分为 \(maskedDB\)。
- 恢复种子:
\[ r = maskedSeed \oplus MGF(maskedDB, h) \]
- 恢复DB:
\[ DB = maskedDB \oplus MGF(r, k - h - 1) \]
- 验证结构:
- 检查 \(DB\) 的前 \(h\) 字节是否等于 \(Hash(Label)\)。
- 找到 \(DB\) 中第一个 \(0x01\) 字节,其后的部分为明文 \(m\)。
- 若找不到 \(0x01\) 或哈希不匹配,拒绝密文(防止攻击)。
4. 安全性关键点
- 随机性:种子 \(r\) 的随机性确保每次加密结果不同。
- 完整性:哈希和固定分隔符(\(0x01\))确保解密时能验证明文结构。
- MGF的作用:将短种子扩展为长掩码,避免直接处理明文模式。
5. 举例说明
假设明文 \(m = \text{"Hello"}\),使用SHA-256(\(h = 32\)),RSA模数长度为1024位(\(k = 128\) 字节):
- 生成32字节随机种子 \(r\)。
- 构造 \(DB\):
- \(Hash(Label)\) 占32字节(空标签时固定)。
- \(PS\) 填充至 \(128 - 32 - 1 = 95\) 字节,末尾加 \(0x01\) 和明文。
- 通过MGF和异或操作得到 \(EM\),最终加密。
这种设计使得即使明文相同,每次加密也会产生不同的密文,同时能有效抵抗攻击。