PHP的mcrypt_encrypt和openssl命令行输出不同的密码

时间:2012-08-05 18:49:14

标签: php encryption openssl aes

我是加密新手。我想用AES 128位加密编码一个字符串。我可以用PHP做到这一点:

$key = 'Hello';
$plain = 'Hello Hello Hello Hello';

$cipher = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $plain, MCRYPT_MODE_CBC);

echo base64_encode($cipher);

输出:

bzXdTNochlsQwpR9hzSSS6ihG+MYIZIDZZlF85pIXlQ=

我尝试使用openssl命令行:

openssl enc -aes-128-cbc -a -nosalt -in plain.txt -out encrypted.enc -pass pass:Hello

保存在encrypted.enc中的字符串是:

5apwiN8MdAuJ9nEW82XMyR0H3VKpI/vWc7xV2iVjCTE=

为什么会有所不同?

我试图用PHP和命令行openssl获得相同输出的原因是因为我将有两个单独的Web服务一起通信。一个服务将提供PHP,所以我可以使用它,但另一个服务不会使用PHP,所以我可能不得不在命令行中使用openssl。

1 个答案:

答案 0 :(得分:1)

你混淆了密码和密钥。在openssl命令行中添加-p以查看使用的实际密钥,并观察http://php.net/manual/en/function.mcrypt-encrypt.php string mcrypt_encrypt ( string $cipher , string $key< = key!不是密码。

编辑:

你也有填充问题。现在使你的纯文本48个字符(3 * 128位= 3 * 16字节)长:

$plain = 'Hello Hello Hello Hellox';
$plain .= $plain;
function hexstr($hexstr) {
  // return pack('H*', $hexstr); also works but it's much harder to understand.
  $return = '';
  for ($i = 0; $i < strlen($hexstr); $i+=2) {
    $return .= chr(hexdec($hexstr[$i] . $hexstr[$i+1]));
  }
  return $return;
}
$cipher = @mcrypt_encrypt(MCRYPT_RIJNDAEL_128, hexstr('25c506a9e4a0b3100d2d86b49b83cf9a'), $plain, MCRYPT_MODE_CBC, hexstr('00000000000000000000000000000000'));

echo base64_encode($cipher);
echo "\n";

openssl enc -aes-128-cbc -a -iv 0  -nosalt -in plain.txt  -K 25c506a9e4a0b3100d2d86b49b83cf9a -nopad

结果相同:

EZjBup0sfRAkIZ2/IQ3bKHWXHG4qBVv4uyW0PnxJJWvWHanNgE1QyBHMpWoZqejR