EVP_PKEY_verify在使用EC_密钥时不工作
如果EVP_PKEY结构包含EC密钥,则EVP_PKEY_验证在大多数情况下会失败,但在某些情况下会成功 关于EVP_PKEY_verify的openssl文档只显示了使用rsa密钥的示例。但我找不到EVP_PKEY包含EC密钥时的任何验证示例EVP_PKEY_verify在使用EC_密钥时不工作,c,openssl,cryptography,C,Openssl,Cryptography,如果EVP_PKEY结构包含EC密钥,则EVP_PKEY_验证在大多数情况下会失败,但在某些情况下会成功 关于EVP_PKEY_verify的openssl文档只显示了使用rsa密钥的示例。但我找不到EVP_PKEY包含EC密钥时的任何验证示例 auto evp = EVP_PKEY_new(); auto eckey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1); assert(1 == EC_KEY_generate
auto evp = EVP_PKEY_new();
auto eckey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
assert(1 == EC_KEY_generate_key(eckey));
assert(1 == EC_KEY_check_key(eckey));
assert(1 == EVP_PKEY_assign_EC_KEY(evp, eckey));
vector<unsigned char> msg = { 'a', 'd', 'f', 'h', 'k' };
const int sha256Len = 32;
unsigned char sha[sha256Len];
SHA256(&(msg[0]), msg.size(), sha);
//----signing
auto evpctx=EVP_PKEY_CTX_new(evp, nullptr);
assert(1 == EVP_PKEY_sign_init(evpctx));
assert(1 == EVP_PKEY_CTX_set_signature_md(evpctx, EVP_sha256()));
size_t signLen = 0;
assert(1 == EVP_PKEY_sign(evpctx, NULL, &signLen, sha, sha256Len));
vector<unsigned char> sig(signLen);
auto ret = EVP_PKEY_sign(evpctx, &(sig[0]), &signLen, sha, sha256Len);
assert(ret == 1);
EVP_PKEY_CTX_free(evpctx);
///-----veryfication
auto evpctx1 = EVP_PKEY_CTX_new(evp, nullptr);
assert(1 == EVP_PKEY_verify_init(evpctx1));
assert(1 == EVP_PKEY_CTX_set_signature_md(evpctx1, EVP_sha256()));
ret = EVP_PKEY_verify(evpctx1, &sig[0], sig.size(), sha, sha256Len);
EVP_PKEY_free(evp);
EVP_PKEY_CTX_free(evpctx1);
assert(ret == 1);
上述代码在循环中运行时,大多数情况下都会失败,但并不总是如此。有些迭代成功了。
如果我生成一个RSA密钥而不是EC密钥,并将其放入EVP_PKEY,那么就可以了。我做错了什么?
您能给我一个使用EVP_PKEY_verify和ec密钥的工作示例吗?问题如下: 这里,您确定签名输出缓冲区的最大大小:
assert(1 == EVP_PKEY_sign(evpctx, NULL, &signLen, sha, sha256Len));
在这里,您分配这个缓冲区:
vector<unsigned char> sig(signLen);
实际使用的输出缓冲区大小写入signLen,您必须在此处指定
ret = EVP_PKEY_verify(evpctx1, &sig[0], signLen, sha, sha256Len);
当你验证签名时!通过这一小小的修改,您的代码应该可以正常工作。问题如下: 这里,您确定签名输出缓冲区的最大大小:
assert(1 == EVP_PKEY_sign(evpctx, NULL, &signLen, sha, sha256Len));
在这里,您分配这个缓冲区:
vector<unsigned char> sig(signLen);
实际使用的输出缓冲区大小写入signLen,您必须在此处指定
ret = EVP_PKEY_verify(evpctx1, &sig[0], signLen, sha, sha256Len);
当你验证签名时!通过这个小小的修改,您的代码应该可以正常工作