RSA:當您只有 N、E、D、P、Q 時,是否值得計算缺失的 CRT 參數?
OpenPGP 以不同於 PKCS #1 的方式定義 RSA 密鑰,具有上述值加上
U = P^-1 mod Q
. 然而,OpenSSL 似乎只適用於(N, E, D)
或(N, E, D, P, Q, dP, dQ, qInv)
最後三個應滿足以下條件(從 PKCS #1 開始):e * dP == 1 (mod (p-1)) e * dQ == 1 (mod (q-1)) q * qInv == 1 (mod p)
**問題:**從性能的角度來看,什麼會更快:只使用 (N, E, D) 進行密鑰操作,或者計算缺失的
dP
,dQ
和qInv
?
從性能的角度來看,什麼會更快:只使用 (N, E, D) 進行密鑰操作,或者計算缺失的
dP
,dQ
和qInv
?任何類型的性能問題總是特定於平台的,但是在這種情況下,計算 dP、dQ、qInv(然後使用 CRT 優化)似乎可以讓私有操作執行得更快(即使您需要執行私人操作只有一次)。
CRT 優化使 RSA 操作本身的速度提高了大約 4 倍;而不是進行 2048 位模冪運算(涉及 2048 位模數上的大約 2100 個模倍數),您進行兩個 1024 位模冪運算(涉及 1024 位模數上的大約 1050 個模數) - 模乘數大致相同,只有一個只有一半大的模數,如果你使用標準 $ O(n^2) $ 模乘常式,這是一個 4 倍的加速。開頭有最初的“mod p,mod q”操作,最後有一些修復操作,這些操作相對便宜。
現在,讓我們檢查計算成本 dP、dQ、qInv;dP 和 dQ 很便宜( $ dP = d \bmod p-1, dQ = d \bmod q-1 $ ),因此這些成本可以忽略不計。
計算 $ qInv = q^{-1} \bmod p $ 有點貴,計算它的一種方法是使用身份 $ q^{-1} \bmod p = q^{p-2} \bmod p $ (這是真的,因為 $ p $ 是素數);如果我們要使用該算法,那就是另一個大約 1050 模乘以 1024 位模數。
因此,這兩種方法的總費用(忽略僅執行一次或兩次的各種廉價操作)大約是 2100 模乘以 2048 位模數(對於僅使用 $ N, D $ )與大約 3150 模乘以各種 1024 位模數(用於“重建 CRT 參數並使用它們”算法);後者似乎很可能會更快(即使您使用比二次模乘算法更快的算法)。
重讀你的問題:我看到你有 $ U = p^{-1} \bmod q $ ; 這實際上是 qinv (交換 $ p $ 和 $ q $ ,它們是對稱的,所以哪個無關緊要)-您需要做的就是計算 $ dP $ 和 $ dQ $ (只要記住交換你告訴 OpenSSL 的那個是 $ dP $ 哪個是 $ dQ $ ),你很高興去。
因此,我的答案比我最初想像的還要正確。