我写的MD5算法JAVA源码,与大家共享
/**
* 此处插入类型说明。
* 创建日期:(02.3.26 15:12:55)
* @author:Administrator
*/
class MD5 {
private final static int ChainingVariable[]={0x67452301,0xefcdab89,0x98badcfe,0x10325476};
/**
* MD5 构造子注解。
*/
public MD5() {
super();
}
/**
* 此处插入方法说明。
* 创建日期:(02.3.26 15:39:19)
* @return String
* @param Data byte[]
*/
private static String bytes2HexString(byte[] Data) {
StringBuffer sb=new StringBuffer("");
char[] id={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
byte d=0;
for(int i=0;i<Data.length;i++){
d=Data[i];
sb.append(id[(d &0x0f0)>>>4]).append(id[d&0x0f]);
}
return sb.toString();
}
/**
* 此处插入方法说明。
* 创建日期:(02.3.26 15:39:19)
* @param Digest int[]
* @param Data int[]
*/
private static void calculate(int[] Digest, int[] Data) {
round1(Digest,Data);
round2(Digest,Data);
round3(Digest,Data);
round4(Digest,Data);
}
/**
* 此处插入方法说明。
* 创建日期:(02.3.26 15:14:21)
* @return int
* @param output byte[]
* @param input int
* @param pos int
*/
private static void decode(byte[] output, int input,int pos) {
//把长整数long处理为字节
/*
long temp;
for(int i=0;i<4;i++){
temp=0xffL;
if (i>0){
temp=temp<<(i*8);
}
temp=input&temp;
if(i>0){
temp=temp>>>(i*8);
}
output[pos+i]=(byte)(temp);
}
*/
output[pos]=(byte)(input&0xff);
output[pos+1]=(byte)((input>> 8)&0xff);
output[pos+2]=(byte)((input>>16)&0xff);
output[pos+3]=(byte)((input>>24)&0xff);
}
/**
* 此处插入方法说明。
* 创建日期:(02.3.26 15:14:21)
* @return int
* @param input byte[]
* @param pos int
*/
private static int encode(byte[] input, int pos) {
//把字节处理为长整数long
int ret = 0;
ret =
(input[pos] & 0xff)
+ ((input[pos + 1] & 0xff) << 8)
+ ((input[pos + 2] & 0xff) << 16)
+ ((input[pos + 3] & 0xff) << 24);
return ret;
}
/**
* 此处插入方法说明。
* 创建日期:(02.3.26 15:14:21)
* @return int
* @param X int
* @param Y int
* @param Z int
*/
private static int F(int X, int Y,int Z) {
return (X&Y)|((~X)&Z);
}
/**
* 此处插入方法说明。
* 创建日期:(02.3.26 15:14:21)
* @return int
* @param a int
* @param b int
* @param c int
* @param d int
* @param Mj int
* @param s int
* @param ti int
*/
private static int FF(int a,int b,int c,int d,int Mj,int s,int ti) {
//a=b+((a+F(b,c,d)+Mj+ti)
//return b+((a+F(b,c,d)+Mj+ti)<<s);//a=FF(a,b,c,d,Mj,s,ti)<<s)
int temp=a+F(b,c,d)+Mj+ti;
temp=(temp<<s)|(temp>>>(32-s));
// temp=(temp<<s);
return b+temp;
}
/**
* 此处插入方法说明。
* 创建日期:(02.3.26 15:39:19)
* @return byte[]
* @param Data byte[]
*/
private static byte[] Fill(byte[] Data) {
int newlen, endblklen, pad;
byte[] ret;
endblklen = Data.length % 64;
if (endblklen < 56) {
pad = 64 - endblklen;
} else {
pad = (64 - endblklen) + 64;
}
newlen = Data.length + pad;
ret = new byte[newlen];
for(int i=0;i<Data.length;i++){
ret[i]=Data[i];
}
ret[Data.length]=(byte)0x80;
for (int i = Data.length+1; i < newlen-8; i++) {
ret[i]=0;
}
long datalenbits = Data.length * 8;
for (int i = 0; i < 8; i++) {
ret[newlen - 8 + i] = (byte) (datalenbits & 0xff);
datalenbits >>= 8;
}
return ret;
}
/**
* 此处插入方法说明。
* 创建日期:(02.3.26 15:14:21)
* @return int
* @param X int
* @param Y int
* @param Z int
*/
private static int G(int X, int Y,int Z) {
return (X&Z)|(Y&(~Z));
}
/**
* 此处插入方法说明。
* 创建日期:(02.3.26 15:14:21)
* @return int
* @param a int
* @param b int
* @param c int
* @param d int
* @param Mj int
* @param s int
* @param ti int
*/
private static int GG(int a,int b,int c,int d,int Mj,int s,int ti) {
//a=b+((a+G(b,c,d)+Mj+ti)<<s)
//return b+((a+G(b,c,d)+Mj+ti)<<s);//a=b+(a+(G(b,c,d)+Mj+ti)<<s)
int temp=a+G(b,c,d)+Mj+ti;
temp=(temp<<s)|(temp>>>(32-s));
// temp=(temp<<s);
return b+temp;
}
/**
* 此处插入方法说明。
* 创建日期:(02.3.26 15:14:21)
* @return int
* @param X int
* @param Y int
* @param Z int
*/
private static int H(int X, int Y,int Z) {
return X^Y^Z;
}
/**
* 此处插入方法说明。
* 创建日期:(02.3.26 15:14:21)
* @return int
* @param a int
* @param b int
* @param c int
* @param d int
* @param Mj int
* @param s int
* @param ti int
*/
private static int HH(int a,int b,int c,int d,int Mj,int s,int ti) {
//a=b+(a+(H(b,c,d)+Mj+ti)<<s)
//return b+((a+H(b,c,d)+Mj+ti)<<s);//a=b+(a+(H(b,c,d)+Mj+ti)<<s)
int temp=a+H(b,c,d)+Mj+ti;
temp=(temp<<s)|(temp>>>(32-s));
// temp=(temp<<s);
return b+temp;
}
/**
* 此处插入方法说明。
* 创建日期:(02.3.26 15:14:21)
* @return int
* @param X int
* @param Y int
* @param Z int
*/
private static int I(int X, int Y,int Z) {
return Y^(X|(~Z));
}
/**
* 此处插入方法说明。
* 创建日期:(02.3.26 15:14:21)
* @return int
* @param a int
* @param b int
* @param c int
* @param d int
* @param Mj int
* @param s int
* @param ti int
*/
private static int II(int a,int b,int c,int d,int Mj,int s,int ti) {
//a=b+(a+(I(b,c,d)+Mj+ti)<<s)
//return b+((a+I(b,c,d)+Mj+ti)<<s);//a=b+(a+(I(b,c,d)+Mj+ti)<<s)
int temp=a+I(b,c,d)+Mj+ti;
temp=(temp<<s)|(temp>>>(32-s));
// temp=(temp<<s);
return b+temp;
}
/**
* 此处插入方法说明。
* 创建日期:(02.3.26 16:57:16)
* @param args java.lang.String[]
*/
public static void main(String[] args) {
String test;
System.out.println("test -->");
if ((test=md5("")).equals("d41d8cd98f00b204e9800998ecf8427e")) {
System.out.println("test:");
}
if (md5("a").equals("0cc175b9c0f1b6a831c399e269772661")) {
System.out.println("test:a");
}
if (md5("abc").equals("900150983cd24fb0d6963f7d28e17f72")) {
System.out.println("test:abc");
}
if (md5("message digest").equals("f96b697d7cb7938d525a2f31aaf161d0")) {
System.out.println("test:message digest");
}
if (md5("abcdefghijklmnopqrstuvwxyz").equals("c3fcd3d76192e4007dfb496cca67e13b")) {
System.out.println("test:abcdefghijklmnopqrstuvwxyz");
}
if (md5("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789").equals("d174ab98d277d9f5a5611c2c9f419d9f")) {
System.out.println("test:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
}
if (md5("12345678901234567890123456789012345678901234567890123456789012345678901234567890")
.equals("57edf4a22be3c955ac49da2e2107b67a")) {
System.out.println("test:12345678901234567890123456789012345678901234567890123456789012345678901234567890");
}
}
/**
* 此处插入方法说明。
* 创建日期:(02.3.26 15:39:19)
* @return String
* @param Data byte[]
*/
private static String md5(byte[] Data) {
/*
byte db[]=Data.getBytes();
*/
byte db[];
db=Fill(Data);
int[] digest=new int[4],tempDigest=new int[4],dt=new int[16];
for(int i=0;i<4;i++){
digest[i]=ChainingVariable[i];
}
int cnt=db.length/64;
for(int i=0;i<cnt;i++){
for (int j=0;j<4;j++){
tempDigest[j]=digest[j];
}
for(int j=0;j<16;j++){
dt[j]=encode(db,i*64+j*4);
}
calculate(digest,dt);
for (int j=0;j<4;j++){
digest[j]+=tempDigest[j];
}
}
String Rets="";
///*
byte[] retb=new byte[16];
for(int i=0,j=0;i<16;i+=4,j++ ){
decode(retb,digest[j],i);
}
Rets=bytes2HexString(retb);
//*/
//Rets=Rets+(tohex(digest[0]) + tohex(digest[1]) + tohex(digest[2]) + tohex(digest[3]));
return Rets;
;
}
/**
* 此处插入方法说明。
* 创建日期:(02.3.26 15:39:19)
* @return String
* @param Data String
*/
private static String md5(String Data) {
/*
byte db[]=Data.getBytes();
*/
byte db[]=new byte[Data.length()];
for(int i=0; i < Data.length(); i++) {
db[i] = (byte) (Data.charAt(i) & 0xff);
}
return md5(db);
;
}