PHP+MySQL アプリケーションで XOR 暗号化アルゴリズムを使用する

PHP+MySQL アプリケーションで XOR 暗号化アルゴリズムを使用する

この記事では、排他的論理和 (XOR) 演算を使用したシンプルで使いやすい暗号化/復号化アルゴリズムを紹介します。このアルゴリズムの原理は単純であり、読者に情報の暗号化/復号化についてのより直感的な印象を与えることを目的としています。

51CTO 推奨トピック: PHP+MySQL のベスト プラクティス

XORアルゴリズムの原理

主な暗号化方式の観点から見ると、転置方式は単純すぎるため、特にデータ量が少ない場合は、暗号文から平文を推測するのは簡単です。置換方式は依然として効果的で単純なアルゴリズムです。

さまざまな置換演算の特性から判断すると、XOR 演算は単純な暗号化および復号化演算に最も適しています。この方法の原理は、数値 A と別の数値 B を XOR すると、別の数値 C が生成され、C と B を再度 XOR すると、C が A に復元されるというものです。

他の単純な暗号化アルゴリズムと比較して、XOR アルゴリズムの利点は次のとおりです。

(1)アルゴリズムは単純であり、高級言語を使用して簡単に実装できる。

(2)高速なのでいつでもどこでも使えます。

(3)欧文文字にしか効かない単純な暗号化アルゴリズムとは異なり、あらゆる文字に効きます。漢字を暗号化すると、復号化しても元の文字に戻すことはできません。

XORアルゴリズムの実装

前のセクションでは、暗号化/復号化に XOR 演算を使用する方法について説明しました。このセクションでは、これを使用してユーザーのログイン情報を暗号化します。前のセクションで紹介した XOR 暗号化アルゴリズムの原理に基づいて、次の暗号化および復号化関数を記述することは難しくありません。暗号化アルゴリズムが最初にリストされます。

  1. <!–encrypy_xor: XOR 演算を使用したシンプルな暗号化関数—————–>
  2. <?php
  3. //暗号化関数 
  4. 関数 myEncrypt( $文字列 $キー)
  5. {
  6. ( $i =0; $i < STRLEN ( $STRING );p $i ++)<> の場合
  7. {
  8. ( $j =0; $j STRLEN ( $KEY );p $j ++)<>の場合
  9. {
  10. $文字列[ $i ] = $文字列[ $i ]^ $キー[ $j ];
  11. }
  12. }
  13. $文字列を返します
  14. }

4 行目は暗号化関数 myEncrypt() を定義しています。入力パラメータ $string はプレーンテキスト、$key はキーです。出力は、$key をキーとして使用し、XOR 暗号化アルゴリズムを使用して生成された暗号テキストです。

6 行目から 12 行目の外側の for ループはプレーンテキスト文字列の各文字をループし、内側の for ループ (8 行目から 11 行目) はプレーンテキストの各文字をループし、キーの各ビットで XOR 演算を実行します。この原則は前のセクションで紹介されているため、ここでは繰り返しません。

暗号化関数と同様に、次の復号化関数を記述できます。

  1. //復号化関数 
  2. 関数 myDecrypt( $文字列 $キー)
  3. {
  4. ( $i =0; $i < STRLEN ( $STRING );p $i ++)<> の場合
  5. {
  6. ( $j =0; $j STRLEN ( $KEY );p $j ++)<>の場合
  7. {
  8. $文字列[ $i ]= $キー[ $j ]^ $文字列[ $i ];
  9. }
  10. }
  11. $文字列を返します
  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=椅子

my_password_en=RYPXC

my_password_de=椅子

XORアルゴリズムを使用してID認証を実装する

前回の2回では、XOR演算を使用した情報の暗号化/復号化の原理と実装について紹介しました。次回は、この方法を使用してユーザーのログインパスワードを暗号化します。この例では、ユーザーのパスワードを保護するために、システムは次の目標を達成したいと考えています。

登録時に、ユーザーはユーザーパスワードフォームに入力する必要があります。

システム設計者やデータベース管理者など、ユーザー以外の誰もパスワード情報を取得できません。

システムは、ユーザーが入力したパスワードに基づいてユーザーの正当性を検証できます。

上記の目的を達成するには、XOR アルゴリズムを使用する場合、ユーザー名をプレーンテキストとして選択し、キーをユーザー定義のパスワードにして、暗号化されたユーザー名をデータベースに保存します。

また、ユーザーがログインする際に、正当なユーザーであるかどうかを確認する方法が 2 つあります。

(1)ユーザーが送信したユーザー名(プレーンテキスト)とパスワード(キー)情報を再暗号化し、暗号化された情報をデータベースに保存されているパスワード情報と比較します。それらが等しい場合、ユーザーは合法であり、そうでない場合は、ユーザーは違法です。

(2)データベースに保存されているパスワード情報(平文)とユーザーが入力したパスワード(キー)情報を復号化し、暗号化された情報とユーザーが送信したユーザー名を比較します。一致すればユーザーは合法であり、一致しなければユーザーは違法です。

どちらの方法でも 3 番目の目的を達成できます。この例では、2 番目の方法が使用されます。この例の実装コードは、セクション 18.4.1「ユーザー ログイン」とセクション 18.4.2「ユーザー チェック」の実装に基づいて実装できます。「ユーザー ログイン」ページを変更する必要はなく、「ユーザー チェック」の実装は次のとおりです。

  1. <?php
  2. session_start(); //セッションライブラリをロードします。最初の行に配置する必要があります 
  3. $user_name = $_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 = "selectname,passwordfromuserwherename=' $user_name '";
  15. $result =mysql_query( $str , $link_id ); //クエリを実行する 
  16. @ $rows =mysql_num_rows( $result ); //クエリ結果のレコード数を取得する 
  17. $user_name = $_SESSION [ "ユーザー名" ];
  18. $password = $_POST [ "パスワード" ];
  19. $password_en =myEncrypt( $user_name , $password ); // ユーザー情報を暗号化する 
  20.  
  21. //古いユーザー向け 
  22. $ rowsが 0 の場合
  23. {
  24. リスト( $name $pwd )=mysql_fetch_row( $result );
  25. $password_de =myDecrypt( $pwd , $password ); // ユーザー情報を復号化する 
  26.  
  27. //パスワードが正しく入力された場合 
  28. ( $user_name == $password_de )の場合
  29. {
  30. $str = "updateusersetis_online=1wherename=' $user_name 'andpassword=' $password_en '";
  31. $result =mysql_query( $str , $link_id ); //クエリを実行する 
  32. require ("main.php"); //チャットページへ移動 
  33. }
  34. //パスワード入力が間違っています 
  35. それ以外 
  36. {
  37. ("relogin.php")が必要です
  38. }
  39. }
  40. //新規ユーザーの場合は、その情報をデータベースに書き込みます 
  41. それ以外 
  42. {
  43. $str = "insertintouser(name,password,is_online)values(' $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行目で、復号化された値とユーザーが送信したユーザー名情報を比較することで、ユーザーの正当性をチェックします。

キーを自動生成

前のセクションでは、XOR 暗号化アルゴリズムを使用してユーザー情報を暗号化する方法を紹介しました。ユーザーが入力したパスワード情報は実際には暗号化アルゴリズムのキーとなり、ユーザー名はプレーンテキストとして使用されます。これで機能は十分に達成できますが、論理的には、この方法はやや不合理に思えます。

この記事では、キーを自動生成する技術を紹介します。自動生成されたキーを使用して、ユーザーが送信したプレーンテキストのパスワードを暗号化し、ロジックをより合理的にすることができます。

この例では、生成されたキーは 512 ビットであると想定しています。コードは次のとおりです。

  1. <!–keygen.php: キーを自動生成する————————————>
  2. <?php
  3. //長さ$lenのキーを自動的に生成する 
  4. 関数generate_key( $len )
  5. {
  6. $下限= 35;
  7. $上限= 96;
  8. $strMyKey = "";
  9.  
  10. ( $i =1; $i <= $len ; $i ++)の場合
  11. {
  12. $rnd =rand(0,100); //乱数を生成する 
  13. $k =(( $upperbound - $lowerbound )+1)* $rnd + $lowerbound ;
  14. $strMyKey = $strMyKey . $k ;
  15. }
  16. $strMyKeyを返します
  17. }
  18.  
  19. //キーをファイル$file_nameに書き込みます 
  20. functionwrite_key( $key , $file_name )
  21. {
  22. $ファイル名= "C:\key.txt";
  23. $key =generate_key( $key ,512);
  24.  
  25. // $filename を追加モードで開きます。ファイル ポインタはファイルの末尾になります。  
  26. if (! $handle = fopen ( $filename ,'w'))
  27. {
  28. print"ファイル$filenameを開けません";
  29. 出口;
  30. }
  31.  
  32. //開いたファイルに $key を書き込みます。  
  33. if (!fwrite( $handle , $key ))
  34. {
  35. print"ファイル$filenameに書き込めません";
  36. 出口;
  37. }
  38. fclose( $ハンドル);
  39. }
  40.  
  41. //キーファイルからキーを読み取ります 
  42. 関数 get_key( $file_name )
  43. {
  44. //ファイルを開く 
  45. $fp = fopen ( $file_name 、 "r" );
  46. $結果= "";
  47. // 行ごとに読み取る 
  48. while (! feof ( $fp ))
  49. {
  50. $buffer = fgets ( $fp ,4096);
  51. $result = $result . $buffer ;
  52. }
  53. $resultを返します
  54. }
  55.  
  56. ///*  
  57. $KeyLocation = "C:\key.txt"; //キーファイルを保存する 
  58. $キー= "123456";
  59. write_key( $key $KeyLocation );
  60. echoget_key( $キーの場所);
  61. //*/  
  62. ?>

コードには 3 つの関数が含まれています。

◆ generate_key($len): 長さ$lenのキーを自動的に生成する

◆ write_key($key,$file_name): キーをファイル$file_nameに書き込みます

◆ get_key($file_name): キーファイル$file_nameのキー値を読み取ります

使用時には、ユーザーがシステムに初めてログインすると、キー値が自動的に生成されます。このキー値を処理する方法は 2 つあります。

(1)データベースのフィールドに保存する。この方法の欠点は、データベース内のキーのセキュリティが保証されないことである。

(2)他人にキーが取得されないように、キーをユーザーのローカルファイルに保存します。ただし、この方法の欠点は、ユーザーが他のマシンを使用してシステムにアクセスすると、ログインできなくなることです。

この例では、2 番目の方法が使用されます。

具体的には、上記コードの 11 行目から 18 行目では、乱数を生成することでキーを継続的に生成し、計算によって複雑さを増しています。 lowerbound と upperbound の値は、実際には暗号化に使用する ASCII 文字の範囲です。以下は生成されたキー ファイルの例です。

208123915925183361116049369344372701567721435181102718332639307390344373445407

524316475863232913993383189547474747394154915312639841226741894189965623523913

011164730113445201935692839710274127251577929493941487145611337531549110895367

593586318332391170941272701152344371709270125776235313540032267139933835677407

617384135696111239130732949469623520815987524358635491542913374933524334454251

400327015367133759324537171709152357391089524342514685239122673135531363151191

833412771743139654…

***、キーをサーバー上の安全な場所に保存する必要があります。その後、そのキーと XOR などの暗号化アルゴリズムを使用して、ユーザー情報を暗号化/復号化できます。前のセクションで説明した XOR でこのキーを使用する方法は非常に簡単なので、詳細には説明しません。

オリジナル: http://levi.cg.am/?p=800

【編集者のおすすめ】

  1. カテゴリリスト管理を実装するためのjQuery+Ajax+PHP+MySQL
  2. PHP+MySQL+jQueryでランダムドラッグレイヤーを実現
  3. PHP 開発者が犯しがちな MySQL の間違い 10 選
  4. 1 分 ***インストール*** CentOS+Nginx+PHP-FPM+MySQL
  5. PHP+MySQL+jQueryでマイクロブログ公開プログラムを実装する——PHPの章

<<:  ドイツのセキュリティ専門家がGPRS暗号化アルゴリズムの解読に成功

>>:  SQL Server データ マイニング: クラスタリング アルゴリズムとシーケンシャル クラスタリング アルゴリズムの理解

ブログ    
ブログ    
ブログ    

推薦する

興味深い微表情とAI技術

イギリスの企業が、人が正直に話しているかどうかを識別できるシステムを発明したと言われています。また、...

...

中国のAI臨床診断がネイチャー誌に初掲載:71人の専門家が人間の医師を上回る精度の報告書を寄稿

[[257228]] 【新知能紹介】中国内外の科学者71人が共同で、検査結果を検知し、医師と同じくら...

幼稚園のAI教材を公開!プログラミング学習は幼稚園から始まる

AIの学習は幼稚園から始まる最近、インターネット上で「人工知能実験教科書」の写真が流通している。この...

...

AIは自動車でも加速しており、メルセデス・ベンツは車載音声アシスタントをChatGPTチャットボットに接続すると発表した。

6月16日のニュースによると、メルセデス・ベンツは木曜日、6月16日にテストプログラムを開始し、ア...

AI データモデリングはどのようにして気候災害を防ぐことができるのでしょうか?

予測分析モデルが改良されるにつれ、この分野のイノベーターたちは、これまで断片化されていて使用コストが...

イェール大学教授を征服したアルゴリズムプログラマーを見て、「人間本位」を実践してスマートコミュニティの脳を開発するにはどうすればよいのでしょうか?

自宅の高齢者が階段を降りる途中で誤って転倒したり、地域でいたずらっ子が走り回ってトラブルを起こしたり...

人工知能とクラウドコンピューティングの組み合わせは、企業ビジネスの飛躍的成長をどのように促進するのでしょうか?

Statistaの最近のレポートによると、「AI市場の世界的価値は2025年までに年間890億ドル...

AIがネットワークゴミを生み出す:古いインターネットは死につつあり、新しいインターネットは困難の中で生まれる

網易科技は6月27日、ここ数カ月、インターネットの方向性が変化したことを示すさまざまな兆候があると報...

人工知能とはいったい何でしょうか?映画の中で人類の支配は起こるのでしょうか?答えはここにあります

近年、人工知能は驚異的なスピードで技術が発展していることから、話題になっています。AlphaGoは囲...

交通大学ACMクラス卒業生のGoogleでの新たな仕事:Excelの表の数式を自動で記述

[[433049]]数式ビルダーのテーブルバージョンが登場しました。交通大学の ACM クラスを卒業...

...

今後 5 年以内にトラックは自動運転できるようになるでしょうか? 「人工知能の女王」はシノトラックでこの答えを出した

「人工知能の女王」ジャスティン・カッセル氏が済南の中国重汽で「人工知能と世界の未来経済」について講演...

MITは、大規模な問題を解決するにはアルゴリズムがハードウェアよりも有用であることを証明した。

[[425167]]この記事はAI新メディアQuantum Bit(公開アカウントID:QbitA...