ホームページ >php教程 >php手册 >PHP MySQLアプリケーションでのXOR演算を利用した暗号化アルゴリズムの共有

PHP MySQLアプリケーションでのXOR演算を利用した暗号化アルゴリズムの共有

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBオリジナル
2016-06-13 12:06:20932ブラウズ

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
}


4 番目の行は、暗号化関数 myEncrypt() を定義し、入力パラメータ $string は平文、$key はキーです。出力は、$key をキーとして使用し、XOR 暗号化アルゴリズムを使用して生成された暗号文です。
行 6 ~ 12 の外側の for ループは平文文字列の各文字をループし、内側の for ループ (行 8 ~ 11) は平文の各文字とキーの各文字をループします。この原則は前のセクションで紹介されているため、繰り返し説明しません。
同様に、暗号化関数と同様に、次のような復号化関数を書くことができます。

コードをコピー コードは次のとおりです:


//復号化関数
functionmyDecrypt($string,$key)
{
for($i=0;$i
{
for($j=0;$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);
エコー "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);
?>

いいえ。7 行目では、前のセクションで紹介した 2 つの関数を含む暗号化関数ファイル encrypy_xor.php が導入されています。
19 行目では、ユーザーが送信したユーザー名とパスワードを使用して暗号化されたパスワード値が取得され、新規ユーザーの場合は、暗号化された値が 44 行目でデータベースに保存されます。
さらに、古いユーザーの場合は、24 行目でデータベース内のユーザー名と暗号化されたパスワード情報を取得し、これら 2 つの値を使用して 25 行目で復号化し、復号化された値を送信された値と比較します。ユーザーによる28行目 ユーザーの正当性を確認するためのユーザー名情報。
キーを自動的に生成する
前のパートでは、XOR 暗号化アルゴリズムを使用してユーザー情報を暗号化する方法を紹介しました。ユーザーが入力したパスワード情報は実際に暗号化アルゴリズムのキーとなり、ユーザー名はプレーン テキストとして使用されます。これはうまく機能しますが、論理的にはこのアプローチは少し不健全に思えます。
この記事では、キーを自動的に生成するテクノロジーを紹介します。自動生成されたキーを使用して、ユーザーが送信したパスワードの平文を暗号化し、ロジックをより合理化できます。
この例では、生成されたキーが 512 ビットであると想定されています。コードは次のとおりです。

コードをコピー コードは次のとおりです:



//自動生成される長さは $ です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 のキーを自動的に生成します。

◆ write_key($key,$file_name): キーをファイル $file_name に書き込みます。
◆ get_key($file_name): 読み取りキー ファイルのキー値 $file_name
ユーザーが初めてシステムにログインするときに、キー値が自動的に生成されます。このキー値を処理するには 2 つの方法があります。
(1) データベースの特定のフィールドに保存します。この方法の欠点は、データベース内のキーのセキュリティが保証されないことです。
(2) キーをユーザーのコンピュータ ファイルにローカルに保存します。 、これにより、他の人がキーを取得することを防ぐことができますが、この方法の欠点は、ユーザーが他のマシンを使用してシステムにアクセスすると、ログインできないことです。
この例では、2 番目の方法が使用されます。
具体的には、上記コードの 11 行目から 18 行目までは、乱数を生成することで鍵を連続的に生成し、計算によって複雑さを高めています。下限値と上限値は、実際には暗号化に使用する ASCII 文字の範囲です。以下は、生成されたキー ファイルの例です。
208123915925183361116049369344372701567721435181102718332639307390344373445407
524316475863232913993383189547474 747394154915312639841226741894189965623523913 95367
593586318332391170941272701152344371709270125776235313540032267139 933835677407
6173841356961112391307329494 69623520815987524358635491542913374933524334454251 1363151191
8334127717 43139654…
最後に、サーバー上の安全な場所にキーを保存する必要があります。ユーザー情報を暗号化/復号化するために XOR などの暗号化アルゴリズムとともに使用されます。前のセクションで紹介した XOR でこのキーを使用する方法は非常に簡単なので、詳細は説明しません。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。