2017-07-07 56 views
0

我使用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的部分是不正確的,但我已嘗試直接使用字節字符串,沒有任何成功。這是如何正常完成的?或者我錯過了任何明顯的東西?

謝謝

+2

首先檢查加密的數據是的整數倍OG塊的大小(16字節用於AES)得到了OpenSSL的參數。可能會使用不同的填充。檢查默認填充是什麼。爲了調試沒有指定填充的解密,看看解密是否沒有錯誤,如果是的話就是填充。然後查看最後一塊解密數據以確定填充。 – zaph

+1

這可能不是填充。你能顯示密文嗎? –

+3

在你的PHP代碼中,你正在使用隨機鍵和IV。在你的OpenSSL命令中,你正在使用一個固定的Key和IV。它看起來像'EVP_BytesToKey'是一個常見的嫌疑犯。也許你應該爲這兩個例子使用固定的Key和IV來讓你達到基線。另請參閱[加密(cryptojs) - 解密(erlang)](https://stackoverflow.com/q/34542736/608639)。 – jww

回答

1

它對我來說工作得很好。我的代碼(改編自你的):

<?php 
include('Crypt/AES.php'); 

$plainkey = pack('H*', 'd96ab4a30d73313d4c525844fce61d9f925e119cf178761b27ad0deab92a32bf'); 
$iv = pack('H*', '17741abad138acc10ab340aaa7c4b790'); 

$payload_plain = file_get_contents('plaintext.txt'); 

$cipher = new Crypt_AES(CRYPT_AES_MODE_CBC); 
$cipher->setKeyLength(256); 
$cipher->setKey($plainkey); 
$cipher->setIV($iv); 

$enc_payload = $cipher->encrypt($payload_plain); 

file_put_contents('ciphertext.txt', $enc_payload); 

我解密這個:

openssl enc -d -aes-256-cbc -iv 17741abad138acc10ab340aaa7c4b790 -K d96ab4a30d73313d4c525844fce61d9f925e119cf178761b27ad0deab92a32bf -nosalt -p -in encrypted.txt -out plaintext.txt 

不同的是,我有-p-nosalt-p只是打印出來的鑰匙,但也許-nosalt是你所需要的。

或者問題可能比這個更簡單。在你發佈的代碼片段中,你沒有迴應或在任何地方保存密鑰/ iv。也許你沒有輸出正確的值。

我從http://phpseclib.sourceforge.net/interop.html#aes,p1openssl,p2phpseclib

+0

你好,謝謝你的回覆。這正是你使用的代碼嗎?我將它逐字拷貝(在openssl命令中減去一個小的變化,'ciphertext.txt'而不是'encrypted.txt',並且我仍然在openssl:/ – user3816703

+0

Aaaa中得到了錯誤的最終塊長度錯誤,如果'plaintext.txt'包含一個像「hello world」這樣的簡短字符串,我猜它是要麼是我的明文的長度,要麼是導致錯誤的內容,仍在挖掘中,再次感謝指針:) – user3816703

+0

@ user3816703 - 我測試的明文是18KB。當我下班回家時,我會嘗試使用各種引擎而不是默認引擎,看看是否能夠讓我重現您的問題。同時......您使用的是什麼版本的phpseclib? – neubert