XOR 알고리즘의 원리
암호화의 주요 방식으로 보면 전치 방식이 너무 단순하다. 특히 데이터의 양이 적을 경우 암호문에서 평문을 추측하기가 쉽다. 대체 방법은 효과적인 간단한 알고리즘입니다.
다양한 대체 연산의 특성상 XOR 연산은 간단한 암호화 및 복호화 연산에 가장 적합합니다. 이 방법의 원리는 숫자 A와 다른 숫자 B를 XOR하면 다음을 생성합니다. 숫자 C에서 C와 B가 XOR되면 C는 A로 복원됩니다.
다른 단순 암호화 알고리즘과 비교하여 XOR 알고리즘의 장점은 다음과 같습니다.
(1) 알고리즘이 간단하여 고급 언어로 쉽게 구현할 수 있습니다.
(2) 속도가 빠르고 언제 어디서나 사용할 수 있습니다.
(3)은 모든 문자에 유효합니다. 서양 문자에만 유효한 일부 단순 암호화 알고리즘과 달리 한자는 암호화 및 복호화 후에 원래 문자로 복원할 수 없습니다.
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 알고리즘을 이용한 인증 구현
앞의 두 부분에서는 XOR 연산을 이용한 정보 암복호화의 원리와 구현을 소개합니다. 이면 이 방법은 사용자의 로그인 비밀번호를 암호화하는 데 사용됩니다. 이 예에서 시스템은 사용자의 비밀번호를 보호하기 위해 다음과 같은 목적을 달성하려고 합니다.
·등록 시 사용자 비밀번호 양식을 작성해야 합니다.
·사용자 자신 외에 시스템 설계자, 데이터베이스 관리자를 포함한 누구도 그의 비밀번호 정보를 얻을 수 없습니다.
·시스템은 사용자가 입력한 비밀번호를 기반으로 사용자의 적법성을 확인할 수 있습니다.
위 목적을 달성하기 위해 XOR 알고리즘을 사용할 때 사용자 이름을 일반 텍스트로 선택하고 키는 사용자 정의 비밀번호를 선택한 다음 암호화된 사용자 이름을 데이터베이스에 저장할 수 있습니다.
또한, 이용자가 로그인 시 적법한 이용자를 확인하는 방법은 다음과 같은 두 가지 방법이 있습니다.
(1) 제출된 사용자 이름(일반 텍스트)과 비밀번호(키) 정보를 기반으로 다시 암호화하고, 암호화된 정보를 사용하여 데이터베이스에 저장된 비밀번호 정보와 비교하면 해당 사용자는 합법적입니다. , 그렇지 않으면 불법 사용자의 경우입니다.
(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행에서는 이전 섹션에서 소개한 두 가지 기능을 포함하여 암호화 기능 파일 encrypy_xor.php를 소개합니다.
19행에서는 사용자가 제출한 사용자 이름과 비밀번호를 사용하여 암호화된 비밀번호 값을 얻고, 신규 사용자의 경우 44행에서 암호화된 값을 데이터베이스에 저장합니다.
또한 기존 사용자의 경우 24행에서 데이터베이스에 있는 사용자 이름과 암호화된 비밀번호 정보를 얻고, 이 두 값을 사용하여 25행에서 복호화한 후 복호화된 값을 제출된 값과 비교합니다. 28행에서 사용자가 사용자의 적법성을 확인하기 위한 사용자 이름 정보입니다.
자동으로 키 생성
앞에서는 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中文网!