2011-03-15 177 views
0

我的腳本使用openssl_private_decrypt()解密在另一個程序中使用RSA加密的字符串。目前它寫入文件。但是當我嘗試在文本編輯器中打開它時,它說它無法檢測到編碼。如果我嘗試回顯它,則不顯示任何內容。如果我輸出它的長度,我得到256,而不是正確的3RSA解密數據損壞

我知道解密是正確的,因爲在輸出文件上使用cat終端命令可以提供正確的數據。

$ cat decrypted.txt 

看起來這是一個字符編碼問題,我聽到的問題會給PHP帶來很多痛苦。我甚至試過utf8_encode()。問題可能是什麼?

下面的代碼:

$results = ''; 
openssl_private_decrypt(
    base64_decode(
     <<<EOS 
QWlG+AZIt9GE0hw0wwcPRtUWueMLBxj3YWpa5zQBoz1ttnt7TvlxDtYWZcvaUL/qr2CJCADE2iTR 
G72FhAwew2fhqlqmsxL7Nns3yegflTTMXyilVM3mPU4Cx94ylLfa+ZrqrNEepaRorNJ/js5iTq9i 
avegO/kYOv4zhEsZirlk/Mj0vVv6irWo8WyZoCDC2SwfGWeSUI8F4pq4FUkRh9V/0zAUZ+3P0A7Z 
SrA80dSa6U/J+poRcmE1vRLQXvM8dBtFRKmb0zfltLUBMcMhcglzAhcpemJ99OCZmUuynFRcRNkj 
CkOLsO+lSHntcbmXqsKE+of78gnU3tp5hHSHIg== 
EOS 
    ), 
    $results, 
    openssl_pkey_get_private(
     // load private key 
    ), 
    OPENSSL_NO_PADDING 
); 
echo $results; 
+0

請向我們提供您的代碼和示例輸入 – AbiusX 2011-03-15 21:47:46

+0

特別是,您能向我們展示您用於將加密字符串寫入文件的代碼,然後是您用於將其讀取的代碼嗎?另外,你完全不應該在這裏使用'utf8_encode/decode'。加密的數據是一串字節,而不是一串字符。 – Charles 2011-03-15 21:51:58

+2

長度差異也可能是由於加密函數將原始數據填充到加密算法所需的塊大小。 – 2011-03-15 21:52:37

回答

1

事實上,你得到的解密數據正好是單個塊的長度而不是預期數據的長度,這真的是指向padding問題。

確保您使用的是雙面同樣的padding flag

+0

謝謝,我設置雙方使用PKCS1而不是沒有,現在它工作正常。 – Jonah 2011-03-15 22:21:14

0

我不熟悉openssl_private_decrypt,但它似乎是合乎邏輯,我認爲你會提供BASE64_ENCODE()'d數據openssl_private_encrypt()。

在這種情況下,您通過在解密時以錯誤順序運行來損壞數據。

好像你想先解密字符串,然後在未加密的字符串上運行base64_decode()。

+0

好主意,但不幸的是並非如此。在我的其他程序(實際上是用Java編寫的)中,我加密了數據,然後base64對它進行編碼,以便通過HTTP安全地將其發送到此腳本。 – Jonah 2011-03-15 21:57:49