无法通过OpenSSL加密解密PHP中的文件

时间:2016-01-10 19:10:41

标签: php curl encryption

我在命令行上使用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
KWA6HNqb9UydXPbh72Vej82rT7NMVQZE

     

cat 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));

1 个答案:

答案 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扩展。