XOR アルゴリズムの原理
主要な暗号化方式から、転置方式は単純すぎるため、特にデータ量が少ない場合、暗号文から平文を推測するのが容易であり、置換方式は効果的でシンプルなアルゴリズムです。
さまざまな置換演算の特性から、XOR 演算は単純な暗号化および復号化演算に最も適しています。この方法の原理は、数値 A と別の数値 B を XOR 演算すると、別の数値 C が生成されます。 C と B を XOR 演算すると、C は A に復元されます。
他の単純な暗号化アルゴリズムと比較した場合、XOR アルゴリズムの利点は次のとおりです。
(1) アルゴリズムがシンプルで、高級言語で簡単に実装できます。
(2) 高速で、いつでもどこでも使用できます。
(3) はどの文字に対しても有効であり、西洋文字にのみ有効な一部の単純な暗号化アルゴリズムとは異なり、中国語の文字は暗号化および復号化後に元の文字に戻すことができません。
XOR アルゴリズムの実装
前のパートでは、暗号化/復号化に XOR 演算を使用する方法の原理を紹介しました。このセクションでは、XOR 演算を使用してユーザーのログイン情報を暗号化します。前のセクションで紹介した XOR 暗号化アルゴリズムの原理に従って、次の暗号化関数と復号化関数を作成するのは難しくありません。暗号化アルゴリズムが最初にリストされます。
コードをコピー コードは次のとおりです:
//暗号化関数
functionmyEncrypt($string,$key)
{
for($i=0;$i< STRLEN($ STRING);p$i )
{
for($j=0;$j
$ string[$i]=$string[$i]^$key[$j];
}
}
return$string
}
コードをコピー コードは次のとおりです:
//復号化関数
functionmyDecrypt($string,$key)
{
for($i=0;$i
{
for($j=0;$j
$string[$i]=$key[$j]^$string[$i];
}
}
return$ string;
}
?>
コードをコピー コードは次のとおりです。
//例
$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);
エコー "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 アルゴリズムを使用した認証
前の 2 つのパートでは、XOR 演算を使用した情報の暗号化/復号化の原理と実装を紹介します。このメソッドは、ユーザーのログイン パスワードを暗号化するために使用されます。この例では、ユーザーのパスワードを保護するために、システムは次の目的を達成したいと考えています。
・登録の際、ユーザーはユーザーパスワードフォームに記入する必要があります。
・ユーザー自身以外に、システム設計者やデータベース管理者を含む他の誰もパスワード情報を取得することはできません。
・システムは、ユーザーが入力したパスワードに基づいてユーザーの正当性を検証できます。
上記の目的を達成するために、XOR アルゴリズムを使用する場合、ユーザー名をプレーン テキストとして選択し、キーとしてユーザー定義のパスワードを選択し、暗号化されたユーザー名をデータベースに保存します。
さらに、ユーザーがログインするときに、正当なユーザーであることを確認する方法が 2 つあります。
(1) 送信されたユーザー名 (平文) とパスワード (鍵) 情報に基づいて再暗号化し、暗号化された情報を使用してデータベースに保存されているパスワード情報と比較し、それらが等しい場合、そのユーザーは正当です。それ以外の場合は、違法ユーザーの場合。
(2) データベースに保存されているパスワード情報(平文)とユーザーが入力したパスワード(鍵)情報を基に復号し、暗号化された情報とユーザーが提出したユーザー名が一致する場合を比較します。の場合、ユーザーは正当です。それ以外の場合、ユーザーは違法なユーザーです。
どちらの方法でも 3 番目の目的を達成できます。この例では 2 番目の方法が使用されます。この例の実装コードは、セクション 18.4.1「ユーザー ログイン」およびセクション 18.4.2「ユーザーの確認」の実装リファレンスを変更する必要はありません。ユーザーを確認する」は以下の通りです。
コードをコピー コードは次のとおりです:
session_start();//セッション ライブラリは必ず最初の行に配置してください
$user_name=$_POST["user_name"];
session_register("user_name");//$user_name 変数を登録します。$ がないことに注意してください。 symbol
require_once("sys_conf.inc" );//データベース構成情報を含むシステム構成ファイル
require_once("encrypy_xor.php");//XOR 暗号化関数ファイルが含まれます
// database
$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);//ユーザーを暗号化しますinformation
//古いユーザーの場合
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)"; mysql_query($str,$link_id);//クエリを実行
require ("main.php");//チャットページに移動
}
//データベースを閉じる
mysql_close($ link_id);
?>
コードをコピー コードは次のとおりです:
//自動生成される長さは $ ですlen
functiongenerate_key($len)
{
$ lowerbound=35;
$strMyKey=""; ; $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 のキーを自動的に生成します。