ホームページ  >  記事  >  バックエンド開発  >  PHPにおけるXOR演算を利用した暗号化アルゴリズムの共有 MySQL application_PHPチュートリアル

PHPにおけるXOR演算を利用した暗号化アルゴリズムの共有 MySQL application_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:25:35710ブラウズ

XORアルゴリズムの原理

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

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

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

(1) アルゴリズムがシンプルで、高級言語で簡単に実装できます。

(2) 高速で、いつでもどこでも使用できます。

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

XORアルゴリズムの実装

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

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


//Encryption function
functionmyEncrypt( $string,$key)
{
for($i=0;$i
{
for($j=0;$j< STRLEN($KEY );p$j++)<>
$string[$i]=$string[$i]^$key[$j];
}
}


No.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 をキーとして使用し、XOR 復号化アルゴリズムを使用して生成された平文。
以下では、アプリケーション例を使用して、暗号化機能の機能をさらに説明します。


コードをコピーします
コードは次のとおりです: //Example$my_password="chair";
echo"my_password=$my_password";
$my_password_en= myEncrypt($my_password,$my_key);
echo"my_password_en=$my_password_en"
$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「ユーザーの確認」の実装リファレンスを変更する必要はありません。ユーザーを確認する」は以下の通りです。
コードをコピーします コードは次のとおりです:

session_start();//セッションライブラリをロードします。最初の行に配置する必要があります
$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);//データベースを選択します 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 ビットであると想定されています。コードは以下のように表示されます。

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


//長さ $len
functiongenerate_key($) のキーを自動的に生成しますlen )
{
$ lowerbound=35;
$strMyKey="";
for($i=1;$i<=$len;$i++)
$rnd=rand(0,100 ) ;//乱数を生成します
$k=(($upperbound-$ lowerbound)+1)*$rnd+$ lowerbound;
}
return$strMyKey;キーをファイル $file_name に書き込みます
functionwrite_key($key,$file_name)
{
$key=generate_key($key,512);
//Open $ using add モード filename の場合、ファイル ポインタはファイルの最後にあります
if(!$handle=fopen($filename,'w'))
print "ファイル $filename を開けません"
}
; //Change $key 開いたファイルに書き込みます。
if(!fwrite($handle,$key))
{
print "ファイル $filename に書き込めません";
}
fclose($handle)
}
//キー ファイルを読み取ります
; functionget_key($file_name)
{
//ファイルを開きます
$fp=fopen($file_name,"r")
$result="";
//1 行ずつ読み取ります
while(!feof( $fp); )
{
$buffer=fgets($fp,4096);
$result=$result.$buffer;
}
///*
$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$ を読み取りますfile_name のキー値が使用される場合、ユーザーが初めてシステムにログインするときに、ユーザー用にキー値が自動的に生成されます。このキー値を処理するには 2 つの方法があります。
(1) データベースの特定のフィールドに保存します。この方法の欠点は、データベース内のキーのセキュリティが保証できないことです。
(2) キーをユーザーのローカル ファイルに保存することで、他の人がキーを取得するのを防ぎますが、この方法の欠点は、ユーザーが他のマシンを使用してシステムにアクセスすると、ログインできないことです。
この例では、2 番目の方法が使用されます。
具体的には、上記のコードの 11 行目から 18 行目は、乱数を生成することでキーを継続的に生成し、計算によってその複雑さを高めます。下限値と上限値は、実際には暗号化に使用する ASCII 文字の範囲です。以下は、生成されたキー ファイルの例です。
52431647586323291399338318954747474 7394154915312639841226741894189965623523913
0111647301134452019356928397102741 272515779294939414871456113375315491108953 67
59358631833239117094127270115234437170927012577623531354003226713993383567 7407
617384135696111239130732949469623 520815987524358635491542913374933524334454251
400327015367133759324537171709 15235739108952434251468523912267313553136315 1191
833412771743139654…
最後に、キーをサーバー上の安全な場所に保存する必要があります。その後、それと XOR などの暗号化アルゴリズムを使用してユーザーを暗号化できます。情報/復号化されました。前のセクションで紹介した XOR でこのキーを使用する方法は非常に簡単なので、詳細は説明しません。




http://www.bkjia.com/PHPjc/324110.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/324110.html

技術記事 XOR アルゴリズムの原理 主な暗号化方式から、転置方式は単純すぎる、特にデータ量が少ない場合、暗号文から平文を推測するのが容易で、置換方式は効果的でシンプルです...

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