public class MD
{
/*
* A Java implementation of the RSA Data Security Inc MD Message
* Digest Algorithm as defined in RFC
* Based on the JavaScript implementation of Paul Johnston
* Copyright (C) Paul Johnston
* See for details
* Java Version by Thomas Weber (Orange Interactive GmbH)
*/
/*
* Convert a bit number to a hex string with lsbyte first
*/
String hex_chr = abcdef;
private String rhex(int num)
{
String str = ;
for(int j = ; j <= 3; j++)
str = str + hex_chr.charAt((num >> (j * + )) & xF) + hex_chrcharAt((num >> (j * )) & xF);
return str;
}
/*
* Convert a string to a sequence of word blocks stored as an array
* Append padding bits and the length as described in the MD standard
*/
private int[] strblks_MD(String str)
{
int nblk = ((strlength() + ) >> ) + ;
int[] blks = new int[nblk * ];
int i = ;
for(i = ; i < nblk * ; i++) {
blks[i] = ;
}
for(i = ; i < strlength(); i++) {
blks[i >> ] |= strcharAt(i) << ((i % ) * );
}
blks[i >> ] |= x << ((i % ) * );
blks[nblk * ] = strlength()*;
return blks;
}
/*
* Add integers wrapping at ^
*/
private int add(int x int y)
{
return ((x&xFFFFFFF) + (y&xFFFFFFF)) ^ (x&x) ^ (y&x);
}
/*
* Bitwise rotate a bit number to the left
*/
private int rol(int num int cnt)
{
return (num << cnt) | (num >>> ( cnt));
}
/*
* These functions implement the basic operation for each round of the
* algorithm
*/
private int cmn(int q int a int b int x int s int t)
{
return add(rol(add(add(a q) add(x t)) s) b);
}
private int ff(int a int b int c int d int x int s int t)
{
return cmn((b & c) | ((~b) & d) a b x s t);
}
private int gg(int a int b int c int d int x int s int t)
{
return cmn((b & d) | (c & (~d)) a b x s t);
}
private int hh(int a int b int c int d int x int s int t)
{
return cmn(b ^ c ^ d a b x s t);
}
private int ii(int a int b int c int d int x int s int t)
{
return cmn(c ^ (b | (~d)) a b x s t);
}
/*
* Take a string and return the hex representation of its MD
*/
public String calcMD(String str)
{
int[] x = strblks_MD(str);
int a = x;
int b = xEFCDAB;
int c = xBADCFE;
int d = x;
for(int i = ; i < xlength; i += )
{
int olda = a;
int oldb = b;
int oldc = c;
int oldd = d;
a = ff(a b c d x[i+ ] xDAA);
d = ff(d a b c x[i+ ] xECB);
c = ff(c d a b x[i+ ] xDB);
b = ff(b c d a x[i+ ] xCBDCEEE);
a = ff(a b c d x[i+ ] xFCFAF);
d = ff(d a b c x[i+ ] xCA);
c = ff(c d a b x[i+ ] xA);
b = ff(b c d a x[i+ ] xFD);
a = ff(a b c d x[i+ ] xD);
d = ff(d a b c x[i+ ] xBFAF);
c = ff(c d a b x[i+] xFFFFBB);
b = ff(b c d a x[i+] xCDBE);
a = ff(a b c d x[i+] xB);
d = ff(d a b c x[i+] xFD);
c = ff(c d a b x[i+] xAE);
b = ff(b c d a x[i+] xB);
a = gg(a b c d x[i+ ] xFE);
d = gg(d a b c x[i+ ] xCB);
c = gg(c d a b x[i+] xEA);
b = gg(b c d a x[i+ ] xEBCAA);
a = gg(a b c d x[i+ ] xDFD);
d = gg(d a b c x[i+] x);
c = gg(c d a b x[i+] xDAE);
b = gg(b c d a x[i+ ] xEDFBC);
a = gg(a b c d x[i+ ] xECDE);
d = gg(d a b c x[i+] xCD);
c = gg(c d a b x[i+ ] xFDD);
b = gg(b c d a x[i+ ] xAED);
a = gg(a b c d x[i+] xAEE);
d = gg(d a b c x[i+ ] xFCEFAF);
c = gg(c d a b x[i+ ] xFD);
b = gg(b c d a x[i+] xDACA);
a = hh(a b c d x[i+ ] xFFFA);
d = hh(d a b c x[i+ ] xF);
c = hh(c d a b x[i+] xDD);
b = hh(b c d a x[i+] xFDEC);
a = hh(a b c d x[i+ ] xABEEA);
d = hh(d a b c x[i+ ] xBDECFA);
c = hh(c d a b x[i+ ] xFBBB);
b = hh(b c d a x[i+] xBEBFBC);
a = hh(a b c d x[i+] xBEC);
d = hh(d a b c x[i+ ] xEAAFA);
c = hh(c d a b x[i+ ] xDEF);
b = hh(b c d a x[i+ ] xD);
a = hh(a b c d x[i+ ] xDDD);
d = hh(d a b c x[i+] xEDBE);
c = hh(c d a b x[i+] xFACF);
b = hh(b c d a x[i+ ] xCAC);
a = ii(a b c d x[i+ ] xF);
d = ii(d a b c x[i+ ] xAFF);
c = ii(c d a b x[i+] xABA);
b = ii(b c d a x[i+ ] xFCA);
a = ii(a b c d x[i+] xBC);
d = ii(d a b c x[i+ ] xFCCC);
c = ii(c d a b x[i+] xFFEFFD);
b = ii(b c d a x[i+ ] xDD);
a = ii(a b c d x[i+ ] xFAEF);
d = ii(d a b c x[i+] xFECEE);
c = ii(c d a b x[i+ ] xA);
b = ii(b c d a x[i+] xEA);
a = ii(a b c d x[i+ ] xFE);
d = ii(d a b c x[i+] xBDAF);
c = ii(c d a b x[i+ ] xADDBB);
b = ii(b c d a x[i+ ] xEBD);
a = add(a olda);
b = add(b oldb);
c = add(c oldc);
d = add(d oldd);
}
return rhex(a) + rhex(b) + rhex(c) + rhex(d);
}
}
另: 一中国人写的md 的javabean:
/************************************************
MD 算法的Java Bean
@author:Topcat Tuppin
Last Modified:Mar
*************************************************/
//package beartool;
import javalangreflect*;
/*************************************************
md 类实现了RSA Data Security Inc在提交给IETF
的RFC中的MD messagedigest 算法
*************************************************/
public class MD {
/* 下面这些SS实际上是一个*的矩阵在原始的C实现中是用#define 实现的
这里把它们实现成为static final是表示了只读切能在同一个进程空间内的多个
Instance间共享*/
static final int S = ;
static final int S = ;
static final int S = ;
static final int S = ;
static final int S = ;
static final int S = ;
static final int S = ;
static final int S = ;
static final int S = ;
static final int S = ;
static final int S