实验五md5的加密与解密及使用php对MD5进行改进

实验项目:实验五md5的加密与解密及使用phpMD5进行改进

实验目的:认识md5算法,用工具实现对字符使用md5算法加密与解密,php中使用php字符串处理来进行一些简单改进。


  1. 实验原理

MD5加密原理:

MD5算法过程

MD5算法简要的叙述可以为:MD5512位分组来处理输入的信息,且每一分组又被划分为1632位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

第一步、填充:如果输入信息的长度(bit)512求余的结果不等于448,就需要填充使得对512求余的结果等于448。填充的方法是填充一个1n0。填充完后,信息的长度就为N*512+448(bit)

第二步、记录信息长度:用64位来存储填充前信息长度。这64位加在第一步结果的后面,这样信息长度就变为N*512+448+64=(N+1)*512位。

第三步、装入标准的幻数(四个整数):标准的幻数(物理顺序)是(A=(01234567)16B=(89ABCDEF)16C=(FEDCBA98)16D=(76543210)16)。如果在程序中定义应该是:
A=0X67452301LB=0XEFCDAB89LC=0X98BADCFELD=0X10325476L)。有点晕哈,其实想一想就明白了。

第四步、四轮循环运算:循环的次数是分组的个数(N+1

1)将每一512字节细分成16个小组,每个小组64位(8个字节)

2)先认识四个线性函数(&是与,|是或,~是非,^是异或)

  1. G(X,Y,Z)=(X&Z)|(Y&(~Z))

  2. H(X,Y,Z)=X^Y^Z

  3. I(X,Y,Z)=Y^(X|(~Z))

3)设Mj表示消息的第j个子分组(从015

4)四轮运算

5)每轮循环后,将ABCD分别加上abcd,然后进入下一循环。

MD5改进原理:

  1. 对输入的密码进行md5加密

  2. 截取加密后的字符串从第四位开始截取8

  3. 写出一个字典,使用phparray_rand()产生一个随机的8位数字符串

  4. 用产生后的字符串替换截取出来的字符串

  5. 验证改进的md5秘文能不能使用一般工具进行解密

  1. 实验步骤

  1. md5加密在php中的应用:

  1. php代码:

<?php

$pswd1=md5("123");

echo"使用md5加密后的密文一";

echo$pswd1;


$pswd2=md5("abc");

echo"使用md5加密后的密文二";

echo$pswd2;

?>

  1. php使用md5加密运行结果:

123使用md5加密后秘文为:202cb962ac59075b964b07152d234b70

abc使用md5加密后秘文为:900150983cd24fb0d6963f7d28e17f72

  1. Md5安全问题:

2004817日的美国加州圣巴巴拉的国际密码学会议(Crypto’2004)上,来自中国山东大学的王小云教授做了破译MD5HAVAL-128MD4RIPEMD算法的报告,公布了MD系列算法的破解结果。宣告了固若金汤的世界通行密码标准MD5的堡垒轰然倒塌,引发了密码学界的轩然大波。

说明md5加密并不安全

  1. Md5在线解密:

202cb962ac59075b964b07152d234b70进行在线解密,解密结果如下,在线网址为:

http://pmd5.com/?action=getpwd


900150983cd24fb0d6963f7d28e17f72进行在线解密,解密结果为:

  1. MD5进行一些改进:

改进的php代码:

<?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;

?>

  1. 改进后截图:

123使用改进后的md5加密密文为:202ctyzDJNPX075b964b07152d234b70

再次对202ctyzDJNPX075b964b07152d234b70进行解密,结果为:

实验结束

实验中出现的问题及解决方法:

  1. MD5算法原理掌握不过透彻(查网络解决)

  2. 对改进后的md5算法没有进行安全验证

  3. 改进后的md5是否为可逆运算

实验结论:

1.利用phpmd5算法进行简单改进,可以提高安全性,防止md5秘文被窃取而发生危害,提高了安全性。改进后的MD5不可逆,因为本身md5是不可逆算法。

教师评语:




得分:


猜你喜欢

转载自blog.csdn.net/qq_38483191/article/details/80273344
今日推荐