java - Bouncy CastLe 的 ECDHE 安全性

标签 java cryptography bouncycastle elliptic-curve diffie-hellman

我在椭圆曲线密码学领域是新手,没有经验。经过一些研究,我确定与传统的 DHE 不同,不应生成 ECDHE 参数,而应从预定义曲线列表中选择(示例包括“P-521”、“prime192v3”)。

在创建基于网络的安全敏感应用程序时,与使用单个硬编码曲线相比,在运行时随机选择不同的曲线是否更好(甚至合乎逻辑)?

还有,在所有的曲线中是否有一个曲线的概念可供选择?

到目前为止,这是我启动 ECDH 交换的代码:

//For readability purposes exception checking code not shown, all code is properly exception-handled
SecureRandom rnd = SecureRandom.getInstance("SHA1PRNG", "SUN");

X9ECParameters curve = ECNamedCurveTable.getByName("prime192v3");

ECDomainParameters domain = new ECDomainParameters(curve.getCurve(), curve.getG(), curve.getN(), curve.getH(), curve.getSeed());
ECKeyGenerationParameters ecgen = new ECKeyGenerationParameters(domain, rnd);

ECKeyPairGenerator kpgen = new ECKeyPairGenerator();

kpgen.init(ecgen);

AsymmetricCipherKeyPair kp = kpgen.generateKeyPair();

到目前为止这段代码有什么问题吗?

最佳答案

使用 ECC 加密技术,创建域参数需要很长时间。检查域参数的安全性也相当困难,例如检查 SafeCurves丹尼尔·J·伯恩斯坦和塔尼娅·兰格的研究。可以生成自己的曲线,但可能不是实时的。此外,安全性可能低于预定义的安全性,并且稍后您可能会遇到兼容性问题。

曲线的大小显然很重要,尽管超过 256 位的任何内容都应该提供足够的安全性。 NIST 曲线仍有可能是使用可能削弱安全性的方案生成的,尽管可能性不大。如果您担心这一点,请从上面的站点选择一条曲线(例如 BrainpoolP384r1 曲线),或者更“学术”的曲线之一。 F(p) 曲线可能应该优于其他曲线。

虽然这不是一个代码审查网站,但您提供的代码似乎没有什么特别错误的地方。

关于java - Bouncy CastLe 的 ECDHE 安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19604390/

相关文章:

java - 保护密码 SHA-1 Java

Node.js verify.verify() 奇怪的行为

java - 为什么 KeyPairGenerator.genKeyPair() 这么慢

c# - C# 中的 1024 位 Diffie-Hellman

java - 无法使用按钮重复 editText 中的文本

java - GWT 复合小部件

java - 由于连续的 ajax 调用, session 无效无效

java - 如何使用 Intent 从 android 中的另一个常规 Activity 调用特定的选项卡 Activity

java - 如何将DSA证书转换为RSA证书?

java - 从 Java BouncyCaSTLe 输出加密的 PK8 私钥