2017-08-18 35 views
1

私はCBCモードでAES 128暗号化を行い、それをcoldfusionの同じAES暗号化と一致させる必要があります。ここでopenssl_encrypt VS mcrypt_encrypt

は、PHPで私のコードです:

function pkcs5_pad($text, $blocksize) { 
    $pad = $blocksize - (strlen($text) % $blocksize); 
    return $text . str_repeat(chr($pad), $pad); 
} 

$key = "vRJ6XSUi7OGebUK+n1vKkA=="; 
$iv = "AF9iPTpJC+zEa2auUxuloQ=="; 
$data = $this->pkcs5_pad("Message to encrypt", 16); 
echo openssl_encrypt($data, 'aes-128-cbc', $key, 0, base64_decode($iv)); 
echo "<br>"; 
echo base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, base64_decode($iv))); 

MCRYPT_ENCRYPTは減価償却が、私のColdFusionと同じで互換性のある結果を与えている:qLz13+xk19lZjSbfs92Ze5akuDbWOsNF2rYZN7aaEHc=をしかしopenssl_encryptは私に切り抜いた値を与える:dnEcUy2tmvLZhZclnEwRpYHEbHajzmkpwbPorfNw5eN4d37MadEiPGLPvNAZmW4Q

どのようにすることができます私はopenssl_encryptをmcrypt_encryptと同じ値にしますか?それはそれの代わりになるはずですか?

+0

[3DES-ECB暗号化のためにMcryptを置き換えるためにopenssl_encryptを使用する](http://stackoverflow.com/q/39467008/608639)、[AES-256-CBCのpgcryptoを使用して解読することはできませんが、AES- CBCはOKです](http://stackoverflow.com/q/43550818/608639)、[MCrypt rijndael-128からOpenSSL aes-128-ecbへの変換](http://stackoverflow.com/q/45218465/608639)、 [McryptからOpenSSLへの私の暗号化ライブラリのアップグレード](http://stackoverflow.com/q/43329513)、[McryptをOpenSSLで置き換える](http://stackoverflow.com/q/9993909/608639)、および[PHP 7.2でMcryptを削除する準備をする](0120-385-331) – jww

答えて

2

2つの問題:

  1. あなたはBase64では、キーを解読されていないので、あなたはopenssl_encryptmcrypt_encryptの両方に24バイト(= 192ビット)の鍵を渡しています。どうやら、これらの関数はそのようなキーをさまざまな方法で解釈します。 base64_decode一貫した結果を得るための鍵

    また、Base64でエンコードされた文字列を192ビットのキーとして使用する場合は、方法として'aes-192-cbc'openssl_encrypt()に渡します。これはmcryptがここでやっていることです。 (どちらがあなたが暗号としてMCRYPT_RIJNDAEL_192を通過した場合に何が起こるかと同じではありません - ブロックサイズではなく、キーのサイズを変更すること!)

  2. openssl_encryptが自動的にPKCS5パディングを使用しています。データをこの関数に渡す前にデータをパディングすると、データが2回パディングされ、意図したよりも1ブロック長くなります。

これらの問題を修正すると、両方の機能が同じ結果になります。

+0

いいえ、それは私の質問のポイントではありません、もし私があなたの説明に従えば、私はまったく同じ結果になります。私はcoldfusionでAESから得た結果とは今や異なっています。 mcrypt_encryptが結果を出していました。一致するものが必要です。同じものを与えるためにopensslが必要です。qLz13 + xk19lZjSbfs92Ze5akuDbWOsNF2rYZN7aaEHc = as mcrypt_encrypt –

+1

@oussamakamalそれについてのメモを追加しました。私は 'aes-192-cbc'の下でBase64でエンコードされたキーを使ってその出力を再現しました。 – duskwuff

+0

はい、ありがとうございました。 –

関連する問題