我以这种方式使用PEM_read_RSAPrivateKey函数:
void test(void)
{
RSA * privateKey = NULL;
FILE * fp;
if(NULL != (fp= fopen("./my_file.key", "r")) )
{
privateKey=PEM_read_RSAPrivateKey(fp,NULL,NULL,NULL);
if(privateKey==NULL)
{
printf("\n\tCould NOT read RSA private key file");
}
else
{
printf("\n\tRSA structure filled");
}
// This is working OK and privateKey is NOT NULL
}
}
然后,我尝试检索模数和公共指数,将它们填充到个人结构中:
struct
{
unsigned char modulus[256];
unsigned char pub_exp[8];
} s;
但我尝试的所有访问(我尝试过很多次)到privateKey-> n都会导致分段错误。
例如:
unsigned char modulus [2048];
unsigned char exp[2048];
BN_bn2bin(privateKey->n, modulus); // Segmentation fault results from this call
所以我的问题是:如何将模数或公共指数从RSA结构复制到我的结构" s"字段?
有人可以帮忙吗? 非常感谢, 的问候,
西尔
答案 0 :(得分:1)
如何从RSA结构复制模数或公共指数
int req = BN_num_bytes(rsa->n);
assert(rc > 0);
unsigned char* buff = malloc(req);
assert(buff != NULL);
int rc = BN_bn2bin(rsa->n, buff);
assert(req == rc);
要小心尝试将字节缓冲区复制到固定大小的数组中。有人可能会让你将4096位模数复制到你的2048位数组中。
答案 1 :(得分:1)
从OpenSSL 1.1.0起,许多结构都变得不透明,您不能再执行直接查看结构中字段的操作。 您应该改用提供的访问器函数。在这里您可以找到更多信息:https://wiki.openssl.org/index.php/OpenSSL_1.1.0_Changes
在OpenSSL 1.1.0中访问rsa-> n:
RSA *pRsa;
BIGNUM *n;
FILE *pFile = fopen("private.key","r");
pRsa = PEM_read_RSAPrivateKey(pFile, NULL, NULL, password);
RSA_get0_key(pRSA, &n, NULL,NULL);
BN_print_fp(stdout, n);