2012-08-30 87 views
1

我試圖用openssl中的函數RSA_private_decrypt的私鑰解密。演示測試程序已完成,但不幸的是它不起作用。所有代碼都在openssl中從原始測試模塊進行了修改。OpenSSL rsa_private_decrypt錯誤:0406506c:lib(4):func(101):reason(108)

我檢查了密鑰和密文,一切正常。編譯後,試圖運行該程序時出錯: 錯誤:0406506C:lib(4):func(101):reason(108) 這是什麼意思?如何找到原因?任何人都可以幫助我? 謝謝大家!

/* test vectors from p1ovect1.txt */ 

#include <stdio.h> 
#include <string.h> 

#include "e_os.h" 

#include <openssl/crypto.h> 
#include <openssl/err.h> 
#include <openssl/rand.h> 
#include <openssl/bn.h> 
#ifdef OPENSSL_NO_RSA 
int main(int argc, char *argv[]) 
{ 
    printf("No RSA support\n"); 
    return(0); 
} 
#else 
#include <openssl/rsa.h> 

#define SetKey \ 
    BN_dec2bn(&key->n, n); \ 
    BN_dec2bn(&key->d, d); \ 
    BN_dec2bn(&key->e, e); \ 
    return 0; 

int get_key(RSA *key) 
{ 
    static unsigned char n[] = 
"9371630458513538614700745634649520797491568155168133301060614397" 
"9751660657428852845087672310448592787191681231125442581642251207" 
"6274432436386486727760163436686441566403892007588636246674079539" 
"8424907957591099362409156898826262775257410650392782996749570788" 
"0595781666554070793222145163225943407723575126201759"; 

    static unsigned char e[] = "65537"; 

    static unsigned char d[] = 
"1898149483594133261692443925634950319146483294806014944814053061" 
"9149847316274937709472416531865886761023275045576683779067080313" 
"8692140564270476598322907775584173165745869684564814756756282410" 
"5523409115330652968833389931424803742277184063260858317510246331" 
"1992939017567767983973542782514344223016146752560753"; 

    static unsigned char p[] = 
"1898149483594133261692443925634950319146483294806014944814053061" 
"9149847316274937709472416531865886761023275045576683779067080313" 
"8692140564270476598322907775584173165745869684564814756756282410" 
"5523409115330652968833389931424803742277184063260858317510246331" 
"1992939017567767983973542782514344223016146752560753"; 

    static unsigned char q[] = 
"\x00\xC9\x7F\xB1\xF0\x27\xF4\x53\xF6\x34\x12\x33\xEA\xAA\xD1\xD9" 
"\x35\x3F\x6C\x42\xD0\x88\x66\xB1\xD0\x5A\x0F\x20\x35\x02\x8B\x9D" 
"\x89"; 

    static unsigned char dmp1[] = 
"\x59\x0B\x95\x72\xA2\xC2\xA9\xC4\x06\x05\x9D\xC2\xAB\x2F\x1D\xAF" 
"\xEB\x7E\x8B\x4F\x10\xA7\x54\x9E\x8E\xED\xF5\xB4\xFC\xE0\x9E\x05"; 

    static unsigned char dmq1[] = 
"\x00\x8E\x3C\x05\x21\xFE\x15\xE0\xEA\x06\xA3\x6F\xF0\xF1\x0C\x99" 
"\x52\xC3\x5B\x7A\x75\x14\xFD\x32\x38\xB8\x0A\xAD\x52\x98\x62\x8D" 
"\x51"; 

    static unsigned char iqmp[] = 
"\x36\x3F\xF7\x18\x9D\xA8\xE9\x0B\x1D\x34\x1F\x71\xD0\x9B\x76\xA8" 
"\xA9\x43\xE1\x1D\x10\xB2\x4D\x24\x9F\x2D\xEA\xFE\xF8\x0C\x18\x26"; 

    BN_dec2bn(&key->n, n); 
    BN_dec2bn(&key->d, d); 
    BN_dec2bn(&key->e, e); 
    return 0; 
} 

static int pad_unknown(void) 
{ 
    unsigned long l; 
    while ((l = ERR_get_error()) != 0) 
     if (ERR_GET_REASON(l) == RSA_R_UNKNOWN_PADDING_TYPE) 
    return(1); 
    return(0); 
} 

static const char rnd_seed[] = "string to make the random number generator think it has entropy"; 

int main(int argc, char *argv[]) 
    { 
    int err=0; 
    int v; 
    RSA *key; 
    unsigned char ptext[256]; 
    unsigned char err_msg[256]; 
    static unsigned char ptext_ex[] = "\x54\x85\x9b\x34\x2c\x49\xea\x2a"; 
    unsigned char ctext_ex[]= 
    "11A10DBC32E75CD4A4A5FBDF79B9DCEB5FAA8CCA56925F8FFD09265CAE63" 
    "02F4FAD8CF647D2C64107EEE254033B81DD22DACAE7ECBE873CD958D248C" 
    "5F60CD223D5C963077406E398232CF4C36715FD63F640F1AF1E44E86D244" 
    "6FB6B773A17B790938FAC5DFE9257639D60FB1FA4B2082098068549D37C6" 
    "EBD5164E77A68876"; 
    int plen; 
    int clen = 0; 
    int num; 
    int n; 

    CRYPTO_malloc_debug_init(); 
    CRYPTO_dbg_set_options(V_CRYPTO_MDEBUG_ALL); 
    CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON); 

    RAND_seed(rnd_seed, sizeof rnd_seed); /* or OAEP may fail */ 

    plen = sizeof(ptext_ex) - 1; 


    key = RSA_new(); 
    clen = get_key(key); 
    printf("clen[%d]\n", clen); 
    key->flags |= RSA_FLAG_NO_CONSTTIME; 

    key->p=NULL; 
    key->q=NULL; 
    key->dmp1=NULL; 
    key->dmq1=NULL; 
    key->iqmp=NULL; 
    printf("n[%s]\n", BN_bn2dec(key->n)); 
    num = strlen(ctext_ex); 
    printf("num[%d]\n", num); 
    memset(ptext, '\0', sizeof(ptext)); 
    num = RSA_private_decrypt(num, ctext_ex, ptext, key, 
        RSA_PKCS1_PADDING); 
    ERR_error_string(ERR_get_error(), err_msg); 
    printf("num[%d], err[%s]\n", num, err_msg); 
    for(v=0; v<6; v++) { 
     printf("ptext%d[%d]\n", v, ptext[v]); 
    } 
    RSA_free(key); 

    CRYPTO_cleanup_all_ex_data(); 
    ERR_remove_thread_state(NULL); 

    CRYPTO_mem_leaks_fp(stderr); 

#ifdef OPENSSL_SYS_NETWARE 
    if (err) printf("ERROR: %d\n", err); 
#endif 
    return err; 
    } 
#endif 

回答

3

錯...... 最後我找到了原因。 加密文本需要先轉換爲HEX。 我這樣做後,它運作良好。 這真是一個愚蠢的問題。

+0

任何想法如何解讀錯誤信息?我遇到了類似的問題。 – leecbaker

+0

@leecbaker使用'openssl errstr 0406506C'這會打印'錯誤:0406506C:rsa例程:RSA_EAY_PRIVATE_DECRYPT:數據大於mod len' – schnaufi

相關問題