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

问题描述 投票:0回答:1

我正在尝试创建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
c openssl rsa bignum
1个回答
0
投票

您在这里有问题:

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

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

由于您正在使用的二进制数据碰巧也是一个可打印的字符串,因此它在您的第二次测试中也能正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.