我希望从 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/