2017-08-10 7 views
0

PHPの下でMcryptを使って生成されたOpenSSLを使って値を解読できる必要があります。OpenSSLを使用して、ASCIIキーを使用したMcryptで生成された値を解読する方法は?

暗号化に使用されたキーがASCIIであることを除いて、私はこれを使用しています。

以下は、鍵がMD5の場合、OpenSSLがMcryptで暗号化された値を復号化できる実例を示すコードです。あなたが値に$keyを変更した場合

<?php 
$message = 'test'; 
$key = md5('Quigibo'); 

$iv = openssl_random_pseudo_bytes(0); 

$encrypted = mcrypt_encrypt(
    MCRYPT_BLOWFISH, 
    $key, 
    $message, 
    MCRYPT_MODE_ECB, 
    $iv 
); 

$decrypted = openssl_decrypt(
    $encrypted, 
    'bf-ecb', 
    $key, 
    OPENSSL_RAW_DATA | OPENSSL_NO_PADDING, 
    $iv 
); 

$trimDecrypted = rtrim($decrypted); 

var_export(
    [ 
     'Original message' => $message, 
     'Encrypted' => bin2hex($encrypted), 
     'Decrypted' => $decrypted, 
     'Trim decrypted' => $trimDecrypted, 
     'Message length' => mb_strlen($message, '8bit'), 
     'Decrypted length' => mb_strlen($decrypted, '8bit'), 
     'Message == decrypted' => $message === $trimDecrypted 
    ] 
); 

はしかし、「Quigibo」(その値のMD5ハッシュではなく)暗号化された値は、OpenSSLでデコードすることはできません。

エンコード形式はありますか?OpenSSLで使用する前にASCIIキーに適用して、値を正しく復号化できるようにしますか?

+1

キーの長さが短すぎると、暗号化タイプに応じてmcryptでヌルが埋められます。長いASCIIキーを使用して、それが機能するかどうかを確認してください。そうであれば、これは問題であり、ライブラリの違いです。 –

+0

[McryptからOpenSSLへの暗号化ライブラリのアップグレード](http://stackoverflow.com/q/43329513/608639)、[McryptをOpenSSLで置き換える](http://stackoverflow.com/q/9993909/608639)を参照してください。と[PHP 7.2でのMcryptの削除の準備](http://stackoverflow.com/q/42696657/608639) – jww

+0

https://stackoverflow.com/questions/41181905/php-mcrypt-encrypt-to-openssl -encrypt-and-openssl-zero-padding-問題、OpenSSLをMcryptと同じ方法で暗号化しようとすると、ヌルパディングも問題になります。 – user2045006

答えて

1

改訂答え:

パッド暗号は可変長キーをサポートしているので、間違っているフグのための16バイトの鍵を、ヌルのOpenSSLにバグがあります。 OPENSSL_DONT_ZERO_PAD_KEYを修正するためのフラグが追加されましたが、これは1週間前にリリースされたPHP 7.1.8でのみ利用可能です。関連するバグ:https://bugs.php.net/bug.php?id=72362

回避策は、キーを入力してOpenSSLに入力してください:

$keylen = (floor(mb_strlen($key, '8bit')/8)+1)*56; 
$key_cycled = substr(str_repeat($key,ceil($keylen/strlen($key))),0,$keylen); 

$decrypted = openssl_decrypt(
$encrypted, 
'bf-ecb', 
$key_cycled, 
OPENSSL_RAW_DATA | OPENSSL_NO_PADDING, 
$iv 
); 
+0

16文字以上のキーを使用すると機能します。残念ながら私の鍵は少ないです。ショート・キーを '' \ 0 ''で埋めても動作しません(' str_pad($ key、$ pad、chr(0))) ')私は成功しなければすべてのパディング値を試しました。それがパディングされていないか、またはヌル以外のもので埋められていると考えてください。 – user2045006

+0

あなたはどのバージョンのmcryptを使用していますか?あまりにも新しいバージョンを使用している場合は、FALSEを返し、上記のテストコードでデータの暗号化を一切拒否します。 –

+0

OPENSSL_DONT_ZERO_PAD_KEYを追加すると、OpenSSLに正確なキーサイズを使用させることができます(関連:https://bugs.php.net/bug.php?id=72362、https://bugs.php.net/bug.php ?id = 71917)これはmcryptが可変長キーをサポートしているので、ブロッフィッシュのキーパッド動作を持たないことを示唆しているこのSOの投稿を見つけました:https://stackoverflow.com/questions/16331928/how-long-is-デフォルトでキーサイズが使用されるmcrypt-blowfish –

関連する問題