Posted on 2008-10-21 23:36
viita 阅读(1030)
评论(0) 编辑 收藏 所属分类:
struts
MD5的全称是Message-digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc,的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。
不管是MD2、MD4还是MD5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。
在MD5算法中,首先需要对信息进行填充,使其字节长度对512求余的结果等于448。因此,信息的字节长度(Bits Length)将被扩展至N*512+448,即N*64+56个字节(Bytes),N为一个正整数。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,现在的信息字节长度=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。
具体的一个MD5实现:
1package com.meng;
2
3
4import java.security.MessageDigest;
5
6/** *//**
7* <p>
8* Title:
9* </p>
10* <p>
11* Description:
12* </p>
13* <p>
14* Copyright: Copyright (c) 2003
15* </p>
16* <p>
17* Company:
18* </p>
19*
20* @author unascribed
21* @version 1.0
22*/
23
24public class MD5 {
25
26 private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5",
27 "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
28
29 /** *//**
30 * 转换字节数组为16进制字串
31 *
32 * @param b
33 * 字节数组
34 * @return 16进制字串
35 */
36
37 public static String byteArrayToHexString(byte[] b) {
38 StringBuffer resultSb = new StringBuffer();
39 for (int i = 0; i < b.length; i++) {
40 resultSb.append(byteToHexString(b[i]));
41 }
42 return resultSb.toString();
43 }
44
45 private static String byteToHexString(byte b) {
46 int n = b;
47 if (n < 0)
48 n = 256 + n;
49 int d1 = n / 16;
50 int d2 = n % 16;
51 return hexDigits[d1] + hexDigits[d2];
52 }
53
54 public static String MD5Encode(String origin) {
55 String resultString = null;
56
57 try {
58 resultString = new String(origin);
59 MessageDigest md = MessageDigest.getInstance("MD5");
60 resultString = byteArrayToHexString(md.digest(resultString
61 .getBytes()));
62 } catch (Exception ex) {
63
64 }
65 return resultString;
66 }
67
68 public static void main(String[] args) {
69 System.err.println(MD5Encode("哈哈"));
70
71
72
73 }
74}
75
76