如果应用于 RSA 密钥,为什么 BN_bn2bin 和 BN_bin2bn 不会给我相同的结果?

Why does the BN_bn2bin and BN_bin2bn not give me the same result if applied to an RSA key?

我正在尝试创建一个 RSA 密钥(具有 BIGNUM 类型),然后将其转换为 char* 以便通过客户端-服务器通道发送它,然后再次将其转换为 BIGNUM。问题是,当我进行双重演员时,我没有得到原来的结果。我试图用我创建的另一个 BIGNUM 来模拟这个问题,但似乎只有 RSA 密钥有问题。这是我用于测试的代码

RSA *rsa;

rsa = RSA_generate_key(2048, 65535, NULL, NULL);
if (RSA_check_key(rsa) != 1)
{
    printf("error");
}
const BIGNUM    *rsa_n = BN_new(), // modulul
    *rsa_e = BN_new(), // exponentul public
    *rsa_d = BN_new(); // exponentul privat
RSA_get0_key(rsa, &rsa_n, &rsa_e, &rsa_d);

//TEST 1
unsigned char* rsa_n_char = (unsigned char*)malloc(BN_num_bytes(rsa_n));
BN_bn2bin(rsa_n, rsa_n_char);
BIGNUM *rsa_n2=BN_new();
BN_bin2bn(rsa_n_char, strlen((char*)rsa_n_char) + 1, rsa_n2);
printf("%d\n", BN_cmp(rsa_n2, rsa_n)); // output -1 -> not equal

//TEST 2
unsigned char*test1_char = (unsigned char*)malloc(6);
test1_char = (unsigned char*)"apple";
BIGNUM *test1 = BN_new(), *test2 = BN_new();
BN_bin2bn(test1_char, strlen((char*)test1_char)+1, test1);

unsigned char*test2_char = (unsigned char*)malloc(BN_num_bytes(test1));
BN_bn2bin(test1, test2_char);
BN_bin2bn(test2_char, strlen((char*)test2_char)+1, test2);
printf("%d\n", BN_cmp(test1, test2)); // output 0 ->  equal

你这里有问题:

BN_bin2bn(rsa_n_char, strlen((char*)rsa_n_char) + 1, rsa_n2);

函数strlen 通过查找 NUL 终止符(0 字节)来查找可打印字符串的长度。 rsa_n_char 指向的缓冲区中保存的数据不是可打印的字符串,也不是 NUL 终止的。它是二进制数据 - 甚至可能包含 NUL (0) 字节。您不能对此类数据使用 strlen

它恰好在你的第二次测试中起作用,因为你正在处理的二进制数据恰好也是一个可打印的字符串。