我尝试将公共RSA密钥加载到我的程序中。我在C中使用openssl lib。密钥在头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密钥应该保存在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()
。我无法理解为什么会发生这种情况。如果问题出在前面的步骤,我也不知道。
答案 0 :(得分:1)
您的PEM_read调用失败,因为您提供的BIO无法访问正确的数据,但您没有检查返回值,并且您没有初始化pkey
所以即使它无效您的{ {1}}检查没有抓到它。如系统上的手册页(除非Windows)或on the web中所述,pkey == NULL
的第二个参数必须是缓冲区中的字节数,如果缓冲区包含以空值终止的C字符串,则为-1 - 像你这样的字符串文字会产生一个以空字符结尾的字符串,所以-1适合 - 但BIO_new_mem_buf
不是这些字符串。
您的代码的其余部分是正确的,如果您为其提供有效的sizeof(apointer)
,则可以正常工作。