Rsa

哪個填充用於 sha256WithRSAEncryption (1.2.840.113549.1.1.11),確定性還是隨機?

  • January 2, 2020

問題

  1. 知道使用了哪個填充的唯一方法是了解如何使用 sha256WithRSAEncryption 的上下文(簽名時 PS 為 0xFF,加密時隨機非零)?
  2. 是否有明確的文件說明,或者對 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 早於此,因此看起來簽名方案與加密或用於加密的填充有關。他們沒有,除了他們顯然共享許多屬性。

請注意,簽名方案的配置應該事先知道。所以屬性應該從簽名本身派生(在模冪之後)。並且任何簽名方案都不應使用為加密而設計的填充,並且僅指定用於加密。

引用自:https://crypto.stackexchange.com/questions/76745