Skip to main content

7. Encryption Schemes (加密方案)

对于本文档的目的,加密方案 (Encryption Scheme) 由加密操作和解密操作组成,其中加密操作使用接收方的RSA公钥从消息生成密文,解密操作使用接收方相应的RSA私钥从密文恢复消息.

加密方案可以应用于多种应用场景. 一个典型的应用是密钥建立协议 (Key Establishment Protocol),其中消息包含需要从一方保密传递给另一方的密钥材料. 例如,PKCS #7 [RFC2315] 使用此类协议将内容加密密钥从发送方传递给接收方;本文档定义的加密方案适合在该上下文中作为密钥加密算法使用.

本文档规定了两种加密方案: RSAES-OAEP和RSAES-PKCS1-v1_5. 新应用程序必须 (REQUIRED) 支持RSAES-OAEP; RSAES-PKCS1-v1_5仅为了与现有应用程序兼容而包含.

此处给出的加密方案遵循与IEEE 1363 [IEEE1363] 中使用的类似的通用模型,将加密和解密原语与用于加密的编码方法相结合. 加密操作对消息应用消息编码操作以生成编码消息,然后将其转换为整数消息代表值. 将加密原语应用于消息代表值以生成密文. 反过来,解密操作将解密原语应用于密文以恢复消息代表值,然后将其转换为八位字节串编码消息. 将消息解码操作应用于编码消息以恢复消息并验证解密的正确性.

为了避免与解码操作中处理错误的方式相关的实现弱点(参见 [BLEICHENBACHER] 和 [MANGER]),RSAES-OAEP和RSAES-PKCS1-v1_5的编码和解码操作嵌入在各自加密方案的规范中,而不是在单独的规范中定义. 两种加密方案都与PKCS #1 v2.1中的相应方案兼容.

7.1. RSAES-OAEP

RSAES-OAEP结合了RSAEP和RSADP原语(第5.1节)与EME-OAEP编码方法(本节嵌入). 它基于 [OAEP] 中首次引入的Bellare和Rogaway的最优非对称加密填充 (Optimal Asymmetric Encryption Padding, OAEP) 方法. EME-OAEP是IEEE 1363 [IEEE1363] 中EME-OAEP的单向变体.

该方案不是确定性的:对于给定的公钥和消息,可以生成许多可能的密文.

RSAES-OAEP被推荐用于新应用. RSAES-OAEP可以作为任何应用程序中RSAES-PKCS1-v1_5的首选替代方案.

本方案的安全性基于两个函数的难度: RSA问题和掩码生成函数(Mask Generation Function, MGF)的随机预言模型. 两个函数的安全属性在定理证明中得到体现,该证明显示使用RSAES-OAEP对抗选择密文攻击 (Chosen Ciphertext Attack) 的难度与解决RSA问题的难度本质上一样困难,前提是MGF的行为类似于随机预言 (Random Oracle).

7.1.1. Encryption Operation (加密操作)

RSAES-OAEP-ENCRYPT ((n, e), M, L)

输入 (Input):

  • (n, e): 接收方的RSA公钥 (k表示以八位字节为单位的模数长度)
  • M: 要加密的消息,长度最多为k - 2hLen - 2的八位字节串,其中hLen是哈希函数Hash的输出长度(以八位字节为单位)
  • L: 可选的与加密操作相关联的标签 (Label);默认值为空串

输出 (Output):

  • C: 密文,长度为k的八位字节串

错误 (Errors):

  • "message too long" (消息过长)
  • "label too long" (标签过长)

假设 (Assumption): RSA公钥 (n, e) 是有效的

步骤 (Steps):

  1. 长度检查: 如果L的长度大于输入限制(对于掩码生成函数,该限制为2^61 - 1个八位字节),输出 "label too long" 并停止.

  2. EME-OAEP编码:

    • 如果M的长度大于k - 2hLen - 2个八位字节,输出 "message too long" 并停止.
    • 令lHash = Hash(L),长度为hLen的八位字节串.
    • 生成由k - mLen - 2hLen - 2个零八位字节和单个值为0x01的八位字节组成的填充串PS.
    • 连接lHash, PS, 0x01单字节和消息M形成数据块DB: DB = lHash || PS || 0x01 || M
    • 生成长度为hLen的随机八位字节串seed.
    • 令dbMask = MGF(seed, k - hLen - 1).
    • 令maskedDB = DB ⊕ dbMask.
    • 令seedMask = MGF(maskedDB, hLen).
    • 令maskedSeed = seed ⊕ seedMask.
    • 连接单个值为0x00的八位字节、maskedSeed和maskedDB形成编码消息EM: EM = 0x00 || maskedSeed || maskedDB
  3. RSA加密:

    • 将编码消息EM转换为整数消息代表值m: m = OS2IP(EM)
    • 应用RSAEP加密原语: c = RSAEP((n, e), m)
    • 将密文代表值c转换为长度为k的密文C: C = I2OSP(c, k)
  4. 输出密文C.

7.1.2. Decryption Operation (解密操作)

RSAES-OAEP-DECRYPT (K, C, L)

输入 (Input):

  • K: 接收方的RSA私钥
  • C: 要解密的密文,长度为k的八位字节串,其中k是RSA模数n的长度(以八位字节为单位)
  • L: 可选标签,其值与加密操作期间生成密文时的标签相关联;默认值为空串

输出 (Output):

  • M: 消息,长度最多为k - 2hLen - 2的八位字节串

错误 (Error):

  • "decryption error" (解密错误)

步骤 (Steps):

  1. 长度检查: 如果L的长度大于输入限制,输出 "decryption error" 并停止. 如果密文C的长度不是k个八位字节(或k < 2hLen + 2),输出 "decryption error" 并停止.

  2. RSA解密:

    • 将密文C转换为整数密文代表值c: c = OS2IP(C)
    • 应用RSADP解密原语: m = RSADP(K, c). 如果RSADP输出 "ciphertext representative out of range",输出 "decryption error" 并停止.
    • 将消息代表值m转换为长度为k的编码消息EM: EM = I2OSP(m, k)
  3. EME-OAEP解码:

    • 令lHash = Hash(L).
    • 将EM分离为单个八位字节Y、长度为hLen的八位字节串maskedSeed和长度为k - hLen - 1的八位字节串maskedDB: EM = Y || maskedSeed || maskedDB
    • 令seedMask = MGF(maskedDB, hLen).
    • 令seed = maskedSeed ⊕ seedMask.
    • 令dbMask = MGF(seed, k - hLen - 1).
    • 令DB = maskedDB ⊕ dbMask.
    • 将DB分离为长度为hLen的八位字节串lHash'、(可能为空的)填充串PS(由值为0x00的八位字节组成)、单个值为0x01的八位字节和消息M: DB = lHash' || PS || 0x01 || M. 如果没有值为0x01的八位字节来分隔PS和M,如果lHash不等于lHash',或如果Y非零,则输出 "decryption error" 并停止.
  4. 输出消息M.

注意: 应谨慎实现,以避免实现无意中向对手提供有用信息. 特别是,错误消息不应透露EM中的八位字节或DB中的其他八位字节是否不是预期形式.

7.2. RSAES-PKCS1-v1_5

RSAES-PKCS1-v1_5结合了RSAEP和RSADP原语(第5.1节)与EME-PKCS1-v1_5编码方法. 它被包含仅是为了与现有应用程序兼容;对于新应用程序,推荐使用RSAES-OAEP.

RSAES-PKCS1-v1_5的安全性依赖于RSA问题的难度. 已知可能的弱点(参见[BLEICHENBACHER]),因此新应用程序应使用RSAES-OAEP.

7.2.1. Encryption Operation (加密操作)

RSAES-PKCS1-V1_5-ENCRYPT ((n, e), M)

输入、输出和步骤与RSAES-OAEP类似,但使用EME-PKCS1-v1_5编码

7.2.2. Decryption Operation (解密操作)

RSAES-PKCS1-V1_5-DECRYPT (K, C)

输入、输出和步骤与RSAES-OAEP类似,但使用EME-PKCS1-v1_5解码

重要安全注意事项: 解密错误消息不应区分不同类型的错误,以防止 Bleichenbacher 选择密文攻击.