我已經編寫了一個使用<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 1024
和openssl rsa -in privkey.pem -pubout > pubkey.pub
這似乎是工作了一段時間,但偶爾(的請求的高峯期,如果該事項)我得到這些加密數據的錯誤之前似乎有效:
message: error:04065072:rsa routines:RSA_EAY_PRIVATE_DECRYPT:padding check failed
'size_key = EVP_PKEY_size(privKey)'然後'len_enc = size_key'對我來說不太合適。它似乎應該從磁盤上的大小知道加密密碼的大小。另外,密文的大小總是*小於模數的大小。在RSA的情況下,我認爲它只是'n-1'。 – jww