【发布时间】: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, ¶metersPtr, sizeof(parameters));
EC_KEY* key2 = d2i_ECParameters(NULL, ¶metersPtr, sizeof(parameters));
虽然 derSignature 是有效指针,但 key1 和 key2 为空。 我还没有找到一个很好的文档,但是我知道你还需要曲线的名称来重建密钥,所以我首先创建了一个与曲线关联的密钥结构,然后我尝试使用参数填充该结构,但它仍然无法正常工作。
key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
key = d2i_EC_PUBKEY(&key, ¶metersPtr, sizeof(parameters));
(I also tried this, same result)
key = d2i_EC_PUBKEY(&key, ¶metersPtr, sizeof(parameters));
【问题讨论】: