我在命令行上使用OpenSSL加密JSON对象。但是,当我使用cURL发送它然后尝试解密它时,我只是得到不可打印的字节。这是我的过程:
在OpenSSL中加密
openssl aes-128-cbc -in object.json -out cipher.txt -pass pass:key.file -base64
cat object.json
{"有效载荷":"这是一个测试"}cat key.file
KWA6HNqb9UydXPbh72Vej82rT7NMVQZEcat cipher.txt U2FsdGVkX1 / OOX / XSRXXOCmxfak5TXbagG6ZSW6U95U + VLADuaH83zmP8hee017J
key.file正好是32个字节。我有相同的key.file驻留在服务器上。我已经验证它也是32个字节。
使用cURL发送
curl --data "@cipher.txt" http://www.example.com/myscript.php
php脚本
$key = file_get_contents("key.file");
echo $key . "\n";
// get the ciphertext from the POST parameter
$ciphertext = rawurlencode(file_get_contents("php://input"));
echo $ciphertext . "\n";
echo base64_decode(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $ciphertext, MCRYPT_MODE_CBC));
以下是我的回复:
KWA6HNqb9UydXPbh72Vej82rT7NMVQZE U2FsdGVkX1%2FOOX%2FXSRXXOCmxfak5TXbagG6ZSW6U95U%2BVLADuaH83zmP8hee017J
G /
我不知道自己做错了什么。谁能告诉我我犯错误的地方?谢谢!
修改 我也尝试使用此命令进行解密,但结果我得到一个空字符串:
echo base64_decode(openssl_decrypt($ciphertext, "AES-128-CBC", $key, OPENSSL_RAW_DATA));
答案 0 :(得分:3)
-pass pass:key.file
表示您使用从密码key.file
派生的密钥加密明文。如果要使用 key.file 的第一行,则需要使用-pass file:key.file
。您可能不想要,因为密码不是密钥。 PHP的mcrypt或openssl扩展不提供从密码使用相同密钥派生的直接方法。您可以使用我的代码here从密码中获取相同的密钥和IV。
您需要使用OpenSSL命令行实用程序的-K
选项传入256位"密钥" (键应包含任意字节,而不仅仅是可打印的字节)。密钥以十六进制编码形式传递。如果你这样做,那么你还需要通过-iv
选项传入128位IV。
因为你的"键"长度为256位(32字节),则需要指定aes-256-cbc
。
其他问题:
OpenSSL默认使用PKCS#7填充(与PKCS#5填充同义),但是mcrypt将明文填充为0到15 0x00字节,这是不兼容的。在PHP中使用正确使用PKCS#7填充的openssl扩展。