我正在使用SHA1withECDSA来验证我的Java应用程序中的签名消息。现在,我想用另一种编程语言(node / js)创建第二个应用程序,以创建那些签名消息。
但是我找不到任何具有“ SHA1withECDSA”的api。它们全部仅支持具有选定曲线的ECDSA。所以我的问题是:java使用哪个ec曲线?
关键工厂:
final KeyFactory keyFactory = KeyFactory.getInstance("EC");
签名:
final Signature dsa = Signature.getInstance("SHA1withECDSA");
答案 0 :(得分:0)
Java中的{hash}withECDSA
算法支持可以在传递给ECPrivateKey
的{{1}}对象或(根据您的情况)传递给{{ 1}},对于标准的SunEC提供者而言,以X9.62(Weierstrass)形式表示的任何曲线。这基本上是当今使用的所有内容,除了伯恩斯坦(Bernstein)等人的{Curve,X,Ed} {25519,448}(EdDSA是 an 椭圆曲线签名算法,但不是 算法称为ECDSA)。
标准的X9 / NIST和TLS曲线是预定义的,尽管(编辑)除了用于生成关键键 以外的其他方式都比较笨拙;参见How does one convert a public EC code point and curve name into a PublicKey?。
通常,密钥对应由签名者生成,并且(仅)在签名之前或与签名一起分发给验证者的公共密钥 ( s)和签名的数据;通常,这是以证书的形式完成的,从而避免了造成漏洞的人工工作和人工错误。 Java直接支持X.509证书,以及它们使用的公钥格式(SubjectPublicKeyInfo aka SPKI);请参见Signature.initSign(key)
和ECPublicKey
的javadoc。对于EC,SPKI包括曲线标识,但是不幸的是Java API没有提供方便的方法来将其取回。
如果您具有DER或PEM格式的文件中的X.509证书或公钥的X.509 SPKI,并且具有OpenSSL,它可以解码并显示以下信息:
Signature.initVerify(key)