mcryptの有効化、暗号化、および復号化プロセスの詳細


Mcrypt拡張ライブラリは暗号解読機能を実現することができ,明文を暗号化しても暗号文を復元してもよい.
1.PHP暗号化拡張ライブラリMcryptインストール
標準的なPHPのインストール中にMrcyptはインストールされていませんが、PHPのホームディレクトリにはlibmcryptが含まれています.dllとlibmhash.dllファイル(libmhash.dllはMhash拡張ライブラリで、ここでは一緒にインストールできます).まず、この2つのファイルをシステムディレクトリwindowssystem 32の下にコピーし、PHP.iniファイルでCtrl+Fショートカットキーを押して検索ボックスを飛び出し、見つけます.extension=php-mcrypt.dllと;extension=php_mhash.dllという2つの文は、次に前の「;」を取り除く最後にApacheサーバを保存して再起動すると有効になります.
2.PHP暗号化拡張ライブラリMcryptのアルゴリズムと暗号化モード
Mcryptライブラリは20種類以上の暗号化アルゴリズムと8種類の暗号化モードをサポートし、具体的には関数mcrypt_を通じてlist_Algorithms()とmcrypt_list_modes()で表示されます.結果は次のとおりです.
Mcryptがサポートするアルゴリズムは、cast-128 gost rijndael-128 twofish arcfour cast-256 loki 97 rijndael-1992 saferplus wake blowfish-compat des rijndael-256 serpent xtea blowfish enigma rc 2 tripledes
Mcryptがサポートする暗号化モードは、cbc cfb ctr ecb ncfb nofb ofb stream
これらのアルゴリズムとモードは応用の中で定数で表して、書く時接頭辞MCRYPT_をプラスしますおよびMCRYPT_以下のMcryptアプリケーションの例を示します.
DESアルゴリズムはMCRYPT_として表されるDES; ECBモードは、MCRYPT_として表されるMODE_ECB;
3.PHP暗号化拡張ライブラリMcrypt応用
まず一例を見て、Mcryptのワークフローを理解してから、一部のフローで使用されている関数を見てみましょう.
    $str = "    ";
    $key = "123qwe.019860905061X";
    $cipher = MCRYPT_RIJNDAEL_128;
    $mode = MCRYPT_MODE_ECB;
    $iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher,$mode),MCRYPT_RAND);

    echo "  :".$str."<br>";
    $str_encrypt = mcrypt_encrypt($cipher,$key,$str,$mode,$iv);
    echo "       :".$str_encrypt."<br>";

    $str_decrypt = mcrypt_decrypt($cipher,$key,$str_encrypt,$mode,$iv);

    echo "      :".$str_decrypt."<br>";

実行結果:
译文:私は李云の暗号化の后の内容です:B@
<1>例から分かるように、PHP暗号化拡張ライブラリMcryptを使用してデータを暗号化および復号化する前に、まずivと呼ばれる初期化ベクトルが作成される.$iv=mcrypt_create_iv(mcrypt_get_iv_size($cipher,$modes)、MCRYPT_RAND);可視初期化ベクトルの作成には、sizeがivのサイズを指定した2つのパラメータが必要です.sourceはivのソースで、値MCRYPT_RANDはシステム乱数です.
<2>関数mcrypt_get_iv_size($cipher,$modes)は初期化ベクトルサイズを返し、パラメータcipherとmodeはそれぞれアルゴリズムと暗号化モードを指す.
<3>暗号化関数$str_encrypt=mcrypt_encrypt($cipher,$key,$str,$modes,$iv);この関数の5つのパラメータは、cipher-暗号化アルゴリズム、key-鍵、data(str)--暗号化が必要なデータ、mode-アルゴリズムモード、iv-初期化ベクトル
<4>復号化関数mcrypt_decrypt($cipher,$key,$str_encrypt,$modes,$iv);この関数と暗号化関数のパラメータはほぼ同じであり、唯一異なるのはdataであり、すなわちdataは元のデータ$str_encryptではなく復号化が必要なデータ$str_encryptである.
//マニュアルの書き方:
    //       iv   :
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    //       :
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    //    :
    $key = "123qwe.019860905061x";
    //    (   ):
    $text = "My name is Adam Li!";
    echo $text. "<br>
"; // : $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, $iv); echo $crypttext. "
<br>"; // : $str_decrypt = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $crypttext, MCRYPT_MODE_ECB, $iv); echo $str_decrypt;

次に、加算/復号要求の例を示します.
$request_params = array(
	'controller' => 'todo',
	'action' => 'read',
	'username' => "bl",
	'userpass' => "a1"
);

$private_key = "28e336ac6c9423d946ba02d19c6a2632"; 

//encrypt request
$enc_request = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $private_key, json_encode($request_params), MCRYPT_MODE_ECB));
echo "CRYPT:".$enc_request."<br/>";

//decrypt request
$params = json_decode(trim(mcrypt_decrypt( MCRYPT_RIJNDAEL_256, $private_key, base64_decode($enc_request), MCRYPT_MODE_ECB )),true);
echo "ENCRYPT:<br/>";

//print result
var_dump($params);

注意:暗号化および復号化関数のパラメータcipher、key、modeは、1つずつ対応する必要があります.そうしないと、データは復元できません.