2014-03-12 316 views
1

我使用PEM_read_RSAPrivateKey功能以这样的方式PEM_read_RSAPrivateKey:获取RSA密钥公共模数和指数

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结构复制模量或公用指数到我的结构“的”领域?

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

西尔

+0

有一个完整的OpenSSL/RSA测试程序名为'test-rsa.c'位于[由openssl生成的私钥不满足n = p * q](http://stackoverflow.com/questions/22119835/private -key生成逐OpenSSL的-不-未满足-NPQ)。这会对你造成什么影响吗? – jww

回答

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位数组中。

+0

嗨,非常感谢您的帮助,不幸的是,一旦我运行int req = BN_num_bytes(privateKey-> n),就会出现分段错误; ...在“RSA结构填充”被打印之后,我把这一行放在了我之前的函数中 – Sylvain

+0

你在Mac OS X上吗? – jww

+0

我正在cygwin下工作,使用xubuntu时遇到同样的问题 – Sylvain