1

我是加密新手。我想用 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。

4

1 回答 1

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
于 2012-08-05T19:07:35.983 回答