1

私は暗号化に不慣れです。AES128ビット暗号化で文字列をエンコードしたい。私は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の両方で同じ出力を取得しようとしている理由は、2つの別々のWebサービスが相互に通信するためです。1つのサービスではPHPを使用できるので、それを使用できますが、もう1つのサービスではPHPを使用しないため、コマンドラインでopensslを使用する必要があります。

4

1 に答える 1

1

パスワードとキーを混同しました。-popensslコマンドラインにを追加して、使用されている実際のキーを確認し、 http://php.net/manual/en/function.mcrypt-encrypt.php string mcrypt_encrypt ( string $cipher , string $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 に答える