哪個填充用於 sha256WithRSAEncryption (1.2.840.113549.1.1.11),確定性還是隨機?
問題
- 知道使用了哪個填充的唯一方法是了解如何使用 sha256WithRSAEncryption 的上下文(簽名時 PS 為 0xFF,加密時隨機非零)?
- 是否有明確的文件說明,或者對 RFC 8017 的廣泛理解是唯一的方法?
背景
在分析生成 CMS 的一些程式碼時,我查看了 RFC 5652第 5.3 節,特別是摘要算法、簽名算法和簽名。我有一個例子
2.16.840.1.101.3.4.2.1 sha-256 (NIST Algorithm)
,1.2.840.113549.1.1.11 sha256WithRSAEncryption (PKCS #1)
和00000000 64 f4 82 71 ac 8d 6a ab 51 85 69 59 f3 d7 ab 2b |d..q..j.Q.iY...+| 00000010 ea 95 0b 11 fe 9a 46 fa 73 a4 c7 41 4f 13 79 82 |......F.s..AO.y.| 00000020 0e 34 52 02 23 b4 13 b2 7b ae 56 d8 3a 4a cc 96 |.4R.#...{.V.:J..| 00000030 27 ee b8 62 2a ae 83 2f 08 ef 3b d0 8a 17 e4 63 |'..b*../..;....c| 00000040 ca 49 04 48 05 e9 7d ac d5 58 50 28 5e 16 37 08 |.I.H..}..XP(^.7.| 00000050 db e8 e6 a7 5b c4 0f b2 d2 42 cf c6 99 16 f2 26 |....[....B.....&| 00000060 90 f8 03 51 a7 7c e2 3f 87 a6 ef d2 ca 40 e6 61 |...Q.|.?.....@.a| 00000070 74 4d 64 7d 07 f8 01 42 c3 8f 3a fa 53 b6 30 b5 |tMd}...B..:.S.0.| 00000080 60 c4 94 54 60 7d 3c a0 fd 19 45 d3 d5 55 f8 e6 |`..T`}<...E..U..| 00000090 36 d8 55 06 84 c0 6f 57 a7 32 cd 71 f9 35 ab b3 |6.U...oW.2.q.5..| 000000a0 a2 20 7a 46 99 73 66 21 0b 50 7b 0c 43 59 6b b6 |. zF.sf!.P{.CYk.| 000000b0 b5 94 e3 b0 92 22 58 4f a4 6b 3a 16 f2 81 11 b5 |....."XO.k:.....| 000000c0 e0 7b 41 9a 4b ab 38 39 53 6e 9f 53 b0 b7 c4 95 |.{A.K.89Sn.S....| 000000d0 cf 68 3d 48 30 9c a7 71 a8 df 62 5d e5 16 7c 6d |.h=H0..q..b]..|m| 000000e0 88 cd eb 07 56 53 66 53 a7 78 f9 80 27 39 b2 74 |....VSfS.x..'9.t| 000000f0 58 08 15 e5 98 e3 dd 8f fe 25 89 c1 85 1b a5 4e |X........%.....N|
sha256WithRSAEncryption
在 RFC 8017第 A.2.4 節 RSASSA-PKCS1-v1_5中有權威定義。它進一步引用了 EMSA-PKCS1-V1_5-ENCODE,它在第 9.2 節中定義,具有相同的名稱。第 9.2 節。第4步說生成一個八位字節字元串 PS,由 emLen - tLen - 3 個八位字節組成,十六進制值為 0xff。PS 的長度至少為 8 個八位字節。
而第 7.2 節。RSAES-PKCS1-v1_5 說
生成長度為 k - mLen - 3 的八位字節字元串 PS,由偽隨機生成的非零八位字節組成。PS 的長度至少為八個八位字節。
用於加密操作。
簽名解密為:
00000000 00 01 ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 00000010 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 00000020 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 00000030 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 00000040 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 00000050 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 00000060 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 00000070 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 00000080 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 00000090 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 000000a0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 000000b0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 000000c0 ff ff ff ff ff ff ff ff ff ff ff ff 00 30 31 30 |.............010| 000000d0 0d 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20 |...`.H.e....... | 000000e0 88 b1 44 7c ac 6b 76 4f fc 4c 35 76 12 a0 99 f2 |..D|.kvO.L5v....| 000000f0 a5 b4 dc 12 9a 00 cf 05 87 78 81 5c 93 97 b7 07 |.........x.\....|
並且應該讀作
0x00 || 0x01 || PS || 0x00 || T
,其中 T 是:SEQUENCE (2 elem) SEQUENCE (2 elem) OBJECT IDENTIFIER 2.16.840.1.101.3.4.2.1 sha-256 (NIST Algorithm) NULL OCTET STRING (32 byte) 88B1447CAC6B764FFC4C357612A099F2A5B4DC129A00CF058778815C9397B707
筆記
-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuoe/0wkWa917Qyss+OAE 4hZktETDUOtilbjxH8DdYL+lbyc7SduwMTDS4XpPa3uRrQHlrRV9/1tmAOfVC7jG O+1aEfHSPCWxmpN5AHQF7r1ePEbyR/MB2CzX3lJmNbskCSgxmol78SRkkuZkGxmU mgqNxOu74LrZta9EAQEHquCigZxzSTU7exLfpH2wq/QhTCmm3DP3d9BhDgzdz7B5 /FGAh3lp5WBeaUyfz8LLDtaXKUZ3zBYvG83gbbGYjqobQN8GWOu8BgyXAePrtroh UXgRNRCNeSdm923YM1tu1y0K67sYAYtCt6MUjjNWvciqm11hlqNnSFxe9/ZHmXOC 2QIDAQAB -----END PUBLIC KEY-----
它使用確定性填充,即用
FF
八位字節填充,由單個00
值字節完成。所以確實是使用 EMSA-PKCS1-V1_5-ENCODE 的 RSASSA-PKCS1-v1_5。不要被sha256WithRSAEncryption
. 這只是指向模冪 - 在這種情況下是私鑰。PKCS#1 最高 1.5 的版本將模冪運算視為“使用私鑰加密”。這在 PKCS#1 v2.0 和後續版本中有所改變,他們故意指出簽名原語 RSASP1 和 RSASV1 與加密原語 RSAEP 和 RSADP 不同,即使它們都基於模冪運算。
不幸的是,PKCS#1 v1.5 簽名方案和 OID 早於此,因此看起來簽名方案與加密或用於加密的填充有關。他們沒有,除了他們顯然共享許多屬性。
請注意,簽名方案的配置應該事先知道。所以屬性不應該從簽名本身派生(在模冪之後)。並且任何簽名方案都不應使用為加密而設計的填充,並且僅指定用於加密。