PKCS 中的块编码格式

Block Encoding format in PKCS

在 RSA 的 PKCS 块编码格式中,块类型 01 和 02 有什么区别?什么时候使用它们?

来自 https://www.rfc-editor.org/rfc/rfc2313#section-8.1(感谢 James):

8.1 Encryption-block formatting

块类型BT,填充字符串PS,数据D为 格式化为八位字节串EB,即加密块。

          EB = 00 || BT || PS || 00 || D .           (1)

块类型 BT 应为单个八位字节,指示结构 加密块。对于这个版本的文件,它应该有 值 00、01 或 02。​​对于私钥操作,块类型 应为 00 或 01。对于 public 键操作,应为 02。

值得注意的是,PKCS#1 v2.0 RFC (https://www.rfc-editor.org/rfc/rfc2437)

中并没有出现短语“块类型”

稍后我们看到验证一半:

9.4 加密块解析

加密块EB要解析成块类型BT,a padding string PS,数据D根据等式(1).

如果出现以下任何一种情况,则为错误:

  • 无法解析加密块EB 明确地(见第 8.1 节的注释)。
  • 填充字符串PS少于八个 八位字节,或者与块类型BT不一致。
  • 解密过程是public-密钥操作 并且块类型BT不是00或者01,或者解密 进程是私钥操作,块类型是 不是 02.

(强调我的)

使用 RFC2313 中的术语:

  • 签名生成是一个加密过程,是一个私钥操作 (BT=01)
  • 签名验证是一个解密过程,它是一个 public-密钥操作 (BT=01)
  • 启动密钥传输/封装是一个加密过程,它是一个 public-密钥操作 (BT=02)
  • Receive Key Transfer是一个解密过程,是一个私钥操作(BT=02)。

RFC 2437 (PKCS#1 2.0) 替换了许多这些术语,并完全摆脱了块类型的概念。对于 PKCS#1 签名格式,该字节简单地规定为 01,对于 PKCS#1 加密规定为 02。对于 OAEP(加密)或 PSS(签名)填充方案,该字节不是固定的。