MD5加密算法

原创 2018年04月16日 21:50:04
MD5算法:
对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,
且每一分组又被划分为16个32位子分组,经过了一系列的处理后,
算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。


在MD5算法中,首先需要对信息进行填充,使其位长对512求余的结果等于448,并且填充必须进行,
即使其位长对512求余的结果等于448。因此,信息的位长(Bits Length)将被扩展至N*512+448,N为一个非负整数,N可以是零。
填充的方法如下:
1) 在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。
2) 在这个结果后面附加一个以64位二进制表示的填充前信息长度(单位为Bit),如果二
进制表示的填充前信息长度超过64位,则取低64位。
经过这两步的处理,信息的位长=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。
这样做的原因是为满足后面处理中对信息长度的要求。
2. 初始化变量
初始的128位值为初试链接变量,这些参数用于第一轮的运算,以大端字节序来表示,
他们分别为: A=0x01234567,B=0x89ABCDEF,C=0xFEDCBA98,D=0x76543210。
(每一个变量给出的数值是高字节存于内存低地址,低字节存于内存高地址,即大端字节序。
在程序中变量A、B、C、D的值分别为0x67452301,0xEFCDAB89,0x98BADCFE,0x10325476)
3. 处理分组数据
每一分组的算法流程如下:
第一分组需要将上面四个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d。
从第二分组开始的变量为上一分组的运算结果,即A = a, B = b, C = c, D = d。
主循环有四轮(MD4只有三轮),每轮循环都很相似。第一轮进行16次操作。
每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。
再将所得结果向左环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a、b、c或d中之一。
以下是每次操作中用到的四个非线性函数(每轮一个)。
F( X ,Y ,Z ) = ( X & Y ) | ( (~X) & Z )
G( X ,Y ,Z ) = ( X & Z ) | ( Y & (~Z) )
H( X ,Y ,Z ) =X ^ Y ^ Z
I( X ,Y ,Z ) =Y ^ ( X | (~Z) )
(&是与(And),|是或(Or),~是非(Not),^是异或(Xor))
这四个函数的说明:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。
F是一个逐位运算的函数。即,如果X,那么Y,否则Z。函数H是逐位奇偶操作符。
算法原理


1、数据填充


对消息进行数据填充,使消息的长度对512取模得448,设消息长度为X,即满足X mod 512=448。根据此公式得出需要填充的数据长度。


填充方法:在消息后面进行填充,填充第一位为1,其余为0。


2、添加消息长度


在第一步结果之后再填充上原消息的长度,可用来进行的存储长度为64位。如果消息长度大于264,则只使用其低64位的值,即(消息长度 对 264取模)。


在此步骤进行完毕后,最终消息长度就是512的整数倍。


3、数据处理


准备需要用到的数据:


4个常数: A = 0x67452301, B = 0x0EFCDAB89, C = 0x98BADCFE, D = 0x10325476;
4个函数:F(X,Y,Z)=(X & Y) | ((~X) & Z); G(X,Y,Z)=(X & Z) | (Y & (~Z));  H(X,Y,Z)=X ^ Y ^ Z; I(X,Y,Z)=Y ^ (X | (~Z));
把消息分以512位为一分组进行处理,每一个分组进行4轮变换,以上面所说4个常数为起始变量进行计算,重新输出4个变量,以这4个变量再进行下一分组的运算,如果已经是最后一个分组,则这4个变量为最后的结果,即MD5值。
在java用MD5来实现加密:
该MessageDigest类为应用程序提供消息摘要算法的功能,如SHA-1或SHA-256。 
//消息摘要是采用任意大小的数据并输出固定长度散列值的安全单向散列函数。
public static String md5(String plainText) {
byte[] secretBytes = null;
try {
secretBytes = MessageDigest.getInstance("md5").digest(
plainText.getBytes());
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("没有md5这个算法!");
}
String md5code = new BigInteger(1, secretBytes).toString(16);
for (int i = 0; i < 32 - md5code.length(); i++) {
md5code = "0" + md5code;
}
return md5code;
}
调用时只需转换就可以了
String name = request.getParameter("name");
String password  = MD5Utils.md5(request.getParameter("password"));

加密后存到数据库内这样就看不到是什么样了

/**
 * MD5加密
 * @author 555
 *
 */
public class MD5Utils {
    /**
	 * ʹmd5加密
	 */
	public static String md5(String plainText) {
		byte[] secretBytes = null;
		try {
			secretBytes = MessageDigest.getInstance("md5").digest(
					plainText.getBytes());
		} catch (NoSuchAlgorithmException e) {
			throw new RuntimeException("uuid");
		}
		String md5code = new BigInteger(1, secretBytes).toString(16);
		for (int i = 0; i < 32 - md5code.length(); i++) {
			md5code = "0" + md5code;
		}
		return md5code;
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37256896/article/details/79967217

JAVA 实现MD5加密算法

JAVA实现MD5加密算法
  • github_38151745
  • github_38151745
  • 2017-08-09 17:17:51
  • 251

md5加密算法的c++代码实现

  • 2008年04月19日 12:28
  • 14KB
  • 下载

md5加密算法md5加密算法

  • 2010年05月11日 20:34
  • 9KB
  • 下载

MD5加密算法 C++

MD5加密算法 C++
  • scimence
  • scimence
  • 2016-07-23 16:41:49
  • 901

md5加密算法c实现,七分注释

经常到csdn来是查资料,每次都会有所收获。总是看别人的感觉很不好意思,于是决定自己也写一点东西贡献出来。于是就有了这篇md5七分注释。希望对用到的朋友有所帮助。记得当初自己刚开始学习md5的时候,从...
  • coder0621
  • coder0621
  • 2007-03-23 21:46:00
  • 15270

"MD5"加密算法全解析

一."信息摘要对象"通过单例获取:md5 字符串: 1.获取字符串的字节数组 2.md5对字节数组获取"摘要字节数组" 文件: 1.获取文件的读取流 2.对文件读取流读取进字节数组,逐个更新读取到的数...
  • nzfxx
  • nzfxx
  • 2016-07-01 20:56:08
  • 8833

关于Md5加密算法的原理及应用

MD5是一个安全的散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程不可逆;所以要解密MD5没有现成的算法,只能用穷举法,把可能出现的明文,用MD5算法散列之后...
  • marvel_cheng
  • marvel_cheng
  • 2016-09-17 10:25:39
  • 1291

MD5加密算法(java及js)

为了防止用户登陆过程中信息被拦截导致信息泄露,我们应该在客户端就对用户密码进行加密。浏览器提交给服务器的是加密后的信息,即使被恶意拦截,被拦截信息也已做了加密处理,现在比较安全的一种加密算法是MD5加...
  • u012116457
  • u012116457
  • 2015-04-06 22:22:22
  • 1950

JAVA 的MD5加密算法源代码

import java.security.*;import java.security.spec.*;class MD5_Test{   public final static String MD5(...
  • gujinpeng
  • gujinpeng
  • 2005-01-14 11:30:00
  • 1100

MD5加密算法详细分析_C实现

MD5加密算法 维基百科对其描述: MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(h...
  • chudongfang2015
  • chudongfang2015
  • 2016-06-22 23:14:48
  • 5279
收藏助手
不良信息举报
您举报文章:MD5加密算法
举报原因:
原因补充:

(最多只允许输入30个字)