实验项目:实验五md5的加密与解密及使用php对MD5进行改进 |
|
实验目的:认识md5算法,用工具实现对字符使用md5算法加密与解密,在php中使用php字符串处理来进行一些简单改进。 |
|
MD5加密原理: MD5算法过程 对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。 第一步、填充:如果输入信息的长度(bit)对512求余的结果不等于448,就需要填充使得对512求余的结果等于448。填充的方法是填充一个1和n个0。填充完后,信息的长度就为N*512+448(bit); 第二步、记录信息长度:用64位来存储填充前信息长度。这64位加在第一步结果的后面,这样信息长度就变为N*512+448+64=(N+1)*512位。 第三步、装入标准的幻数(四个整数):标准的幻数(物理顺序)是(A=(01234567)16,B=(89ABCDEF)16,C=(FEDCBA98)16,D=(76543210)16)。如果在程序中定义应该是: 第四步、四轮循环运算:循环的次数是分组的个数(N+1) 1)将每一512字节细分成16个小组,每个小组64位(8个字节) 2)先认识四个线性函数(&是与,|是或,~是非,^是异或)
3)设Mj表示消息的第j个子分组(从0到15) 4)四轮运算 5)每轮循环后,将A,B,C,D分别加上a,b,c,d,然后进入下一循环。 MD5改进原理:
$pswd1=md5("123"); echo"使用md5加密后的密文一"; echo$pswd1; $pswd2=md5("abc"); echo"使用md5加密后的密文二"; echo$pswd2; ?>
对123使用md5加密后秘文为:202cb962ac59075b964b07152d234b70 对abc使用md5加密后秘文为:900150983cd24fb0d6963f7d28e17f72
2004年8月17日的美国加州圣巴巴拉的国际密码学会议(Crypto’2004)上,来自中国山东大学的王小云教授做了破译MD5、HAVAL-128、MD4和RIPEMD算法的报告,公布了MD系列算法的破解结果。宣告了固若金汤的世界通行密码标准MD5的堡垒轰然倒塌,引发了密码学界的轩然大波。 说明md5加密并不安全
对202cb962ac59075b964b07152d234b70进行在线解密,解密结果如下,在线网址为: http://pmd5.com/?action=getpwd 对900150983cd24fb0d6963f7d28e17f72进行在线解密,解密结果为: |
|
改进的php代码: $pswd1=md5("123"); $pswd2=substr($pswd1,4,8); //替换字符串的产生 $chars= array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j','k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u','v', 'w', 'x', 'y','z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H','I', 'J', 'K', 'L','M', 'N', 'O','P', 'Q', 'R', 'S', 'T', 'U','V', 'W', 'X', 'Y','Z', '0', '1', '2', '3', '4', '5', '6', '7','8', '9', '!', );
$keys =array_rand($chars, 8); // 在$chars中随机取8个数组元素键名 $password =''; for($i = 0;$i < $length; $i++) { // 将$length个数组元素连接成字符串 $password.= $chars[$keys[$i]]; //产生8位随机字符串 } $pswd3=str_replace($pswd2,$password ,$pswd1); echo"使用改进后md5加密后的密文"; echo$pswd3; ?>
对”123”使用改进后的md5加密密文为:202ctyzDJNPX075b964b07152d234b70 再次对202ctyzDJNPX075b964b07152d234b70进行解密,结果为: 实验结束 |
|
实验中出现的问题及解决方法:
|
|
实验结论: 1.利用php对md5算法进行简单改进,可以提高安全性,防止md5秘文被窃取而发生危害,提高了安全性。改进后的MD5不可逆,因为本身md5是不可逆算法。 |
|
教师评语: |
得分: |