java - 公钥与 PublicKey.getEncoded() 相同

标签 java openssl asn.1

我希望从 OpenSSL 获得与 Java PublicKey.getEncoded() 相同的 ASN.1 输出。我使用EC,曲线类型是prime256v1。 这是我的 OpenSSL 代码:

EC_KEY *ec_key = EVP_PKEY_get1_EC_KEY(key);
unsigned char *result = NULL;
int r = i2d_EC_PUBKEY(ec_key, &result);

Java 代码非常简单:

byte[] result = keyPair.getPublicKey().getEncoded();

OpenSSL 结果包含 ASN.1,但格式与 Java 代码输出不同。在 Java 输出中,只有两个对象 ID 和位字符串。在 OpenSSL 输出中,有更多的参数和位字符串。似乎在 OpenSSL 版本中提供了所有由曲线类型描述的参数,但为什么呢?如果我们知道曲线类型,我们就知道这个参数,因此输出必须提供的唯一内容是曲线类型(第二个对象 ID)。

我知道我做错了什么,所以有人可以提供 OpenSSL 版本的正确代码吗?

最佳答案

In OpenSSL output there are much more parameters and bit string. It seems like in OpenSSL version all this parameters described by curve type are provided but why? If we know curve type we know this parameters so the only thing output must provide is curve type (second Object ID).

您没有使用命名曲线。要使用命名曲线,您需要设置 OPENSSL_EC_NAMED_CURVE 标志:

EC_KEY* key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
EC_KEY_set_asn1_flag(key, OPENSSL_EC_NAMED_CURVE);

这将使用像 ASN1 OID: prime256v1 这样的命名曲线,而不是域参数。

参见ECDH and Named Curves进行更详细的讨论。

关于java - 公钥与 PublicKey.getEncoded() 相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22425188/

相关文章:

java - 打印机竞争状况?

java - 通过 JavaMail 读取 POP3 消息仅返回尾随句点,而不返回内容

java - Java 中的 'if' 语法如何工作?

c++ - 如何在Visual Studio中包括OpenSSL

macos - 错误: 'zlib' is an invalid command

ssl - ACE SSL 错误 : peer did not return a certificate

java - 如果数组包含括号和逗号,如何将数组作为 java 中 Scanner 的输入

javascript - 用于派生 RSA 私钥的数字何时应以 `00` 开头?

java - 使用自动标签的开源 Java ASN.1 解码器

Java 到 ASN1 可读字符串