XORアルゴリズムの原理
主な暗号化方式から、転置方式は単純すぎるため、特にデータ量が少ない場合、暗号文から平文を推測するのが簡単で、置換方式は効果的でシンプルなアルゴリズムです。
さまざまな置換演算の特性から、XOR 演算は単純な暗号化および復号化演算に最も適しています。この方法の原理は、数値 A と別の数値 B を XOR 演算すると、C の場合、別の数値 C が生成されます。と B が XOR 演算されると、C は A に復元されます。
他の単純な暗号化アルゴリズムと比較して、XOR アルゴリズムの利点は次のとおりです。
(1) アルゴリズムはシンプルで、高級言語での実装が簡単です。
(2) 高速で、いつでもどこでも使用できます。
(3) は、西洋文字にのみ有効ないくつかの単純な暗号化アルゴリズムとは異なり、あらゆる文字に有効です。漢字を暗号化して復号すると、元の文字に戻すことはできません。
XOR アルゴリズムの実装
前のパートでは、暗号化/復号化に XOR 演算を使用する方法の原理を紹介しました。このセクションでは、XOR 演算を使用してユーザーのログイン情報を暗号化します。前のセクションで紹介した XOR 暗号化アルゴリズムの原理に従って、次の暗号化関数と復号化関数を作成するのは難しくありません。暗号化アルゴリズムが最初にリストされます。
<!–encrypy_xor:简单使用XOR运算的加密函数———————–> <?php //加密函数 functionmyEncrypt($string,$key) { for($i=0;$i<STRLEN($STRING);p$i++)<> { for($j=0;$j<STRLEN($KEY);p$j++)<> { $string[$i]=$string[$i]^$key[$j]; } } return$string; }
行 4 は、暗号化関数 myEncrypt() を定義します。入力パラメーター $string は平文で、$key はキーです。出力は、$key をキーとして使用し、XOR 暗号化アルゴリズムを使用して生成された暗号文です。
6 行目から 12 行目の外側の for ループは平文文字列の各文字をループし、内側の for ループ (8 行目から 11 行目) は平文の各文字とキーの各ビットをループします。この原則は前のセクションで紹介されているため、繰り返し説明しません。
同様に、暗号化関数と同様に、次の復号化関数を書くことができます。
//解密函数 functionmyDecrypt($string,$key) { for($i=0;$i<STRLEN($STRING);p$i++)<> { for($j=0;$j<STRLEN($KEY);p$j++)<> { $string[$i]=$key[$j]^$string[$i]; } } return$string; } ?>
行 4 は、復号化関数 myDecrypt() を定義します。入力パラメーター $string は暗号文、$key はキーであり、出力は $key をキーとして使用し、XOR 復号化アルゴリズムを使用して生成された平文です。
以下では、アプリケーション例を使用して、暗号化機能の機能をさらに説明します。
//示例 $my_password="chair"; echo"my_password=$my_password"; $my_key="1234567890″; $my_password_en=myEncrypt($my_password,$my_key); echo"my_password_en=$my_password_en"; $my_password_de=myDecrypt($my_password_en,$my_key); 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「ユーザーの確認」の実装リファレンスを変更する必要はありません。ユーザーを確認する」は以下の通りです。
<?php session_start();//装载Session库,一定要放在首行 $user_name=$_POST["user_name"]; session_register(“user_name");//注册$user_name变量,注意没有$符号 require_once(“sys_conf.inc");//系统配置文件,包含数据库配置信息 require_once(“encrypy_xor.php");//包含xor加密函数文件 //连接数据库 $link_id=mysql_connect($DBHOST,$DBUSER,$DBPWD); mysql_select_db($DBNAME);//选择数据库my_chat //查询是否存在登录用户信息 $str="selectname,passwordfromuserwherename='$user_name'"; $result=mysql_query($str,$link_id);//执行查询 @$rows=mysql_num_rows($result);//取得查询结果的记录笔数 $user_name=$_SESSION["user_name"]; $password=$_POST["password"]; $password_en=myEncrypt($user_name,$password);//加密用户信息 //对于老用户 if($rows!=0) { list($name,$pwd)=mysql_fetch_row($result); $password_de=myDecrypt($pwd,$password);//解密用户信息 //如果密码输入正确 if($user_name==$password_de) { $str="updateusersetis_online=1wherename='$user_name'andpassword='$password_en'"; $result=mysql_query($str,$link_id);//执行查询 require(“main.php");//转到聊天页面 } //密码输入错误 else { require(“relogin.php"); } } //对于新用户,将其信息写入数据库 else { $str="insertintouser(name,password,is_online)values(‘$user_name','$password_en',1)"; $result=mysql_query($str,$link_id);//执行查询 require(“main.php");//转到聊天页面 } //关闭数据库 mysql_close($link_id); ?>
7 行目では、前のセクションで紹介した 2 つの関数を含む暗号化関数ファイル encrypy_xor.php が導入されています。
19 行目では、ユーザーが送信したユーザー名とパスワードを使用して暗号化されたパスワード値を取得し、新規ユーザーの場合は、この暗号化された値を 44 行目でデータベースに保存します。
さらに、古いユーザーの場合は、24 行目でデータベース内のユーザー名と暗号化されたパスワード情報を取得し、これら 2 つの値を使用して 25 行目で復号化し、復号化された値を、ユーザーによって送信されたユーザー名と比較します。行 28 の user 情報を使用して、ユーザーの正当性を確認します。
キーを自動的に生成する
前のパートでは、XOR 暗号化アルゴリズムを使用してユーザー情報を暗号化する方法を紹介しましたが、ユーザーが入力したパスワード情報は実際には暗号化アルゴリズムのキーとなり、ユーザー名はプレーンテキストとして使用されます。仕事はうまくいきますが、論理的に考えると、このアプローチは少し無理があるように思えます。
この記事では、キーを自動的に生成するテクノロジーを紹介します。自動生成されたキーを使用して、ユーザーが送信したパスワードの平文を暗号化し、ロジックをより合理的にすることができます。
この例では、生成されたキーが 512 ビットであると想定されています。コードは以下のように表示されます。
<!–keygen.php:自动生成密钥————————————> <?php //自动生成长度为$len的密钥 functiongenerate_key($len) { $lowerbound=35; $upperbound=96; $strMyKey=""; for($i=1;$i<=$len;$i++) { $rnd=rand(0,100);//产生随机数 $k=(($upperbound-$lowerbound)+1)*$rnd+$lowerbound; $strMyKey=$strMyKey.$k; } return$strMyKey; } //将密钥写入文件$file_name functionwrite_key($key,$file_name) { $filename="C:\key.txt"; $key=generate_key($key,512); //使用添加模式打开$filename,文件指针将会在文件的末尾 if(!$handle=fopen($filename,'w')) { print"不能打开文件$filename"; exit; } //将$key写入到我们打开的文件中。 if(!fwrite($handle,$key)) { print"不能写入到文件$filename"; exit; } fclose($handle); } //读取密钥文件中的密钥 functionget_key($file_name) { //打开文件 $fp=fopen($file_name,"r"); $result=""; //逐行读取 while(!feof($fp)) { $buffer=fgets($fp,4096); $result=$result.$buffer; } return$result; } ///* $KeyLocation="C:\key.txt";//保存密钥的文件 $key="123456″; write_key($key,$KeyLocation); echoget_key($KeyLocation); //*/ ?>
代码包括3个函数。
◆ generate_key($len):自动生成长度为$len的密钥
◆ write_key($key,$file_name):将密钥写入文件$file_name
◆ get_key($file_name):读取密钥文件$file_name中的密钥值
在使用时,当用户第一次登录系统时,自动为其生成密钥值,对于这个密钥值,可以有两种方式来处理。
(1)将其存入数据库的某个字段中,这种方法的缺点是密钥在数据库中的安全性无法得到保证;
(2)将这个密钥保存在用户本地的文件中,这样就可以避免密钥被别人获取,但这种方式的缺点是,当用户使用其他机器访问系统时,就无法登录。
本例中,将使用第2种方式。
具体地,上面代码第11~18行通过生成随机数的方式来不断生成密钥,并通过一个计算来增强其复杂性。其中的lowerbound和upperbound的数值其实就是你想使用来加密的ASCII字符范围。下面是生成的一个密钥文件示例。
208123915925183361116049369344372701567721435181102718332639307390344373445407
524316475863232913993383189547474747394154915312639841226741894189965623523913
011164730113445201935692839710274127251577929493941487145611337531549110895367
593586318332391170941272701152344371709270125776235313540032267139933835677407
617384135696111239130732949469623520815987524358635491542913374933524334454251
400327015367133759324537171709152357391089524342514685239122673135531363151191
833412771743139654…
最后,需要把密钥保存在服务器上一个安全的地方,然后就可以利用其和诸如XOR这样的加密算法来对用户信息进行加密/解密了。如何在上一部分介绍的XOR中使用这个密钥非常简单,不再详述。
更多PHP MySQL应用中使用XOR运算加密算法分享相关文章请关注PHP中文网!