【发布时间】:2021-01-26 16:27:03
【问题描述】:
这是我的代码:
#include <openssl/evp.h>
#include <openssl/pem.h>
#include <string.h>
int main (void)
{
char publicKey[] = "-----BEGIN RSA PUBLIC KEY-----\n"\
"MIIBCgKCAQEAqBa0jeqfHO8CFZuHyN5WgdTd3uThkU/I9lR+bb2R9khVU1tYhiyL\n"\
"Gfnm051K0039gCBAz9S7HHO2lqR/B1kiEGwBzg83N3tL2UzQXXbpxJz0b7vV8rXZ\n"\
"fB9j+FCAtD5znittXRjWrNqlEyJyxK+PuxNF3uPGWSjkYtRKv2f5HCXsfRJah40w\n"\
"5zU+OKZsZMrSSxweYN9Jwc++oMaSPCsGKog6NPbkbcTK8Akveof8v5rpG50I/zcQ\n"\
"9dCD69qJcmhm4ai4fAZFJlsFH2HmxV6DERFs3TNyzGlSQ1gd/XLER7U9nlrOUT87\n"\
"mXreUIXSkAFdCrlHXHOzj0eodfN8IfHjnQIDAQAB\n"\
"-----END RSA PUBLIC KEY-----\n";
char plaintext[] = "enp6";
// base64 decode plaintext
EVP_DecodeBlock(plaintext, plaintext, strlen(plaintext));
BIO* bo = BIO_new(BIO_s_mem());
BIO_write(bo, publicKey, strlen(publicKey));
EVP_PKEY* pkey = 0;
PEM_read_bio_PUBKEY(bo, NULL, NULL, NULL);
BIO_free(bo);
RSA* rsa = EVP_PKEY_get1_RSA(pkey);
char ciphertext[RSA_size(rsa)];
RSA_public_encrypt(strlen(plaintext), plaintext, ciphertext, rsa, RSA_NO_PADDING);
printf("%d\n", (int) strlen(ciphertext));
}
我正在尝试通过 gcc -x c test2.c -lcrypto && ./a.out 运行它。关于我做错了什么有什么想法吗?
【问题讨论】:
-
真的允许
EVP_DecodeBlock的源和目标使用相同的缓冲区(plaintext[])吗?另外,strlen(plaintext);在那之后仍然有效吗?EVP_DecodeBlock返回解码后数据的长度,所以你不应该用它作为解码后的明文长度吗? -
另外,
strlen(ciphertext);似乎不正确,因为ciphertext不是以 null 结尾的字符串。 -
行尾的反斜杠是多余的,因为相邻的字符串文字无论如何都会连接起来。如果你没有在每一行都使用引号,你会使用它
-
@IanAbbott 不幸的是,文档没有说明 EVP_DecodeBlock 是否需要单独的源和目标。因此,要么深入研究源代码,要么防御性地使用不同的缓冲区