我使用phpseclib使用隨機密鑰如下編碼一個JSON文件的內容進行解密:數據與phpseclib加密無法使用OpenSSL的
$plainkey = openssl_random_pseudo_bytes(32);
$iv = openssl_random_pseudo_bytes(16);
$payload_plain = file_get_contents("file.json");
$cipher = new Crypt_AES(CRYPT_AES_MODE_CBC);
$cipher->setKeyLength(256);
$cipher->setKey($plainkey);
$cipher->setIV($iv);
$enc_payload = $cipher->encrypt($payload_plain);
在這一點上,$enc_payload
包含密文,並呼籲$cipher->decode
如預期的那樣,它返回明文。到現在爲止還挺好。
當我此加密的數據寫入到一個文件中,然後嘗試使用openssl
它來解密,使用命令,就會出現問題,如下面的一個:
openssl enc -d -aes-256-cbc -iv 17741abad138acc10ab340aaa7c4b790 -K d96ab4a30d73313d4c525844fce61d9f925e119cf178761b27ad0deab92a32bf -in encrypted.txt -out plain.txt
由此對於-iv值和-K已經通過在上面腳本中獲得的隨機字節值上使用bin2hex獲得。
運行該命令給我一個錯誤,plain.txt
包含原始json字符串的一半正確/半擾亂版本。 錯誤:
bad decrypt
13124:error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length:.\crypto\evp\evp_enc.c:323:
我在想什麼?我想可能是我在鍵/ iv上使用bin2hex的部分是不正確的,但我已嘗試直接使用字節字符串,沒有任何成功。這是如何正常完成的?或者我錯過了任何明顯的東西?
謝謝
首先檢查加密的數據是的整數倍OG塊的大小(16字節用於AES)得到了OpenSSL的參數。可能會使用不同的填充。檢查默認填充是什麼。爲了調試沒有指定填充的解密,看看解密是否沒有錯誤,如果是的話就是填充。然後查看最後一塊解密數據以確定填充。 – zaph
這可能不是填充。你能顯示密文嗎? –
在你的PHP代碼中,你正在使用隨機鍵和IV。在你的OpenSSL命令中,你正在使用一個固定的Key和IV。它看起來像'EVP_BytesToKey'是一個常見的嫌疑犯。也許你應該爲這兩個例子使用固定的Key和IV來讓你達到基線。另請參閱[加密(cryptojs) - 解密(erlang)](https://stackoverflow.com/q/34542736/608639)。 – jww