2017-07-20 62 views
5

Mcryptは廃止予定ですので、私のコードでOpenSSLを使用したいのですが、php 7.0.17を私たちのサーバーに既に使用しています。 。MCrypt rijndael-128からOpenSSL aes-128-ecbへの変換

一部のサードパーティのAPI(おそらくPHP 5.xの上でホストされているとmcryptのを使用して)、暗号化されたデータを取っています。彼らは、文字列を暗号化/復号化するために使用しているメソッドを提供してきました。暗号化された場合はここで

は、彼らが

これらのメソッド文字列 small1を使用して
$secret = 'a0a7e7997b6d5fcd55f4b5c32611b87c' ; 

public function encrypt128($str) 
    { 
     $block = mcrypt_get_block_size("rijndael_128", "ecb"); 
     $pad = $block - (strlen($str) % $block); 
     $str .= str_repeat(chr($pad), $pad); 

     return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $secret, $str, MCRYPT_MODE_ECB)); 
    } 

public function decrypt128($str) 
    { 
     $str = base64_decode($str); 
     $str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $secret, $str, MCRYPT_MODE_ECB); 

     $len = strlen($str); 
     $pad = ord($str[$len - 1]); 

     return substr($str, 0, strlen($str) - $pad); 
    } 

ある私たちは、私たちには、OpenSSLと同じ文字列を暗号化する場合、それは与えなければならないような私たちの側にopenssl_encryptを使用したいv7IXp5vVaFVXXlt/MN8BVw==


なりMcryptと同じ結果。私はそれを使用してmcryptを研究したrijndael-128モードecbはOpenSSL aes-128-ecbと互換性があるはずです。

私はここ数時間、OpenSSLを使用して同じ結果を提供する文字列を暗号化する独自の方法を作成しようとしていました。これまでのところ私はこの

public function sslEncrypt128($str) 
{ 
    $secret = 'a0a7e7997b6d5fcd55f4b5c32611b87c'; 
    return base64_encode(openssl_encrypt($str, 'aes-128-ecb', $secret, OPENSSL_RAW_DATA)); 
} 

に来ている。しかし、それは、入力上記と同様に別の文字列SxJ3+EdaeItZx3/EwGTUbw==を生成します。私はそれが旗の問題か詰め物かどうかわからない、どんなポインタも歓迎されるだろう。

私は事前にオンラインhttps://3v4l.org/v2J2N

感謝をテストするためにここにコードを追加しました。

+1

ECBモードには重大なセキュリティ上の問題があります。 ** **あなたの特定のアプリケーションに適していることを確かめてください**。一般に、CBCモードまたはCTRモードはより安全です。問題の説明(文字通り)については、[電子コードブック](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_Codebook_.28ECB.290)を参照してください。 – rossum

+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)、[3DES-ECB暗号化のためにMcryptを置き換えるためにopenssl_encryptを使用する](https://stackoverflow.com/q/) 39467008/608639)(ECMモードを使用します)。 – jww

+0

注:Base64データはコンピュータでは問題ありませんが、開発者はデータから何かを理解する必要があります。バイト単位で表現する必要があります。 – zaph

答えて

2

あなたの具体的な例ではIちゃんがそれを見つけたaes-128-ecbaes-256-ecbと入力すると、従来のmcrypt_encryptと同じ出力が生成されます。

+0

私はMcryptが128,192,256ビットの*ブロックサイズ*を提供すると信じています。 AESは128ブロックサイズのみを提供します。私の推測では、 'MCRYPT_RIJNDAEL_128'はおそらくAESである128ビットブロックサイズのRijndaelを指しています。鍵サイズは別の問題であり、それはOpenSSLの 'AES-256-CBC'で' 256'が示すものです。標準暗号アルゴリズム名(SCAN)を使用する場合、暗号インスタンスのMcryptアルゴリズム名は 'Rijndael-128(256)/ CBC'に似ています。 – jww

2

ほとんどの場合、キーは16進数に変換される文字列ではなく、16進数形式で使用されている可能性があります。


mcryptの:

mcryptは、標準のPKCS#7(旧姓のPKCS#5)パディングをサポートする唯一の非標準のヌルパディングが、パディングは明示的をmc​​ryptの前に添加されません。

暗号化v7IXp5vVaFVXXlt/MN8BVw==は、PKCS#7パディングに基づいた正しい暗号化です。 ECBモードと文字列としてのキー。

参照:mcrypt - AES CALCULATORHex中

、データパディングを通知ははっきりと見える:Base64に
key: 6130613765373939376236643566636435356634623563333236313162383763
data: 736D616C6C310A0A0A0A0A0A0A0A0A0A
encrypted: BFB217A79BD56855575E5B7F30DF0157


encrypted: v7IXp5vVaFVXXlt/MN8BVw==


のOpenSSL:

鍵は256ビットですが、 "aes-128-ecb"のOpenSSL呼び出しは128キーを意味するようです。したがって、キーは一致しません。

参照:OpenSSL - AES CALCULATOR進で

、データパディングがはっきりと見える気づく:Base64に
key: 61306137653739393762366435666364
data: 736D616C6C310A0A0A0A0A0A0A0A0A0A
encrypted: 4B1277F8475A788B59C77FC4C064D46F


encrypted: SxJ3+EdaeItZx3/EwGTUbw==

関連する問題