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

时间:2014-03-12 11:20:10

标签: c openssl rsa

我以这种方式使用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"字段?

有人可以帮忙吗? 非常感谢, 的问候,

西尔

2 个答案:

答案 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);