Java ECDH和ECDSA密钥之间有区别吗?

Java ECDH和ECDSA密钥之间有区别吗?,java,security,bouncycastle,elliptic-curve,Java,Security,Bouncycastle,Elliptic Curve,我正在构建一个使用BouncyCastle作为加密提供者的网络应用程序。假设您有这个来生成密钥对: ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("prime192v1"); KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA", "BC"); g.initialize(ecSpec, new SecureRandom()); KeyPair pair = g.

我正在构建一个使用BouncyCastle作为加密提供者的网络应用程序。假设您有这个来生成密钥对:

ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("prime192v1");
KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA", "BC");
g.initialize(ecSpec, new SecureRandom());
KeyPair pair = g.generateKeyPair();
我不明白为什么你会得到一个ECDSA KeyPairGenerator的实例。为什么不直接说EC?我知道BouncyCastle附带了一个ECDH键类型,但我认为这两个键代表了曲线上点的相同内容——或者说我完全错了它背后的理论


我询问的原因是,目前我的应用程序使用ECDH fine建立AES密钥,但现在我希望使用相同的EC密钥使用ECDSA对每条消息进行签名。

ECDSA和ECDH来自不同的标准(分别为ANSI X9.62和X9.63),并在不同的上下文中使用。X9.63明确重用了X9.62中的元素,包括公钥的标准表示(例如,在X.509证书中)。因此,ECDSA和ECDH密钥对在很大程度上是可互换的。然而,一个给定的实现是否允许这种交换是一个开放的问题。历史上,(EC)DSA和(EC)DH来自不同的世界

但是请注意,使用上下文是非常不同的。密码学比椭圆曲线上的计算更重要一些;必须考虑“关键生命周期”。简单地说,您不希望使用相同的过程管理密钥协议密钥和签名密钥。例如,如果您丢失了密钥协议密钥(您的狗吃掉了您的智能卡——不要笑,这真的发生了),那么您将无法再解密与该密钥相对加密的数据(例如,发送给您的加密电子邮件,并以加密格式存储)。从商业的角度来看,钥匙的丢失也可能是员工的丢失(员工被解雇、被公交车撞倒、退休或其他)。因此,通常必须托管加密密钥(包括密钥协议密钥)(例如,打印私钥副本并将其存储在保险箱中)。另一方面,签名密钥的丢失并不意味着数据丢失;以前签发的签名仍然可以验证;从这样的丢失中恢复就像创建一个新的密钥对一样简单。然而,代管制度的存在往往会自动剥夺签名可能附带的任何法律价值

此外,在更一般的基础上,我强烈建议不要在两个不同的算法中使用相同的私钥:算法之间的交互还没有得到充分的研究(仅仅研究一个算法已经是一项艰巨的工作)。例如,如果有人开始向基于ECDH的协议提供从ECDSA签名中提取的曲线点(您使用相同的私钥计算),会发生什么情况


因此,您确实不应该对ECDH和ECDSA重复使用相同的密钥。

非常感谢您的解释——我应该更仔细地阅读我的标准:-)