ホームページ  >  記事  >  バックエンド開発  >  PHP による Mcrypt 暗号化の使用方法

PHP による Mcrypt 暗号化の使用方法

醉折花枝作酒筹
醉折花枝作酒筹転載
2021-05-28 17:48:061731ブラウズ

この記事では、PHP で Mcrypt 暗号化を使用する方法を紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。

PHP による Mcrypt 暗号化の使用方法

モジュールとアルゴリズム

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

推奨学習: php ビデオ チュートリアル

以上がPHP による Mcrypt 暗号化の使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。