【问题标题】:Can't decrypt file in PHP from OpenSSL encryption无法通过 OpenSSL 加密解密 PHP 中的文件
【发布时间】:2016-04-15 01:28:09
【问题描述】:

我在命令行上使用 OpenSSL 加密 JSON 对象。但是,当我使用 cURL 发送它然后尝试解密它时,我只会得到不可打印的字节。这是我的过程:

在 OpenSSL 中加密

openssl aes-128-cbc -in object.json -out cipher.txt -pass pass:key.file -base64

cat object.json
{"payload":"这是一个测试"}

猫密钥文件
KWA6HNqb9UydXPbh72Vej82rT7NMVQZE

猫密码.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));

【问题讨论】:

  • 您是否尝试过改用openssl_decrypt
  • 是的。我只是得到一个空字符串作为解密结果。我将编辑我的帖子以显示这一点。好建议。谢谢!
  • 嗯。另一个想法,您是否尝试过在加密后对数据进行 base64 编码,以便将其传递给脚本而不会出现任何可能的错误?从cat的结果来看,这可能是个问题。

标签: php curl encryption


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 2020-04-14
    • 2018-11-28
    • 1970-01-01
    • 2023-04-04
    • 2011-06-12
    • 1970-01-01
    相关资源
    最近更新 更多