我正在使用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的部分是不正确的,但我尝试直接使用字节字符串而没有任何成功。这是怎么做到的?或者我错过了什么明显的东西?
由于
答案 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参数