【问题标题】:ECDSA parameters/public keyECDSA 参数/公钥
【发布时间】:2022-01-06 08:58:54
【问题描述】:

我无法使用 openssl 验证 ECDSA 签名:我有签名、数据的 SHA256 哈希、EC 曲线名称以及文档称为公钥的元素。

如果我用 openssl 检查这个公钥,我想我有一个 ecparams 结构:

unsigned char parameters[] = { 0x03, 0x5d, 0x30, 0x6b, 0x47, 0x48,... (I copied those data to file param)

$ openssl ecparam -check -name secp256r1 -in parameters
using curve name prime256v1 instead of secp256r1
checking elliptic curve parameters: ok
-----BEGIN EC PARAMETERS-----
BggqhkjOPQMBBw==
-----END EC PARAMETERS-----

所以我认为这是一个压缩的 ecparameters 结构。

我正在尝试从这些数据开始验证签名,但是虽然我能够获取签名数据,但我无法从参数开始生成密钥

unsigned char parameters[] = { 0x03, 0x5d, 0x30, 0x6b, 0x47, 0x48...
unsigned char signature[] = { 0x30, 0x45, 0x02, 0x20, 0x77, 0x30...

ECDSA_SIG* derSignature = d2i_ECDSA_SIG(&derSignature, &signaturePtr, sizeof(signature));
EC_KEY*    key1 = d2i_EC_PUBKEY(NULL, &parametersPtr, sizeof(parameters));
EC_KEY*    key2 = d2i_ECParameters(NULL, &parametersPtr, sizeof(parameters));

虽然 derSignature 是有效指针,但 key1 和 key2 为空。 我还没有找到一个很好的文档,但是我知道你还需要曲线的名称来重建密钥,所以我首先创建了一个与曲线关联的密钥结构,然后我尝试使用参数填充该结构,但它仍然无法正常工作。

key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);

key = d2i_EC_PUBKEY(&key, &parametersPtr, sizeof(parameters));

(I also tried this, same result)
key = d2i_EC_PUBKEY(&key, &parametersPtr, sizeof(parameters));

【问题讨论】:

    标签: c++ openssl ecdsa


    【解决方案1】:

    我找到了导入“键”的正确方法:我需要创建一个新的键对象,设置正确的曲线 ID。然后将数据导入为“octect”(不知道为什么我需要以这种方式导入,如果有人可以解释它会有所帮助)

    EC_KEY* key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
    key = o2i_ECPublicKey(&key,&parametersPtr, sizeof(parameters));
    

    PS:这不是完整的公钥,但包含进行签名验证的所有信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-19
      相关资源
      最近更新 更多