公钥与PublicKey.getEncoded()相同

时间:2014-03-15 14:40:51

标签: 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版本提供正确的代码吗?

1 个答案:

答案 0 :(得分:2)

  

在OpenSSL输出中,有更多参数和位串。似乎在OpenSSL版本中提供了曲线类型描述的所有这些参数,但为什么呢?如果我们知道曲线类型,我们知道这个参数,所以输出必须提供的唯一东西是曲线类型(第二个对象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