使用openssl无法解密使用phpseclib加密的数据

时间:2017-07-07 12:58:02

标签: php openssl aes phpseclib

我正在使用phpseclib使用随机密钥对json文件的内容进行编码,如下所示:

$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使用{1}}之类的命令解密时出现问题:

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

通过对上面脚本中获得的随机字节值使用bin2hex获得-iv和-K的值。

运行该命令会给我一个错误,plain.txt包含原始json字符串的半正确/半加扰版本。 错误:

bad decrypt
13124:error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length:.\crypto\evp\evp_enc.c:323:

我缺少什么?我想也许我在key / iv上使用bin2hex的部分是不正确的,但我尝试直接使用字节字符串而没有任何成功。这是怎么做到的?或者我错过了什么明显的东西?

由于

1 个答案:

答案 0 :(得分:1)

它对我来说很好。我的代码(改编自你的代码):

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

我用这个解密:

-p

不同之处在于我有-nosalt-p-nosalt只打印出密钥,但{{1}}可能就是您所需要的。

或许问题比这更简单。在您发布的代码段中,您不会在任何地方回显或保存密钥/ iv。也许你没有输出正确的价值。

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

获得了OpenSSL参数