PHP MySQLアプリケーションでXOR演算暗号化アルゴリズムを使って共有する
XORアルゴリズムの原理
暗号化の主な方法から見ると、位置交換法は簡単すぎて、特にデータ量が少ない場合は暗号文から明文を推測しやすく、代替法は有効な簡易アルゴリズムとなります。
各種の代替法演算の特徴から、異種または演算は簡易的な復号演算に最適であり、この方法の原理は、1つの数Aともう1つの数Bが異種または演算を行うと別の数Cを生成し、CとBを異種または演算するとCはまたAに還元されるということである。
他の簡易暗号化アルゴリズムに対して,XORアルゴリズムの利点は以下の通りである。
(1)アルゴリズムは簡単で、高級言語については簡単に実現できる。
(2)スピードが速く、いつでもどこでも使えます。
(3)任意の文字に対して有効で、一部の簡易暗号化アルゴリズムと違って、西洋文字のみに有効で、中国語で暗号化した後、元の文字に戻すことができません。
XORアルゴリズムの実装
前の部分では、XOR演算を使って暗号化/復号する方法を紹介していますが、今回はユーザーの登録情報を暗号化します。前の小節で紹介したXOR暗号化アルゴリズムの原理によって、以下の暗号解読関数が書きにくくなります。まず暗号化アルゴリズムを一覧表示します。
暗号化の主な方法から見ると、位置交換法は簡単すぎて、特にデータ量が少ない場合は暗号文から明文を推測しやすく、代替法は有効な簡易アルゴリズムとなります。
各種の代替法演算の特徴から、異種または演算は簡易的な復号演算に最適であり、この方法の原理は、1つの数Aともう1つの数Bが異種または演算を行うと別の数Cを生成し、CとBを異種または演算するとCはまたAに還元されるということである。
他の簡易暗号化アルゴリズムに対して,XORアルゴリズムの利点は以下の通りである。
(1)アルゴリズムは簡単で、高級言語については簡単に実現できる。
(2)スピードが速く、いつでもどこでも使えます。
(3)任意の文字に対して有効で、一部の簡易暗号化アルゴリズムと違って、西洋文字のみに有効で、中国語で暗号化した後、元の文字に戻すことができません。
XORアルゴリズムの実装
前の部分では、XOR演算を使って暗号化/復号する方法を紹介していますが、今回はユーザーの登録情報を暗号化します。前の小節で紹介したXOR暗号化アルゴリズムの原理によって、以下の暗号解読関数が書きにくくなります。まず暗号化アルゴリズムを一覧表示します。
<!Cencrypy_xor: XOR ―――――――C>
<?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を鍵として使用し、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_を定義します。key5、6行目はそれぞれ暗号化関数を呼び出して暗号文を生成して出力します。逆に、7、8行目は暗号文解読されます。上記の例の運転結果は以下の通りです。my_password=chair my_password()n=RYPXC my_password()de=chairはXORアルゴリズムでアイデンティティ検証を行う上で、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行は暗号化関数ファイルのencrypey_を導入しました。xor.phpは、前の小節に紹介された二つの関数を含みます。19行目は、ユーザが送信したユーザ名とパスワードを用いて暗号化されたパスワード値を取得し、44行目はこの暗号化された値をデータベースに格納する。また、古いユーザに対しては、24番目にデータベースのユーザ名と暗号化されたパスワード情報を取得し、25行目にこの2つの値を復号し、28行目に復号後の値をユーザに提示されたユーザ名情報と比較してユーザの正当性を確認する。自動生成鍵の一部では、XOR暗号化アルゴリズムを使用してユーザ情報を暗号化する方法が紹介されていますが、ユーザが入力したパスワード情報は実際に暗号化アルゴリズムの鍵となり、ユーザ名は平文として使用されています。これは機能をよく完成させることができますが、論理的にはこの方法は少し不合理なようです。本論文では、自動的に生成された鍵を使用して、ユーザに暗号文を暗号化して、論理をより合理的にする自動生成鍵の技術を紹介する。本例では、生成された鍵は512ビットであると仮定する。コードは以下の通りです
<!Ckeygen.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つの関数が含まれています。◆ゲナート_key($len):自動生成長さ$lenの鍵◆write_key($key、$file_)name):鍵をファイルに書き込む。name◆get_key($file_)name):鍵ファイルを読み込みます。nameの鍵の値を使用すると、ユーザがシステムに初めてログインしたときに、自動的に鍵の値を生成し、この鍵の値に対しては、2つの方法で処理することができます。1)それをデータベースのあるフィールドに保存する方法の欠点は、鍵のデータベース内のセキュリティが保証されていないことです。2)この鍵をユーザのローカルファイルに保存しておけば、他の人が鍵を取得することを回避できるが、このような方法の欠点は、ユーザが他のマシンを使ってシステムにアクセスするとログインできないということである。本例では、第2の方式が用いられる。具体的には、上のコードの11〜18行目は、乱数を生成することによって鍵を継続的に生成し、1つの計算によって複雑さを向上させる。このうちのlowerboundとuperboundの数値は、暗号化に使用したいASCIIの文字範囲です。以下は、生成された鍵ファイルの例である。2081239159151515151515151515151515151515151515151515153636363636363636363636363645454545454545454545454545454545454545454545454545454545454592929292929292929212121212454545454545454545454545454545454545929292929292929292919191919191919112121212121212121212121212121212121212121212787878787878787878787878787878784545454545454545454545454545454545454545454545454545454545454545454545454545454545454545738413569611123913073294996235208375243586354545454545454545454545251 400327015151537932453717170915253919191919189434345454545454545454545454545453 3 3 3 159191919191919191919191919191919191894343434545453 3 3 3 3 3 3 1313131391919139654...最後に鍵をサーバ上に保存する必要があり、その後、XORと同様の暗号化アルゴリズムを利用して暗号化されたユーザの暗号化情報を解読することができる。前の部分で紹介したXORでこの鍵を使うのはとても簡単です。もう詳しく説明しません。