ECDH和ECDSA密钥之间有区别吗?
我正在构建一个使用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
Key类型,但是我认为两者在曲线上的点代表相同的东西-还是我完全不理解其背后的理论?
我问的原因是,现在我的应用程序使用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重用同一密钥。
以上是 ECDH和ECDSA密钥之间有区别吗? 的全部内容, 来源链接: utcz.com/qa/424577.html