web-dev-qa-db-ja.com

MCryptrijndael-256からOpenSSLaes-256-ecbへの変換

Mcryptは非推奨であるため、サーバーですでにphp 7.2.4を使用しているため、コードでは代わりにOpenSSLを使用したいと思います。

暗号化/復号化には次のコードを使用しました。

//暗号化

function encrypt($text, $salt='') {
        if ($text == "") return "";
        if ($salt == "") $salt = 'DiAo74dOO09T48YESmuvbS0T';
        return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB, mcrypt_create_iv   

(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_Rand))));
    }

//暗号化

function decrypt($text, $salt = '') {
        if ($text == "")
            return "";
        if ($salt == "")
            $salt = 'DiAo74dOO09T48YESmuvbS0T';
        return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $salt, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv

(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_Rand)));
    }

"AFdT9sa81krHkp/GoYCSwh7/lZn/gLZLHJSldi5/QCU ="この文字列は上記の暗号化関数を使用して暗号化しましたが、OPENSSLを使用して復号化したいです。次のコードを使用して復号化しました。

    $string = 'AFdT9sa81krHkp/GoYCSwh7/lZn/gLZLHJSldi5/QCU=';   
    $output = false;
    $secret_key = 'DiAo74dOO09T48YESmuvbS0T';   
    $secret_iv1 = openssl_random_pseudo_bytes(openssl_cipher_iv_length('AES-256-ECB'));
    $secret_iv = bin2hex($secret_iv1);
    $key = hash('sha256', $secret_key);    
    $iv = substr(hash('sha256', $secret_iv), 0, 16);

    $output = base64_encode(openssl_encrypt($string, 'aes-256-ecb', $key, OPENSSL_RAW_DATA));

復号化された出力を次のようにしたいと思います: "durhs-14767-w0163j1-89047"お返事ありがとうございます。

5
Mahesh Mirase

悲しいことに、あなたは間違った道を進んでいます。

参照する :

http://php.net/manual/en/function.mcrypt-encrypt.php#117667

MCRYPT_RIJNDAEL_256はAES-256ではなく、Rijndaelブロック暗号の別のバリアントです。

https://en.wikipedia.org/wiki/Advanced_Encryption_Standard

AESは、128ビットの固定ブロックサイズと128、192、または256ビットのキーサイズを持つRijndaelのバリアントです。対照的に、Rijndael仕様自体は、32ビットの倍数、最小128ビットおよび最大256ビットのブロックおよびキーサイズで指定されます。

したがって、OpenSSLのAES-256を使用してMCryptの出力を復号化することはできません。

いくつかの可能な方法:

  1. レガシーデータを完全に置き換えることができるまで、PECLのmcrypt拡張機能によるmcryptを使い続けます(幸いなことに、それはまだそこにあります)。

  2. PHPで正しいRIJNDAEL-256暗号を書き換えます。

5
shawn