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



我正在尝试创建一个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("%dn", 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("%dn", 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

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

相关内容

最新更新