gpt4 book ai didi

c - 将 RSA 公钥从字符串传递到 RSA * 结构时出错

转载 作者:太空宇宙 更新时间:2023-11-03 23:42:31 28 4
gpt4 key购买 nike

我尝试将公共(public) RSA key 加载到我的程序中。我在 C 中使用 openssl 库。 key 在 header crypt.h 文件中定义:

#define PUBLIC_KEY  "-----BEGIN PUBLIC KEY-----\n" \
"MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuDcT2OiToi9edqil/3ha\n" \
"1MMrgqYvdYObRkb8C5SZtf8iv4LynuHi3hvEtybqFW84Uf2l3Dxuz3IWVp2v1C2f\n" \
"cUxwf+hFqL4Nt2Ww/XOKLtFXTSX/2fPYoelmLja2grHPSuFx6N4gtDUXRIGSYXIz\n" \
"c2GBx8lOiOP+qUguFmWZ9E0GiMLvh4XUQUzTGr4ZNNoc5LODdO0g7beFFqhntt9w\n" \
"EKdceGQtA7Zyt5l13x0lj+RONdPJkDFZrNGdqDwNUSog9mufpvR1P2UW09pC+lzy\n" \
"z32P+w0U3Za4zv4Btis9ky16vaqdN/KlDWJRt+4W9TQSAL0x9w708OQr0Sf2CXNq\n" \
"EobSLZ/aybe75yQmzFqmn10X+NuwTtJkArIKK7JONCBSxjohQmTZw0U497TCEHia\n" \
"itzgsHNLf1of31G/3GK5rCkm9fl39nnrg0yJi1cONTDjSHzKlrPhA584jFRD0CIO\n" \
"VNHYgsVLuFQuJ0WkZON8uEZELXN1ZyWnmPXH8wSwxjud65JD4JSQornCXorBMfxd\n" \
"DFEeeNk8tjgPMaCTLFNP/gfVDzkvcct9RoC8uZxHk8zgrGOwuxOZ/ZyihE7M8v0i\n" \
"+VwG9iMrPl8W3+KqunIt/FB4Le1vJ0yYorK64DRNdeMAIsYq2iFWO3GXNsX631/K\n" \
"EuZJS8tGNhK9dF5umo0GceUCAwEAAQ==\n" \
"-----END PUBLIC KEY-----\n"

RSA key 应该保存在 RSA * 结构中。我为此使用了一个全局变量。

RSA *rsaPubkey;

main() 调用一个函数,该函数将获取 PUBLIC_KEY 并将其传递给 rsaPubkey。函数如下所示:

#include "crypt.h"

int EVP_PKEY_get_type(EVP_PKEY *pkey) {
if (!pkey)
return EVP_PKEY_NONE;

return EVP_PKEY_type(pkey->type);
}

int PublicRSAKeyToStruct(const char *pubKey) {
BIO* bio;
bio = BIO_new_mem_buf(pubKey, (int)sizeof(pubKey));
if (bio == NULL) {
printf("bio");
return -1;
}

EVP_PKEY* pkey;
PEM_read_bio_PUBKEY(bio, &pkey, NULL, NULL);
if (pkey == NULL) {
printf("pkey");
return -1;
}

int type = EVP_PKEY_get_type(pkey);
if (type != EVP_PKEY_RSA && type != EVP_PKEY_RSA2) {
printf("get type");
return -1;
}

rsaPubkey = EVP_PKEY_get1_RSA(pkey);
if (rsaPubkey == NULL) {
printf("pubkey");
return -1;
}

EVP_PKEY_free(pkey);
BIO_free(bio);
return 0;
}

我们这样调用函数:

status = PublicRSAKeyToStruct(PUBLIC_KEY);
if (status == -1) {
exit(EXIT_FAILURE);
}

我的问题是 PublicRSAKeyToStruct() 函数向我抛出以下用户定义的错误:

get type

这意味着我们未能通过 EVP_PKEY_get_type()。我不明白为什么会这样。我也不知道问题是否出在前面的步骤上。

最佳答案

你的 PEM_read 调用失败了,因为你给它的 BIO 没有访问正确的数据,但你没有检查返回值,也没有初始化 pkey 所以即使它不是valid 你的 pkey == NULL 检查没有发现它。如系统手册页中所述(Windows 除外)或 on the web BIO_new_mem_buf 的第二个参数必须是缓冲区中的字节数,如果缓冲区包含以空字符结尾的 C 字符串,则必须为 -1——并且像您这样的字符串文字确实会产生以空字符结尾的字符串,因此-1 是合适的——但 sizeof(apointer) 两者都不是。

如果您给它一个有效的 EVP_PKEY*,您的代码的其余部分是正确的并且可以正常工作。

关于c - 将 RSA 公钥从字符串传递到 RSA * 结构时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41652092/

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