【问题标题】:Public key same as PublicKey.getEncoded()与 PublicKey.getEncoded() 相同的公钥
【发布时间】:2014-03-15 14:40:51
【问题描述】:

我想从 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 版本的正确代码吗?

【问题讨论】:

    标签: java openssl asn.1


    【解决方案1】:

    在 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

    【讨论】:

      猜你喜欢
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 2018-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多