モジュールとアルゴリズム
Mcrypt は主に Mcrypt ツールを使用して暗号化操作を実行するため、CentOS またはその他のオペレーティング システムでは、この拡張機能を使用するには libmcrypt-devel をインストールする必要があります。 yum でインストールできない場合は、yum ソースを直接更新してください。
Mcrypt には多くのモジュールとアルゴリズムが含まれています。アルゴリズムについては説明の必要はありませんが、データを暗号化する方法です。 CBC、OFB、CFB、ECB などのモジュールは、一連のグループ化およびストリーム暗号化モードです。推奨モジュールと安全なモジュールがあります。具体的な区別については、関連する情報を自分で確認できます。ここでは、まず見てみましょう私たちの環境でサポートされているモジュールとアルゴリズム。
$algorithms = @mcrypt_list_algorithms(); print_r($algorithms); // Array // ( // [0] => cast-128 // [1] => gost // [2] => rijndael-128 // [3] => twofish // [4] => arcfour // [5] => cast-256 // [6] => loki97 // [7] => rijndael-192 // [8] => saferplus // [9] => wake // [10] => blowfish-compat // [11] => des // [12] => rijndael-256 // [13] => serpent // [14] => xtea // [15] => blowfish // [16] => enigma // [17] => rc2 // [18] => tripledes // ) $modes = @mcrypt_list_modes(); print_r($modes); // Array // ( // [0] => cbc // [1] => cfb // [2] => ctr // [3] => ecb // [4] => ncfb // [5] => nofb // [6] => ofb // [7] => stream // )
mcrypt_list_algorithms() 関数は、現在の環境でサポートされているすべての Mcrypt アルゴリズムを取得できます。そして、mcrypt_list_modes() は、現在の環境でサポートされているすべてのモジュールを出力します。 PHP のバージョンやシステムによっては、これらの内容が異なることに注意してください。Mcrypt 関連の暗号化機能を使用する場合、これら 2 つの項目は相互に組み合わせて使用されます。したがって、Mcrypt を実行する必要がある環境では、現在の環境でサポートされているモジュールとアルゴリズムを事前に決定する必要があります。
データの暗号化と復号化
$key = hash('sha256', 'secret key', true); $input = json_encode(['id'=>1, 'data'=>'Test mcrypt!']); $td = @mcrypt_module_open('rijndael-128', '', 'cbc', ''); $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_URANDOM); @mcrypt_generic_init($td, $key, $iv); $encrypted_data = @mcrypt_generic($td, $input); @mcrypt_generic_deinit($td); @mcrypt_module_close($td); echo $encrypted_data, PHP_EOL; // ��I $�3���gE�ǣu(�9n����� // p�>P $td = @mcrypt_module_open('rijndael-128', '', 'cbc', ''); @mcrypt_generic_init($td, $key, $iv); $data = @mdecrypt_generic($td, $encrypted_data); echo $data, PHP_EOL; // {"id":1,"data":"Test mcrypt!"} @mcrypt_generic_deinit($td); @mcrypt_module_close($td);
コードは非常に大きくて複雑なので、部分的に見てみましょう。
最初に暗号化されたキーを決定し、次に暗号化するデータを入力します。たとえば、json データを暗号化したいとします。このキーは実際には文字列でも構いませんが、ここではキーをハッシュ化しています。ハッシュ関連の内容については、以前の記事で詳しく説明しました。
次のステップでは、mcrypt_module_open() を使用して暗号化モジュール ハンドルを開きます。ここでは、rijndael-128 アルゴリズムと cbc モジュールを使用します。次に、mcrypt_create_iv() を使用して iv を作成します。この iv は初期化ベクトルです。初期化ベクトルの値は暗号アルゴリズムによって異なります。最も基本的な要件は「一意性」です。これは、同じキーが同じ初期化ベクトルを再利用しないことを意味します。この機能は、ブロック暗号とストリーム暗号の両方で非常に重要です。 WeChat や Alipay に関連するインターフェース通信を行ったことがある人なら、検証データを復号するときに必ずこの iv 属性を見たことがあると思います。
mcrypt_generic() を使用して暗号化結果を生成し、mcrypt_generic_deinit() を使用して生成の初期化を終了し、最後に mcrypt_module_close() によって暗号化モジュール ハンドルを閉じます。以上で、一連のMcrypt暗号化処理が完了する。
同様に、復号化プロセスと暗号化プロセスも似ていますが、復号化に mdecrypt_generic() 関数を使用する点が異なります。
データを暗号化および復号化する別の方法
上記の暗号化プロセスは非常に面倒で複雑ですが、実は Mcrypt には、より簡単な暗号化機能も提供されています。
$string = 'Test MCrypt2'; $algorithm = 'rijndael-128'; $key = md5( "mypassword", true); $iv_length = @mcrypt_get_iv_size( $algorithm, MCRYPT_MODE_CBC ); $iv = @mcrypt_create_iv( $iv_length, MCRYPT_RAND ); $encrypted = @mcrypt_encrypt( $algorithm, $key, $string, MCRYPT_MODE_CBC, $iv ); $result = @mcrypt_decrypt( $algorithm, $key, $encrypted, MCRYPT_MODE_CBC, $iv ); echo $encrypted, PHP_EOL; // \<�`�U��Uf)�Y echo $result, PHP_EOL; // Test MCrypt2
暗号化するデータ、アルゴリズム、キー、IV ベクトルを準備する必要があります。あとは、mcrypt_encrypt() と mcrypt_decrypt() を直接使用して暗号化/復号化を実行するだけです。
概要
Hash と比較すると、Mcrypt は復号化可能な対称暗号化形式です。対称暗号と非対称暗号とは何かについては、OpenSSL拡張の考察で詳しく説明しますが、ハッシュ暗号は一方向の暗号形式であり、暗号化されたデータを逆算しても元のデータを得ることができません。これらはすべて異なるアプリケーション シナリオを持っていますが、PHP のプロンプトにあるように、Mcrypt は推奨される拡張機能ではなくなったため、ここでは単に暗号化/復号化テストを実行しただけです。
テスト コード:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202007/source/PHP%E7%9A%84Mcrypt%E5%8A%A0%E5%AF%86%E6%89%A9%E5%B1%95%E7%9F%A5%E8%AF%86%E4%BA%86%E8%A7%A3.php