MD5算法实现
MD5算法的简要叙述为:
MD5以512位分组来处理输入的信息(512位分组?每次处理都取出512位数据?),
每一分组又被划分为16个32位子分组(16乘32刚好是512),
经过一些列的处理后(怎么处理的?),算法的输出由四个32位分组组成,
将这4个32位分组级联后将生成一个128位的散列值(那么这个散列值是最后的加密结果咯)。
在MD5算法中,首先需要对信息进行填充,使其位长度对512求余的结果等于448。
因此,信息的位长度(Bits Length)将被扩展至N*512+448,即N*64+56个字节(Bytes),N是一个正整数。
填充方法如下:
在信息的后面填一个和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在这个结果后面附加一个以64位二进制表示的填充前信息长度。
(这里的信息长度应该是位长度吧?)。经过这两步的处理,现在的信息字节长度=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。
这样也是为了满足后面处理中对信息长度的要求。
MD5中有4个32为被称为链接变量(Chaining Variable)的整数参数,它们分别是:
A=0x01234567,
B=0x89abcdef,
C=0xfedcba98,
D=0x76543210,
(这四个数是大端法表示的!每一个变量给出的数值是高字节存于内存低地址,低字节存于内存高地址,即大端字节序。
在程序中变量A、B、C、D的值分别为0x67452301,0xEFCDAB89,0x98BADCFE,0x10325476,马丹,这里有点搞不清白)
当设置好这四个链接变量之后,就开始进入算法的四轮循环运算。循环的次数是信息中512位信息分组的数目。
(也就是说经过填充之后的数据位数是512的整数倍,然后按照顺序每次取出512位拿过来进行四轮处理)
将上面4个链接变量复制到另外4个变量中:A到a,B到b,C到c,D到d。
主循环有四轮(MD4只有三轮,三轮车?),每轮循环都很相似。
第一轮进行16次操作。每次操作对a、b、c和d中的3个做一次非线性函数运算,然后将所得的结果依次加上第四个变量、文本的一个子分组和一个常数。
再将所得的结果向右循环移动一个不定的数,并加上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))
(&是与,|是或,~是非,^是异或)
这四个函数的说明:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。
F是一个逐位运算的函数。即,如果X,那么Y,否则Z。
H是逐位奇偶操作符。
假设Mj表示消息的第j个子分组(从0到15),
FF(a, b, c, d, Mj, s, ti)表示a = b + ((a + F(b, c, d) + Mj + ti) << s),
GG(a, b, c, d, Mj, s, ti)表示a = b + ((a + G(b, c, d) + Mj + ti) << s),
HH(a, b, c, d, Mj, s, ti)表示a = b + ((a + H(b, c, d) + Mj + ti) << s),
II(a, b, c, d, Mj, s, ti)表示a = b + ((a + I(b, c, d) + Mj + ti) << s),
(尼玛,这几个看着倒是挺对称的)
(<<是循环左移位,而不是左移位)
这四轮(一轮16步,取32位数处理,一共64步)是:
第一轮
第二轮
第三轮
第四轮
常数ti可以如下选择:
在第i步中,ti是4294967296*abs(sin(i))的整数部分,i的单位是弧度(4294967296等于2的32次方)。
在所有的这些都完成之后,将A、B、C、D分别加上a、b、c、d。然后用下一分组数据继续运行算法,最后的输出将是A、B、C和D的级联。
在Java中,java。security.MessageDigest中已经定义了MD5的计算,只需要简单地调用即可得到MD5的128位整数。
然后将此128位(16个字节)转换成十六进制表示即可。
package com.java.md5; public class MD5 {
public static String getMD5(byte[] source) {
String s = null;
char hexDigits[] = {'0','1','2','3','4','5','6','7','8','9','a',
'b','c','d','e','f'};
try {
java.security.MessageDigest md =
java.security.MessageDigest.getInstance("MD5");
md.update(source);
byte tmp[] = md.digest();
char str[] = new char[16*2];
int k = 0;
for (int i = 0; i < 16; i++) {
byte byte0 = tmp[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
s = new String(str);
} catch(Exception e) {
e.printStackTrace();
}
return s;
} public static void main(String[] args) {
String a = "I love you";
byte[] b = a.getBytes();
for (int i=0; i<b.length; i++)
System.out.print(b[i] + " ");
String str = MD5.getMD5(b);
System.out.println("a = " + a + "\n" + "str = " + str + "\n");
}
}
MD5算法实现的更多相关文章
- md5算法
md5算法 不可逆的:原文-->密文.用系统的API可以实现: 123456 ---密文 1987 ----密文: 算法步骤: 1.用每个byte去和11111111做与运算并且得到的是int类 ...
- MD5算法 简介
MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权费用. MD5功能 l 输入任 ...
- md5算法原理一窥(其一)
首先,需要了解的事,md5并不是传说中的加密算法,只是一种散列算法.其加密的算法并不是我们说所的那样固定不变,只是一种映射的关系. 所以解密MD5没有现成的算法,只能用穷举法,把可能出现的明文,用MD ...
- Java利用MessageDigest提供的MD5算法加密字符串或文件
MD5是常用的加密算法,也经常用于校验信息完整,如文件的完整性.用术语讲,MD5是一种消息摘要算法(Message Digest Algorithm).另外还有一种常用的消息摘要算法SHA1.如果想了 ...
- python学习笔记(MD5算法)
博主最近进度停滞了 对web开发理解欠缺好多内容 今天整理下MD5算法,这个涉及到mysql数据库存储用户表密码字段的时候 一般是带有加密的 # -*- coding: utf-8 -*- impor ...
- 在MAC平台下编译Ngnix ,由于MD5算法不能编译通过 解决办法
近期想学习Ngnix 代码,前些日子,对”自己下手狠一次“, 买了MAC 本. 所以想在Mac 上编译,是必须的,不然对不起自己的内心. 不巧遇到了MD5算法编译的问题 src/core/ngx_cr ...
- MD5算法步骤详解
转自MD5算法步骤详解 之前要写一个MD5程序,但是从网络上看到的资料基本上一样,只是讲了一个大概.经过我自己的实践,我决定写一个心得,给需要实现MD5,但又不要求很高深的编程知识的童鞋参考.不多说了 ...
- Java 实现Md5算法
package other; import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/* * ...
- MD5算法【计算文件和字符串的MD5值】
1. MD5算法是一种散列(hash)算法(摘要算法,指纹算法),不是一种加密算法(易错).任何长度的任意内容都可以用MD5计算出散列值.MD5的前身:MD2.MD3.MD4.介绍工具:CalcMD5 ...
- 经常使用MD5算法代码
经常使用的MD5算法代码日期: 2014年8月4日作者: 铁锚 MD5,全称为 Message Digest Algorithm 5(消息摘要算法第五版).详情请參考 维基百科:MD5 MD5加密后 ...
随机推荐
- HDUOJ--1874 畅通工程续
畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDUOJ ---1269迷宫城堡
http://acm.hdu.edu.cn/showproblem.php?pid=1269 迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory ...
- POJ----The Suspects
The Suspects Time Limit: 1000MS Memory Limit: 20000K Total Submissions: 18890 Accepted: 9150 Des ...
- Java并发编程,多线程[转]
Java并发编程 转自:http://www.cnblogs.com/dolphin0520/category/602384.html 第一个例子(没有阻塞主线程,会先输出over): package ...
- python学习笔记011——检查变量类型type()
>>> a = 1 >>> type(a) <class 'int'> >>> b = 1.0 >>> type(b ...
- 什么是Asterisk,它如何帮助我们的呼叫中心?
如今的呼叫中心与过去的呼叫中心有很大差异.过去,一间房屋或一座大楼,装上硬接线的POTS电话,招聘几名员工就可以建立一个呼叫中心.如今,这样的情形已经一去不复返,因为有许多新技术让呼叫中心变得更像是一 ...
- hdu 4971/ 2014多校/最大权闭合图
题意:n个项目(每一个相应获得一定价值).m个技术问题(每一个须要支出一定价值),每一个项目必须要攻克若干个技术问题.技术难题之间有拓扑关系. 关键是建图.一看,第一感觉就是最大权闭合图,马上建好了图 ...
- Python find() 方法
描述 Python find() 方法从字符串中找出某个子字符串第一个匹配项的索引位置,该方法与index() 方法一样,只不过如果子字符串不在字符串中不会报异常,而是返回-1. 语法 find() ...
- DNS与NS、NS记录
DNS:人们习惯记忆域名,但机器间互相只认IP地址,域名与IP地址之间是一一对应的,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,整个过程是自动进行的. 当你的网站制作完成 ...
- mysql 数据表的引擎 MyISAM 和 InnoDB
需要使用锁和事务时,必须使用InnoDB模式 可以通过以下语句查看表的类型 SHOW TABLE STATUS FROM [DATABASE_NAME] 修改数据表的引擎类型: navicat: 设计 ...