RSA 密鑰參數要求
最近,我正在與一家 POS 設備的中國供應商合作,他們的設備使用 2048 位 RSA 密鑰來簽署二進製文件。我必須生成一個公共/私有對(這樣我就可以簽署我自己的二進製文件)並且我對此做了一些研究。
在研究過程中,我從供應商的文件中看到了一條建議:請檢查私鑰模數 (N) 的第一個字節是否大於 0x80。如果沒有,請生成另一個密鑰並進行相同的檢查。
好吧,如果您考慮一下,如果它小於 0x80,則密鑰實際上不會有 2048 位,但會小於該值。畢竟,RSA 密鑰參數本質上是大整數,整數左側的零在計算中沒有任何作用。我什至發現OpenSSL 有程式碼來測試這種情況(至少我猜是這樣)。
現在,問題:其他參數不應該具有完全相同的要求嗎?我的意思是,它們都是整數,將用於這樣的計算。為什麼例如私有指數不接受相同的檢查?
其他參數不應該有完全相同的要求嗎?
當然不是所有其他參數。供應商可以設置要求 $ e $ ,但它們會有所不同。對於其他關鍵參數,額外的要求是不尋常的,只有當您使用供應商提供或規定在簽署二進製文件或準備證書籤署請求時使用的設備(軟體或硬體)時,它們才可能存在有效的技術原因.
提供給供應商或將進入 POS 的關鍵參數是 RSA 密鑰的公共部分中的參數: $ (N,e) $ . 這些都有合法的互操作性要求。但是,要求*“模數的第一個字節( $ N $ ) 的私鑰大於 0x80"不是標準的:它應該是"..不低於0x80"*,或者它可以解決一些討厭的錯誤,或者它是某些東西的非標準標誌(例如允許在第一個字節時載入無符號程式碼 $ N $ 是 0x80)。標準(FIPS 186-4 附錄 B.3)要求 $ N $ 對於 2048 位 RSA 密鑰是 $ 2^{2047}\le N<2^{2048} $ (和 $ N $ 奇數),不 $ 2^{2047}+2^{2040}\le N<2^{2048} $ ,我不會讓這種偏差無法解釋。
標準為 $ e $ 是 $ 2^{16}<e<2^{256} $ (和 $ e $ 奇數),上限通常較低,但沒有任何常見或合理的情況要求第一個字節超過接近 0x80 的限制。 $ e=2^{16}+1 $ 有時需要。 $ e=3 $ 以前在 POS 應用程序中很流行,因為它可以加快卡驗證速度,並且在與適當的簽名填充一起使用時非常好。
私鑰應該只由其合法持有者知道,並且(對於 RSA 和安全密鑰)沒有辦法根據供應商應該知道的或由 POS 設備操縱的參數來評估其參數的值。即使是這樣的事實 $ N $ 有兩個而不是三個主要因素是供應商或 POS 無法測試的。因此,對私鑰的要求在技術上僅適用於使用私鑰的設備(在應用程序中:簽署軟體或 CSR)。從更普遍執行的開始(列表非限制性的):
- 私鑰表示為 $ (N,e,d,p,q,d_p,d_q,q_\text{inv}) $ per
RSAPrivateKey
在 PKCS#1 v2.2 中 沒有optionalotherPrimeInfos
,因此 $ N $ 恰好有兩個質因數,而不是更多。- $ N $ 正好有 $ k $ 位與 $ k $ 在離散集合中(通常:某個範圍內 2 的某個冪的倍數)。
- $ d<(p-1)(q-1)/\gcd(p-1,q-1) $ (FIPS 186-4 中的限制)。這通常是放鬆的 $ d<N $ (PKCS#1v2.2 中的限制), $ d<2^k $ , 或其他。
- $ p $ 和 $ q $ 奇數且在範圍內 $ (2^\frac{k-1}2,2^\frac k2) $ . 強制執行時,下限可能會有所不同,例如放寬至 $ \mathtt{B5_h},2^{\frac k2-8} $ 或者 $ 2^{\frac k2-1} $ . 但即使這樣的限制是標準的,許多硬體設備和大多數軟體都非常滿意 $ p $ 和 $ q $ 位大小不同*。*
- $ q<p $ 反之亦然(指示糟糕做法的要求)。