RSA-OAEP(RSA最优非对称加密填充)算法
字数 1761 2025-11-05 08:30:59

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\)
  1. 生成随机数:随机生成一个 \(h\) 字节的种子 \(r\)
  2. 扩展明文:将明文 \(m\) 填充到长度为 \(k - h - 1\) 的字符串 \(PS\)(可能包含零字节)。
  3. 计算数据块 \(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 \]

  1. 掩码种子

\[ maskedSeed = r \oplus MGF(maskedDB, h) \]

最终编码后的消息为:

\[EM = maskedSeed \parallel maskedDB \]

步骤2:RSA加密

  1. \(EM\) 转换为整数 \(x\)(大端序)。
  2. 计算密文:

\[ c = x^e \mod n \]

3. 解密过程

  1. RSA解密:计算 \(x = c^d \mod n\),将 \(x\) 转换为字节串 \(EM\)
  2. 解析EM:分离前 \(h\) 字节为 \(maskedSeed\),剩余部分为 \(maskedDB\)
  3. 恢复种子

\[ r = maskedSeed \oplus MGF(maskedDB, h) \]

  1. 恢复DB

\[ DB = maskedDB \oplus MGF(r, k - h - 1) \]

  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\) 字节):

  1. 生成32字节随机种子 \(r\)
  2. 构造 \(DB\)
    • \(Hash(Label)\) 占32字节(空标签时固定)。
    • \(PS\) 填充至 \(128 - 32 - 1 = 95\) 字节,末尾加 \(0x01\) 和明文。
  3. 通过MGF和异或操作得到 \(EM\),最终加密。

这种设计使得即使明文相同,每次加密也会产生不同的密文,同时能有效抵抗攻击。

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 \)。 用MGF生成掩码 : \[ mask = MGF(r, k - h - 1) \] MGF的常见实现是MGF1:多次哈希种子与计数器,拼接结果。 掩码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 \),最终加密。 这种设计使得即使明文相同,每次加密也会产生不同的密文,同时能有效抵抗攻击。