在 ECDSA 中使用什麼曲線和密鑰長度?
我正在用 Java 開發一個不與第三方軟體互動的客戶端/伺服器系統,所以我不必擔心兼容性問題。
在某個時刻,我需要客戶端和伺服器交換數字簽名值。我想使用 ECDSA,但我不確定我應該使用什麼曲線和什麼密鑰長度。我最擔心的是安全性,而不是計算時間或簽名的長度。
我正在使用 BouncyCastle 進行安全相關的操作,所以曲線和密鑰長度必須得到它的支持。在這裡您可以找到BouncyCastle 支持的曲線列表。
你有什麼建議嗎?
SafeCurves列出了一些比較橢圓曲線安全性的方法。它們的安全標準分為“ECDLP 安全”和“ECC 安全”。前者失敗基本上意味著“一般來說無法安全地使用這條曲線”,而後者“很難安全地實現這條曲線”。
在 SafeCurves 上查看的(少數)BouncyCastle 支持的曲線都沒有通過所有標準。有些不符合“剛性”ECDLP 標準,這意味著沒有辦法表明沒有選擇參數,因此存在後門。如果您擔心例如 NSA 使用了後門 ECC,您應該避免使用這些曲線。
做得最好的是brainpoolp384t1。如果通過了所有 ECDLP 標準並且具有扭曲安全性。這意味著它是最容易正確實施的。他們研究的另一條 Brainpool 曲線,brainpoolp256t1,也通過了所有 ECDLP 標準,因此可以安全地實施。在不了解 BouncyCastle 的實現的情況下,我不可能知道前一條曲線是否具有優勢,或者即使兩者實際上都被破壞了。
關於密鑰長度,各方有不同的建議。他們大多同意至少到 2030 年 256 位就足夠了。所以我上面提到的兩條 Brainpool 曲線中的任何一條都符合要求。根據 NSA 的說法,384 位對於最高機密來說就足夠了。
簡而言之,brainpoolp384t1 將是一個保守的選擇,因為您不關心計算時間或空間使用情況。這並不是說其他任何一個都是不好的選擇,或者其他一些曲線(例如 512 位 Brainpool 曲線之一)甚至不是更好。