【发布时间】:2015-06-19 19:16:43
【问题描述】:
我需要使用 ECDSA 算法来签署消息并在 java 中发送给接收者。然后,接收方应验证发送方的签名。
因此,为此,接收方拥有发送方的公钥,但在通过以下命令将java.security.PublicKey 转换为字节数组后采用字节数组格式:
byte[] byteArrayPublicKey = publickey.getEncoded();
ECDSA算法中公钥的格式(转换为字节数组前)如下:
公钥:
X: 8a83c389e7bb817c17bf2db4ed71055f18342b630221b2a3a1ca752502dc2e21
Y: 3eaf48c9ab1700fe0966a0cde196b85af66bb8f0bacef711c9dca2368f9d8470
但是,问题是将此字节数组转换为可用格式,以验证接收者签名为java.security.PublicKey。
一般来说,有什么解决方案可以验证签名而不将其转换为字节数组?换句话说,问题是通过发送者的公钥验证签名,使用任何方法。
【问题讨论】:
-
如果你有
PublicKey.getEncoded()的结果不只是公共点X和Y;它还包含一个包含参数的 AlgId。 Java 称之为“X509”编码,您可以直接将其提供给KeyFactory.getInstance("EC").generatePublic()。如果您实际上只有单独的点坐标和曲线,请参阅stackoverflow.com/questions/22646792/… 和stackoverflow.com/questions/30445997/…。
标签: java key signature public-key ecdsa