この記事では、排他的論理和 (XOR) 演算を使用した、シンプルで使いやすい暗号化/復号化アルゴリズムを紹介します。このアルゴリズムの原理はシンプルで、読者に情報の暗号化/復号化についてより直感的な印象を与えることを目的としています。
XOR アルゴリズムの原理
暗号化の主要な方法の観点から見ると、転置法は単純すぎるため、特にデータ量が少ない場合、暗号文から平文を推測するのが容易であり、置換法は効果的かつ簡単ですアルゴリズム。
さまざまな置換演算の特性から判断すると、XOR 演算は単純な暗号化および復号化演算に最も適しています。この方法の原理は、数値 A と別の数値 B を XOR 演算すると、別の数値 C が生成されます。 C と B に対する XOR 演算を実行すると、C は A に復元されます。
他の単純な暗号化アルゴリズムと比較した場合、XOR アルゴリズムの利点は次のとおりです。
(1) アルゴリズムがシンプルで高級言語でも容易に実装可能。
(2) 高速で、いつでもどこでも使用できます。
(3) 西洋文字のみに有効な一部の単純な暗号化アルゴリズムとは異なり、漢字は暗号化および復号化後に元の文字に戻すことができません。
XOR アルゴリズムの実装
前のパートでは、暗号化/復号化に XOR 演算を使用する方法の原理を紹介しました。このセクションでは、XOR 演算を使用してユーザーのログイン情報を暗号化します。前のセクションで紹介した XOR 暗号化アルゴリズムの原理に従って、次の暗号化関数と復号化関数を作成するのは難しくありません。暗号化アルゴリズムが最初にリストされます。
1 <!--encrypy_xor: XOR演算のみを利用した暗号化関数---------------------->
2 <?php
3 //暗号化関数
4 関数 myEncrypt($string, $key)
5 {
6 for($i=0; $i<STRLEN($STRING); p $i++)<>
7 {
8 for($j=0; $j<STRLEN($KEY); p $j++)<>
9 {
10 $string[$i] = $string[$i]^$key[$j];
11 }
12}
13 $string を返します。
14}
行 4 は、暗号化関数 myEncrypt() を定義します。入力パラメータ $string は平文で、$key はキーです。出力は、$key をキーとして使用し、XOR 暗号化アルゴリズムを使用して生成された暗号文です。
6 行目から 12 行目の外側の for ループは平文文字列の各文字をループし、内側の for ループ (8 行目から 11 行目) は平文の各文字をループし、キーの各ビットで例外を実行します。この原則は前のセクションで紹介されているため、繰り返し説明しません。
ここでも、暗号化関数と同様に、次の復号化関数を作成できます。
1 //復号化関数
2 関数 myDecrypt($string, $key)
3 {
4 for($i=0; $i<STRLEN($STRING); p $i++)<>
5 {
6 for($j=0; $j<STRLEN($KEY); p $j++)<>
7 {
8 $string[$i] = $key[$j]^$string[$i];
9}
10}
11 $string を返します。
12}
13?>
行 4 は、復号化関数 myDecrypt () を定義し、入力パラメータ $string は暗号文、$key はキーです。出力は、$key をキーとして使用し、XOR 復号化アルゴリズムを使用して生成された平文です。
以下では、アプリケーション例を使用して、暗号化機能の機能をさらに説明します。
1 //例
2 $my_password="椅子";
3 echo "my_password = $my_password";
4 $my_key="1234567890";
5 $my_password_en=myEncrypt($my_password,$my_key);
6 echo "my_password_en = $my_password_en";
7 $my_password_de=myDecrypt($my_password_en,$my_key);
8 echo "my_password_de = $my_password_de";
3 行目で最初にクリア テキストの $my_password を定義し、次に 4 行目でキー $my_key を定義します。
5 行目と 6 行目でそれぞれ暗号化関数を呼び出して暗号文を生成し、出力します。次に、7 行目と 8 行目で暗号文が復号されます。
上記の例を実行した結果は次のとおりです。
my_password =chair
my_password_en = RYPXC
my_password_de =chair
XOR アルゴリズムを使用した ID 認証の実装
前の 2 つのパートでは、XOR 演算を使用した情報の暗号化/復号化の原理と実装を紹介しました。次に、この方法を使用してユーザーのログイン パスワードを暗号化します。この例では、ユーザーのパスワードを保護するために、システムは次の目的を達成したいと考えています。
・登録の際、ユーザーパスワードフォームへの入力が必要となります。
・ユーザー本人以外には、システム設計者やデータベース管理者など、誰もパスワード情報を取得することはできません。
・システムは、ユーザーが入力したパスワードに基づいてユーザーの正当性を検証できます。
上記の目的を達成するために、XOR アルゴリズムを使用する場合、ユーザー名をプレーン テキストとして選択し、キーとしてユーザー定義のパスワードを選択し、暗号化されたユーザー名をデータベースに保存します。
また、ユーザーがログインする際に、正当なユーザーであることを確認する方法には次の 2 つがあります。
(1) 送信されたユーザー名 (平文) とパスワード (鍵) 情報に基づいて再暗号化し、暗号化された情報を使用してデータベースに保存されているパスワード情報と比較します。それらが等しい場合は、ユーザーは正当であり、そうでない場合は正当です。 、ユーザーは違法です。
(2) データベースに保存されているパスワード情報(平文)とユーザーが入力したパスワード(鍵)情報を元に復号し、暗号化された情報とユーザーが提出したユーザー名を比較し、一致する場合はユーザーとなります。は合法ですが、そうでない場合は違法なユーザーにとっては問題ありません。
どちらの方法でも 3 番目の目的を達成できます。この例では 2 番目の方法が使用されます。この例の実装コードは、セクション 18.4.1「ユーザー ログイン」およびセクション 18.4.2「ユーザーの確認」の実装リファレンスを変更する必要はありません。ユーザーを確認する」は以下の通りです。
1 <?php
2 session_start(); //セッション ライブラリをロードします。これは最初の行に配置する必要があります。
3 $ユーザー名=$_POST["ユーザー名"];
4 session_register("user_name"); // $user_name 変数を登録します。$ 記号がないことに注意してください。
5
6 require_once("sys_conf.inc"); //データベース構成情報を含むシステム構成ファイル
7 require_once("encrypy_xor.php") //XOR 暗号化関数ファイルが含まれます
8
9 //データベースに接続します
10 $link_id=mysql_connect($DBHOST,$DBUSER,$DBPWD);
11 mysql_select_db($DBNAME) //データベース my_chat を選択します。
12
13 //ログインユーザー情報の有無を問い合わせる
14 $str="名前 ='$user_name' のユーザーから名前、パスワードを選択します。";
15 $result=mysql_query($str,$link_id); //クエリを実行します。
16 @$rows=mysql_num_rows($result); //クエリ結果から取得したレコードの数
17 $ユーザー名=$_SESSION["ユーザー名"];
18 $パスワード=$_POST["パスワード"];
19 $password_en=myEncrypt($user_name,$password); // ユーザー情報を暗号化します。
20
21 //古いユーザー向け
22 if($rows!=0)
23 {
24 list($name,$pwd)=mysql_fetch_row($result);
25 $password_de=myDecrypt($pwd,$password); //ユーザー情報を復号化します。
26
27 //パスワードが正しく入力されていれば
28 if($user_name==$password_de)
29 {
30 $str="更新ユーザー セット is_online =1 ここで、名前 ='$user_name' およびパスワード ='$password_en'";
31 $result=mysql_query($str, $link_id) //クエリを実行
32 require("main.php") //チャットページに移動します。
33}
34 //パスワード入力エラー
35 その他
36 {
37 require("relogin.php");
38 }
39 }
40 //新規ユーザーの場合、自分の情報をデータベースに書き込みます
41 その他
42 {
43 $str="ユーザー (名前,パスワード,is_online) 値に挿入('$user_name', '$password_en',1)";
44 $result=mysql_query($str, $link_id) //クエリを実行
45 require("main.php") //チャットページに移動します。
46 }
47 //データベースを閉じる
48 mysql_close($link_id);
49 ?>
7 行目では、前のセクションで紹介した 2 つの関数を含む暗号化関数ファイル encrypy_xor.php が導入されています。
19 行目で、ユーザーが送信したユーザー名とパスワードを使用して暗号化されたパスワード値が取得され、新規ユーザーの場合、この暗号化された値は 44 行目でデータベースに保存されます。
さらに、古いユーザーの場合は、24 行目でデータベース内のユーザー名と暗号化されたパスワード情報を取得し、これら 2 つの値を使用して 25 行目で復号化し、復号化された値とユーザーによって送信されたユーザー名情報を比較します。 28 行目の user を使用して、ユーザーの正当性を確認します。
キーの自動生成
の前の部分では、XOR 暗号化アルゴリズムを使用してユーザー情報を暗号化する方法を紹介しましたが、ユーザーが入力したパスワード情報は実際には暗号化アルゴリズムのキーとなり、ユーザー名はプレーン テキストとして使用されます。非常にうまく機能を完成させていますが、論理的にはこの方法は少し無理があるように思えます。
この記事では、キーを自動生成するテクノロジーを紹介します。自動生成されたキーを使用して、ユーザーが送信したパスワードの平文を暗号化し、ロジックをより合理化できます。
この例では、生成されたキーが 512 ビットであると仮定しています。コードは次のとおりです。
1 <!--keygen.php: キーを自動的に生成します----------------------------------->
2 <?php
3
4 //長さ $len のキーを自動的に生成します
5 関数generate_key($len)
6 {
7 $下限 = 35;
8 $上限 = 96;
9 $strMyKey = "";
10
11 for($i=1;$i<=$len;$i++)
12 {
13 $rnd=rand(0,100) //乱数を生成する
14 $k = (($upperbound - $ lowerbound) + 1) * $rnd + $ lowerbound;
15 $strMyKey=$strMyKey.$k;
16}
17 $strMyKey を返します。
18}
19
20 // ファイル $file_name にキーを書き込みます
21 関数 write_key($key,$file_name)
22 {
23 $ファイル名="C:key.txt";
24 $key=generate_key($key,512);
25
26 //追加モードを使用して $filename を開きます。ファイル ポインタはファイルの末尾にあります
27 if(!$handle=fopen($filename,'w'))
28 {
29 print "ファイル $filename を開けません";
30 出口。
31}
32
33 //開いたファイルに $key を書き込みます。
34 if(!fwrite($handle,$key))
35 {
36 print "ファイル $filename に書き込めません";
37 出口。
38 }
39 fclose($handle);
40}
41
42 //キーファイル内のキーを読み取ります
43 関数 get_key($file_name)
44 {
45 //ファイルを開く
46 $fp = fopen ($file_name, "r");
47 $結果="";
48 //一行ずつ読み込む
49 しながら (!feof($fp))
50{
51 $buffer = fgets($fp, 4096);
52 $result=$result.$buffer;
53}
54 $result を返します。
55 }
56
57 ///*
58 $KeyLocation = "C:key.txt" //キーを保存するファイル
59 $key="123456";
60 write_key($key,$KeyLocation);
61 エコー get_key($KeyLocation);
62 //*/
63 ?>
コードには 3 つの関数が含まれています。
・generate_key($len): 長さ $len のキーを自動的に生成します
・write_key($key,$file_name): キーをファイル $file_name に書き込みます
・get_key($file_name): キー ファイル $file_name を読み取ります キーの値が
を使用すると、ユーザーが初めてシステムにログインするときに、ユーザー用にキー値が自動的に生成されます。このキー値を処理するには 2 つの方法があります。
(1) データベースの特定のフィールドにキーを保存します。この方法の欠点は、データベース内のキーのセキュリティが保証されないことです。
(2) キーをユーザーのローカル ファイルに保存するため、キーが保存されなくなります。ただし、この方法の欠点は、ユーザーが他のマシンを使用してシステムにアクセスすると、ログインできないことです。
この例では、方法 2 が使用されます。
具体的には、上記のコードの 11 行目から 18 行目は、乱数を生成することでキーを継続的に生成し、計算によってその複雑さを高めます。下限値と上限値は、実際には暗号化に使用する ASCII 文字の範囲です。以下は、生成されたキー ファイルの例です。
208123915925183361116049369344372701567721435181102718332639307390344373445407
524316475863232913993383189547474747394154915312639841226741894189965623523913
011164730113445201935692839710274127251577929493941487145611337531549110895367
593586318332391170941272701152344371709270125776235313540032267139933835677407
617384135696111239130732949469623520815987524358635491542913374933524334454251
400327015367133759324537171709152357391089524342514685239122673135531363151191
833412771743139654…
最后,需要把密钥保存在服务器上一个安全的地方,然后就可以利用其和诸如XOR这样的加密算法来对用户信息进行加密/解密了。前のセクションで紹介した XOR でこのキーを使用する方法は非常に簡単なので、詳細は説明しません。合計2ページ。 9 7 1 2