mysql获取首行_PHP+MySQL应用中使用XOR运算加密算法,这些知识您了解多少?

HP+MYSQL应

使用XOR运算加密算法

本文将介绍一个简单易用的加密/解密算法:使用异或(XOR)运算。本算法原理简单,旨在使读者对信息的加密/解密有一个更加直观的印象。

01

XOR算法原理

从加密的主要方法看,换位法过于简单,特别是对于数据量少的情况很容易由密文猜出明文,而替换法不失为一种行之有效的简易算法。
从各种替换法运算的特点看,异或运算最适合用于简易加解密运算,这种方法的原理是:当一个数A和另一个数B进行异或运算会生成另一个数C,如果再将C和B进行异或运算则C又会还原为A。
相对于其他的简易加密算法,XOR算法的优点如下:

(1)算法简单,对于高级语言很容易能实现。
(2)速度快,可以在任何时候、任何地方使用。
(3)对任何字符都是有效的,不像有些简易加密算法,只对西文字符有效,对中文加密后再解密无法还原为原来的字符。               

02

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];}}13return$string;14}

第4行定义了加密函数myEncrypt(),输入参数$string为明文,而$key为密钥;输出为使用$key作为密钥并使用XOR加密算法产生的密文.第6~12行的外层for循环对明文字符串的每一个字符进行循环,而内层的for循环(第8~11行)对明文的每一字符循环与密钥的每一位做异或运算。其原理已经在上一小节中介绍,不再重述。

6a707046aea789cd34554988ab2f9cc3.png

同样,与加密函数类似,

可以写出下面的解密函数

e08b9ea6f06ceb453cf61ae40cd4fa08.gif
//解密函数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解密算法产生的明文。

下面,通过一个应用示例来进一步说明

加密函数的功能

e08b9ea6f06ceb453cf61ae40cd4fa08.gif
//示例$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行将密文解密。

上面示例的运行结果如下

e08b9ea6f06ceb453cf61ae40cd4fa08.gif
my_password=chairmy_password_en=RYPXCmy_password_de=chair
用XOR算法实现身份验证上两部分分别介绍了使用XOR运算进行信息加密/解密的原理和实现,下面,将使用这一方法来对用户的登录密码进行加密。本例中,为了保护用户的密码,系统想要达到的目的如下。
·在用户注册时,用户需要添写用户密码表单。
·除用户本人之外,其他任何人都无法获取其密码信息,包括系统设计者和数据库管理员。
·系统能根据用户输入的密码验证用户的合法性。为了达到以上目的,使用XOR算法时可以选择用户名作为明文,而密钥是用户自定义的密码,然后将加密后的用户名存储在数据库中。另外,在用户登录的时候,有以下两种方式来验证合法用户。 (1)根据其提交的用户名(明文)和密码(密钥)信息重新加密,并使用加密后的信息与数据库中存储的密码信息进行比较,如果相等,则用户合法,否则,为非法用户。
(2)根据数据库中存储的密码信息(明文)和用户输入的密码(密钥)信息进行解密,并把加密后的信息与用户提交的用户名进行比较,如果相等,则用户合法,否则,为非法用户。 两种方式都可以实现第3个目的,本例,将采用第2种方式。本例的实现代码可在18.4.1节“用户登录”和18.4.2节“检查用户”的实现基础之上实现,其中“用户登录”页面无需变化,“检查用户”的实现参考如下。
<?phpsession_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行通过比较解密后的值与用户提交的用户名信息来检查用户的合法性。

自动生成密钥

e08b9ea6f06ceb453cf61ae40cd4fa08.gif 上一部分介绍了如何使用XOR加密算法进行对用户信息的加密,其中,用户所输入的口令信息实际上成为了加密算法中的密钥,而用户名作为明文使用,虽然这能很好地完成功能,但是在逻辑上,这种方法似乎有些不合理。本文将介绍一种自动生成密钥的技术,可以使用自动生成的密钥对用户提交的密码明文加密,使逻辑更加合理一些。

本例,假设生成的密钥为512位

代码如下

e08b9ea6f06ceb453cf61ae40cd4fa08.gif
<!--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_namefunctionwrite_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种方式。

e08b9ea6f06ceb453cf61ae40cd4fa08.gif 具体地,上面代码第11~18行通过生成随机数的方式来不断生成密钥,并通过一个计算来增强其复杂性。其中的lowerbound和upperbound的数值其实就是你想使用来加密的ASCII字符范围。下面是生成的一个密钥文件示例。
208123915925183361116049369344372701567721435181102718332639307390344373445407524316475863232913993383189547474747394154915312639841226741894189965623523913011164730113445201935692839710274127251577929493941487145611337531549110895367593586318332391170941272701152344371709270125776235313540032267139933835677407617384135696111239130732949469623520815987524358635491542913374933524334454251400327015367133759324537171709152357391089524342514685239122673135531363151191833412771743139654…

最后,需要把密钥保存在服务器上一个安全的地方,然后就可以利用其和诸如XOR这样的加密算法来对用户信息进行加密/解密了。如何在上一部分介绍的XOR中使用这个密钥非常简单,不再详述!

往期回顾

浅谈sqlserver2005的文件和文件组

电脑怎么设置开机界面个性签名

Msf篇之神偷木马

f9ca24f079f593f0ff083d250fea7246.png

ec536b84a43f5ea7b1fcd15e030c2ac2.png

转载是一种动力 分享是一种美德

75cdc2d5799c5a416752df929724956a.png

动动小手 点个【在看】再走

a7d2627023b27ff4aaccf450f43516a5.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答你的问题。 首先,让我们来了解一下移位 XOR 加密算法的原理。这种加密算法是通过将明文的每个字符与一个密钥的对应字符进异或操作来实现的。具体来说,如果明文为 M,密钥为 K,加密后的密文为 C,那么加密过程如下: * 对于明文的每个字符 M[i],将其与密钥对应的字符 K[i%len(K)] 进异或操作,得到密文的对应字符 C[i]。 解密过程与加密过程类似,只需要将密钥的字符和密文的字符进异或操作即可。 接下来,我们来看一下如何使用 Python 实现移位 XOR 加密算法的还原过程。假设我们已经得到了加密后的密文 C 和密钥 K,那么还原过程如下: ```python def decrypt(ciphertext, key): plaintext = "" for i in range(len(ciphertext)): # 对每个密文字符和密钥字符进异或操作 plainchar = chr(ord(ciphertext[i]) ^ ord(key[i % len(key)])) plaintext += plainchar return plaintext ``` 在上面的代码,我们首先定义了一个 decrypt 函数,它接受两个参数:密文和密钥。然后,我们使用一个 for 循环遍历密文的每个字符,并将其与密钥对应的字符进异或操作,最终得到还原后的明文。 注意,在 Python ,我们可以使用 ord 函数将字符转换为 ASCII 码,使用 chr 函数将 ASCII 码转换回字符。另外,由于 Python 的字符串是不可变的,这里我们使用一个空字符串 plaintext 来逐步构建还原后的明文。 希望这个答案能够帮到你!如果你有其他问题,可以继续问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值