我是这样使用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 "字段?
谁能帮帮这个忙吗?
Sylvain
如何从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位数组中。
从OpenSSL 1.1.0开始,许多结构都变得不透明了,你再也不能直接查看结构中的字段了,你应该使用提供的访问函数来代替。这里你可以找到更多的信息。https:/wiki.openssl.orgindex.phpOpenSSL_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);