Rsa
RSA 簽名:SHA512 與 PSS 不兼容?
我從 .Net API
RSACng
包裝類。在進行單元測試時,我會針對一系列可能性進行檢查:
- 密鑰大小 = 1024、2048 或 3072 位
- 填充模式 = PKCS v1 或 PSS (=PKCS v2?)
- 雜湊算法 = SHA-1、SHA256、SHA512
我測試了所有 323=18 種可能的配置。除一種組合外,所有測試均通過:
- 密鑰大小 = 1024 位
- 填充模式 = PSS
- 雜湊算法 = SHA512
這應該是預料之中的,我怎麼能預料到呢?到目前為止,Google還不是我的朋友。
我還為 RSA 加密執行了一批類似的單元測試,並註意到 1024 位密鑰與 OAEP-SHA1 和 OAEP-SHA256 填充模式不兼容。我懷疑密鑰不夠大,但我再次無法閱讀有關為什麼會發生這種情況的一些資訊。
是的,這是意料之中的,如果 RSASSA-PSS 簽名程式碼/測試使用雜湊的寬度,這是習慣性的。在這種情況下,一個 $ h $ -位雜湊(與 $ h $ 8 的倍數)至少需要一個 RSA 公共模數 $ 2h+9 $ 位。
這在PKCS#1 v2.2,第 9.1.1 節, enBits上的條件中半清楚地說明,在步驟 3 中進行實際測試。那是因為消息代表需要傳達 $ h $ 消息雜湊的位, $ h $ 鹽的位, $ 8 $ 一個字節標識符¹的位,然後是一些。
在 PSS 中,鹽長度可以作為一個參數,而不是像往常一樣固定為雜湊寬度。此外,它可以選擇是確定性的或固定的,而不是像往常一樣隨機。但遠非所有 API 都允許這樣做。
RSAES-OAEP 也有類似的限制(沒有靈活性:標籤的雜湊值始終與雜湊值一樣寬,即使標籤為空/不存在,通常也是如此)。
¹ 該標識符 BC h在為 Rabin 簽名使用 PSS 填充或使用它時發揮作用 $ r\to\min(r^d\bmod N,N-(r^d\bmod N)) $ 而不是教科書的 RSA 私鑰操作,以便允許使用任何具有與用於簽名的相同大小的公共模數的公鑰立即對簽名進行教科書 RSA 加密。