PEM_read_RSAPrivateKey: 获取RSA密钥的公共模数和指数。

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

我是这样使用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

c openssl rsa
2个回答
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
投票

从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);
© www.soinside.com 2019 - 2024. All rights reserved.