2013-06-03 35 views
4

我已經編寫了一個使用<openssl/rsa> C庫永久運行的程序。
它基本上解密了參數中給出的密碼。問題是,有時它完美的作品,它失敗了一些其他時間(與同PUBKEY /的privKey /密碼,返回此錯誤:不穩定的openssl/rsa行爲:RSA_EAY_PRIVATE_DECRYPT:填充檢查失敗

message: error:04065072:rsa routines:RSA_EAY_PRIVATE_DECRYPT:padding check failed 

有沒有人經歷了 爲什麼返回這種類型的錯誤?一般


更多的細節

它檢索在程序有以下初始化私鑰:

#define PRIVFILE "<correct-path>/privkey.pem" 
EVP_PKEY *privKey; 
int size_key; 
FILE *fp = fopen(PRIVFILE, "r"); 
if (!fp) 
{ 
    <logs> 
    return -1; 
} 
PEM_read_PrivateKey(fp, &privKey, 0, NULL); 
fclose (fp); 
if (privKey == NULL) 
{ 
    ERR_print_errors_fp (stderr); 
    return -1; 
} 
size_key = EVP_PKEY_size(privKey); 

後來,收聽循環中,一個方法調用私有解密算法

int len_enc = size_key; 
unsigned char* enc_pw; 
unsigned char* dec_pw; 
int len_dec = 8; 
char* err = malloc(130); 
enc_pw = malloc(len_enc); 
dec_pw = malloc(len_dec); 
memset(enc_pw, 0, len_enc); 
memset(dec_pw, 0, len_dec); 
memcpy(enc_pw, value, len_enc); //value being the raw ciphered data to decrypt 
ERR_load_crypto_strings(); 
if (RSA_private_decrypt(len_enc, enc_pw, dec_pw, privKey->pkey.rsa,RSA_PKCS1_OAEP_PADDING) == -1) 
{ 
ERR_error_string(ERR_get_error(), err); 
radlog(L_ERR, "message: %s", err); 
} 
free(enc_pw); 
free(dec_pw); 
free(err); 
  • 我已經做了加密的數據使用Perl的地穴:: OpenSSL的:: RSA:

    my $ rsa_pub = Crypt :: OpenSSL :: RSA-> new_public_key($ key_string);
    my $ ciphertext = $ rsa_pub-> encrypt($ plaintext);

  • 有一些base64編碼/解碼,我沒有提到,使它縮短一點。問題不是來自這個問題。

  • 私鑰和公鑰使用OpenSSL genrsa產生: openssl genrsa -out privkey.pem 1024openssl rsa -in privkey.pem -pubout > pubkey.pub

這似乎是工作了一段時間,但偶爾(的請求的高峯期,如果該事項)我得到這些加密數據的錯誤之前似乎有效:

message: error:04065072:rsa routines:RSA_EAY_PRIVATE_DECRYPT:padding check failed 
+0

'size_key = EVP_PKEY_size(privKey)'然後'len_enc = size_key'對我來說不太合適。它似乎應該從磁盤上的大小知道加密密碼的大小。另外,密文的大小總是*小於模數的大小。在RSA的情況下,我認爲它只是'n-1'。 – jww

回答

1

它是一個多線程應用程序嗎?

昨天我得到了同樣的問題,在我的情況下,它涉及到多個使用鍵的線程(一個用於腳本和許多其他腳本)。這個問題已經通過互斥信號量解決了關鍵問題。

該服務自昨天起保持穩定。

+0

是的,我必須做同樣的事情:) – yco