【问题标题】:PEM_read_RSAPrivateKey: Getting RSA key public modulus and exponentPEM_read_RSAPrivateKey:获取 RSA 密钥公共模数和指数
【发布时间】:2014-04-16 11:47:32
【问题描述】:

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

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

西尔万

【问题讨论】:

标签: c openssl rsa


【解决方案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 位数组中。

【讨论】:

  • 嗨,非常感谢您的帮助,不幸的是,我一运行 int req = BN_num_bytes(privateKey->n); 就会遇到分段错误。 ...在打印“RSA 结构填充”后,我将这一行放在我之前的函数中
  • 显示您用于构建程序的命令行。同时显示openssl version的输出。
  • 嘿,我发现了我的问题,我也有这个警告,我选择忽略:注意:赋值使指针从整数不进行强制转换 [默认启用] privateKey=PEM_read_RSAPrivateKey(fp,NULL,NULL ,空值);我使用 PEM_read_RSAPrivateKey(fp,& privateKey,NULL,NULL);我可以访问'n'。这是我的信息编译行: gcc -g -O0 -o atmel_test.o -c atmel_test.c gcc -g -o atmel_test atmel_test.o -lssl -lcrypto -lpthread -O0 -g
  • 文档应该更新,因为这种行为不是预期的:PEM_read_RSAPrivateKey 返回的整数没有被记录。非常感谢您的帮助和所需的分配
  • 您是否#include openssl/pem.h 声明正确?如果没有,并且使用 gcc 的默认值 -std=gnu89,您将获得所有函数的 K&R1 隐式声明为“返回 int 的未知参数”。这将对返回 int 发出警告,但不能对参数发出警告,因为它不知道它们应该是什么类型。即便如此,我希望不正确的转换只会在 64 位上导致错误。
【解决方案2】:

从 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 2015-10-13
    • 2018-06-10
    • 2010-10-31
    • 2020-08-13
    • 1970-01-01
    • 2013-07-15
    • 2019-09-22
    相关资源
    最近更新 更多