2011-07-13 6 views
0

は、私はこれを実装し、エラー取得しています:0407B07B:RSAルーチン:RSA_check_keyを:BitLen 1024 MS CAPI PRIVATEKEYBLOB *

1と合同ではないDE、ModLen 128、Prime1、Prime2、Exponent1、Exponent2は、係数=長さを64 PrivateExponentレン= 128

RSA* blobtorsa() 
{ 
    BN_set_word(rsa->e, prsahdr->pubexp); 
    lend_tobn(rsa->n, pbmod, cbmod); 
    lend_tobn(rsa->p, pbprime1, cbprimes); 
    lend_tobn(rsa->q, pbprime2, cbprimes); 
    lend_tobn(rsa->d, pbprivexp, cbprivexp); 
    // d mod (p - 1) 
    BN_mod_sub(rsa->dmp1, rsa->d, BN_value_one(), rsa->p, ctx); 
    // d mod (q-1) 
    BN_mod_sub(rsa->dmq1, rsa->d, BN_value_one(), rsa->q, ctx); 
    BIGNUM* negone = BN_new(); 
    BN_set_word(negone, -1); 
    // q^-1 mod p 
    BN_mod_exp(rsa->iqmp, rsa->q, negone, rsa->p, ctx); 
    if (RSA_check_key(rsa) == 0) 
    { 
     print error 
     error:0407B07B:rsa routines:RSA_check_key:d e not congruent to 1 
    } 
} 
+0

うわー - もっと慎重に自分のコードをチェックすればいいですか? BN_メソッドのすべてを正しく取得すると、うまく動作します。 – steve

答えて

0

他の誰のために不思議 - あなたが構造内の別々の アイテムへのポインタとサイズを得れば:

{ 
    BIGNUM* temp = BN_new(); 

    rsa->e = BN_new(); 
    BN_set_word(rsa->e, prsapk->pubexp); 

    // set n, p, q and d from structures 
    rsa->n = BN_new(); 
    lend_tobn(rsa->n, pbMod, cbMod); 
    rsa->p = BN_new(); 
    lend_tobn(rsa->p, pbPrime1, cbPrime1); 
    rsa->q = BN_new(); 
    lend_tobn(rsa->q, pbPrime2, cbPrime2); 
    rsa->d = BN_new(); 
    lend_tobn(rsa->d, pbPrivateExponent, cbPrivateExponent); 

    // calculate the remainder of properties 

    // d mod (p-1) 
    rsa->dmp1 = BN_new(); 
    BN_copy(temp, rsa->p); 
    BN_sub_word(temp, 1); 
    BN_mod(rsa->dmp1, rsa->d, temp, ctx); 

    // d mod (q-1) 
    rsa->dmq1 = BN_new(); 
    BN_copy(temp, rsa->q); 
    BN_sub_word(temp, 1); 
    BN_mod(rsa->dmq1, rsa->d, temp, ctx); 

    // q^-1 mod p 
    rsa->iqmp = BN_new(); 
    BN_mod_inverse(rsa->iqmp, rsa->q, rsa->p, ctx); 

    BN_free(temp); 

    BN_CTX_end(ctx); 
    BN_CTX_free(ctx); 

    ERR_clear_error(); 
    if (RSA_check_key(rsa) == 1) 
      { 
      } 

}