2014-03-12 315 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