2017-07-07 109 views
2

我有n,e,d組件來自其他設備而不是OpenSSL。我想要使​​用OpenSSL API進行加密和解密。但加密後解密總是失敗。使用RSA_set0_key(key,n,e,d)時RSA_public_decrypt失敗?

我用RSA_set0_key的私有密鑰(ned)設置,RSA_private_encrypt是OK,但RSA_public_decrypt總是失敗。我想知道它爲什麼失敗。

爲什麼RSA_public_decrypt失敗?

+1

失敗如何?你的代碼在哪裏?錯誤信息在哪裏? –

+0

注意'private_encrypt'和'public_decrypt'確實是簽名而非加密,並且(如文檔所述)不是標準的;這些名字是20世紀90年代誤導性的歷史遺蹟。也就是說,它適用於1.1.0版本,顯而易見的變體設置n,e,d直接在1.0.2 1.0.1 1.0.0和0.9.8中運行。 MCVE? –

回答

1

RSA_set0_key()有N,E,D有可能嗎?

是的。在OpenSSL手冊頁中記錄了RSA_set0_key。其簽名是:

int RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d); 

的描述是:

的N,e和d的參數值可以通過調用RSA_set0_key()並傳遞新的值對於n,e和d作爲參數來設定到功能。在給定的RSA對象上首次調用該函數時,值n和e必須爲非NULL。值d可能是NULL。在隨後的調用中,這些值中的任何值都可能爲NULL,這意味着相應的RSA字段保持不變。調用該函數將值的內存管理傳遞給RSA對象,因此調用此函數後調用者不應該釋放已傳入的值。

再往下,下返回值

RSA_set0_key(),RSA_set0_factors和RSA_set0_crt_params()上成功失敗返回1或0。


我用RSA_set0_key關鍵(N,E,d)設置,RSA_private_encrypt是OK,但RSA_public_decrypt總是

失敗很難說是怎麼回事你使用RSA_public_decrypt。也許你可以添加一些代碼,說明返回值是什麼,並在函數失敗時聲明ERR_get_err的值。

在此期間,你可能需要您的RSA對象有擴展的私有密鑰參數,如pqdpdq,和qInv。那些是中國剩餘定理(CRT)參數,並且它們被設置爲RSA_set0_crt_params。另請參閱OpenSSL用戶郵件列表上的Unable to decrypt without Chinese Remainder Theorem factors?

+0

OpenSSL _can_只用d來完成RSA私鑰操作,儘管效率較低。您鏈接的郵件清楚地說明問題出在讀取一個非CRT密鑰(來自PEM),而不是使用內存中正確的密鑰。 –

0

我找到了原因。使用OS2IP反轉鍵(n,d)的順序後,它可以工作。感謝幫助。

相關問題