gpt4 book ai didi

c - 使用 EC_KEY 时 EVP_PKEY_verify 不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 01:44:08 25 4
gpt4 key购买 nike

EVP_PKEY_verify() 在大多数情况下如果 EVP_PKEY 结构包含 EC key 会失败,但在某些情况下会成功。

关于 EVP_PKEY_verify() 的 openssl 文档仅显示了带有 rsa key 的示例。但是当EVP_PKEY包含EC key 时,我找不到任何验证的例子

    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 key 而不是 EC key 并将其放入 EVP_PKEY,那么就可以了。我做错了什么?你能给我一个使用 EVP_PKEY_verify() 和 ec key 的工作示例吗?

最佳答案

问题如下:

在这里,您确定签名输出缓冲区的最大大小:

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);

实际使用的输出缓冲区大小被写入signLen,您必须在此处指定

ret = EVP_PKEY_verify(evpctx1, &sig[0], signLen, sha, sha256Len);

当您验证签名时!通过这个小修改,您的代码应该可以按预期工作。

关于c - 使用 EC_KEY 时 EVP_PKEY_verify 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57018976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com