SHA1withECDSA 使用的是哪条曲线?
Which curve is SHA1withECDSA using?
我正在使用 SHA1withECDSA 来验证我的 java 应用程序中的签名消息。现在我想用另一种编程语言 (node/js) 创建第二个应用程序来创建这些签名消息。
但是我找不到任何有 "SHA1withECDSA" 的 api。它们都只支持具有选定曲线的 ECDSA。所以我的问题是:java 使用的是哪条 ec 曲线?
关键工厂:
final KeyFactory keyFactory = KeyFactory.getInstance("EC");
签名:
final Signature dsa = Signature.getInstance("SHA1withECDSA");
Java 中的 {hash}withECDSA
算法支持可以在传递给 Signature.initSign(key)
或(您的情况)[=14= 的 ECPrivateKey
对象中表达的任何曲线] 传递给 Signature.initVerify(key)
的对象,对于标准的 SunEC 提供者来说是 任何以 X9.62 (Weierstrass) 形式表达的曲线 。这基本上是现在使用的所有东西 除了 Bernstein 等人的 {Curve,X,Ed}{25519,448}(EdDSA 是 an elliptic-curve 签名算法但不是 the 名为 ECDSA 的算法)。
标准 X9/NIST 和 TLS 曲线是预定义的,尽管(编辑)访问它们而不是密钥 generation 有点笨拙;见 How does one convert a public EC code point and curve name into a PublicKey? .
通常密钥对应该由签名者生成,并且(仅)公钥分发给验证者提前或连同签名和签名数据;通常这是以证书的形式完成的,这样可以避免产生漏洞的手动操作和手动错误。 Java 直接支持 X.509 证书,以及它们使用的公钥格式(SubjectPublicKeyInfo aka SPKI);请参阅 java.security.spec.X509EncodedKeySpec
和 java.security.Key
的 javadoc。对于 EC,SPKI 包括曲线标识,但不幸的是 Java API 没有提供方便的方法将其取回。
如果您有 X.509 证书或文件中公钥的 X.509 SPKI(DER 或 PEM 格式),并且有 OpenSSL,它可以解码并显示此信息:
openssl x509 -in certfile -inform {der|pem} -text
openssl pkey -in spkifile -inform {der|pem} -pubin -text # 1.0.0 up
openssl ec -in spkifile -inform {der|pem} -pubin -text # 0.9.x
# look at the line labelled ASN1 OID:
我正在使用 SHA1withECDSA 来验证我的 java 应用程序中的签名消息。现在我想用另一种编程语言 (node/js) 创建第二个应用程序来创建这些签名消息。
但是我找不到任何有 "SHA1withECDSA" 的 api。它们都只支持具有选定曲线的 ECDSA。所以我的问题是:java 使用的是哪条 ec 曲线?
关键工厂:
final KeyFactory keyFactory = KeyFactory.getInstance("EC");
签名:
final Signature dsa = Signature.getInstance("SHA1withECDSA");
Java 中的 {hash}withECDSA
算法支持可以在传递给 Signature.initSign(key)
或(您的情况)[=14= 的 ECPrivateKey
对象中表达的任何曲线] 传递给 Signature.initVerify(key)
的对象,对于标准的 SunEC 提供者来说是 任何以 X9.62 (Weierstrass) 形式表达的曲线 。这基本上是现在使用的所有东西 除了 Bernstein 等人的 {Curve,X,Ed}{25519,448}(EdDSA 是 an elliptic-curve 签名算法但不是 the 名为 ECDSA 的算法)。
标准 X9/NIST 和 TLS 曲线是预定义的,尽管(编辑)访问它们而不是密钥 generation 有点笨拙;见 How does one convert a public EC code point and curve name into a PublicKey? .
通常密钥对应该由签名者生成,并且(仅)公钥分发给验证者提前或连同签名和签名数据;通常这是以证书的形式完成的,这样可以避免产生漏洞的手动操作和手动错误。 Java 直接支持 X.509 证书,以及它们使用的公钥格式(SubjectPublicKeyInfo aka SPKI);请参阅 java.security.spec.X509EncodedKeySpec
和 java.security.Key
的 javadoc。对于 EC,SPKI 包括曲线标识,但不幸的是 Java API 没有提供方便的方法将其取回。
如果您有 X.509 证书或文件中公钥的 X.509 SPKI(DER 或 PEM 格式),并且有 OpenSSL,它可以解码并显示此信息:
openssl x509 -in certfile -inform {der|pem} -text
openssl pkey -in spkifile -inform {der|pem} -pubin -text # 1.0.0 up
openssl ec -in spkifile -inform {der|pem} -pubin -text # 0.9.x
# look at the line labelled ASN1 OID: