Encryption

為什麼橢圓曲線密碼學 (ECC) 中的加密比解密慢?

  • April 8, 2019

在使用公鑰進行加密並使用私鑰進行解密時,我總是發現加密比橢圓曲線密碼學 (ECC) 中的解密花費更多時間。簽名和驗證都是一樣的。密鑰為 60 個字節。

這是正常行為還是我使用了錯誤的 ECC 實現?

如果這種行為是正常的,那麼背後的原因是什麼?提前致謝。

似乎有問題的公鑰匿名加密方案是 ECIES。ECIES 加密需要生成一次性密鑰對與之進行 DH 密鑰協議,而 ECIES 解密只需要進行 DH 密鑰協議,因此成本應該比加密低得多。

具體來說,發送者知道接收者的公鑰, $ A $ ,橢圓曲線上的一個點。發送者選擇一個短暫的秘密標量 $ t $ 併計算 $ T := [t]G $ , 在哪裡 $ G $ 是曲線上的標準基點;然後發送方計算 $ k := H([t]A) $ 和用途 $ k $ 作為對稱認證密碼的密鑰。最後,發送者發送 $ T $ 在經過身份驗證的密文旁邊。此操作需要計算兩個標量乘法: $ [t]G $ 和 $ [t]A $ .

接收者知道秘密標量 $ a $ 這樣 $ A = [a]G $ ,並且可以恢復$$ H([a]T) = H([a][t]G) = H([a\cdot t]G) = H([t\cdot a]G) = H([t][a]G) = H([t]A) = k, $$然後他們可以用它來解密經過身份驗證的密文。此操作只需要計算一個標量乘法: $ [a]T $ .

因此,可以預期加密操作將比解密操作花費更多。在一個幼稚的實現中——如果你引用的軟體使用的 libgcrypt 是幼稚的,我不會感到驚訝——加密的成本大約是解密的兩倍。通過為固定基數使用預先計算的表,它可以在不那麼天真的實現中變得更快 $ t \mapsto [t]G $ 計算,但加密仍然比解密慢。


這個庫中的簽名方案可能是 ECDSA。使用 ECDSA 進行簽名需要一次定基標量乘法,而驗證簽名需要一次雙基標量乘法,因此驗證的成本應該比簽名成本低兩倍。

具體來說,簽名的驗證方程 $ (r, s) $ 在一條消息上 $ m $ 在公鑰下 $ A $ 是$$ r \equiv x\bigl([H(m) \cdot s^{-1}] G + [r \cdot s^{-1}] A\bigr) \pmod n, $$這需要計算 $ s^{-1} $ , 標量 $ H(m) \cdot s^{-1} $ 和 $ r \cdot s^{-1} $ , 和雙基標量乘法 $ [\alpha] G + [\beta] A $ 在哪裡 $ G $ 是標準的基點 $ n $ .

知道秘密的簽名者 $ a $ 這樣 $ A = [a]G $ , 選擇一個標量 $ k $ 均勻隨機地計算 $ r = x([k]G) $ ,然後求解 $ k \equiv H(m) \cdot s^{-1} + r \cdot s^{-1} $ 為了 $ s $ 一次取反和兩次乘法模 $ n $ .

也就是說,ECDSA 是關於最愚蠢的橢圓曲線簽名方案——它的設計初衷是為了故意避免在更明智的方案上早已過期的專利。您應該改用 Ed25519。

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