Public Class MD5
{
/ *
* A Java Implementation of The RSA Data Security, Inc. MD5 Message
* Digest Algorithm, As Defined IN RFC 1321.
* Based on the JavaScript IMPLEMENTATION OF Paul Johnston
* CopyRight (c) Paul Johnston 1999 - 2000.
* See http://pajhome.org.uk/site/legal.html for details.
* Java Version by Thomas Weber (Orange Interactive GmbH)
* /
/ *
* Convert A 32-bit Number to a hex string with ls-byte first
* /
String HEX_CHR = "0123456789AbcDef";
Private string rhex (int Num)
{
String str = "";
For (int J = 0; j <= 3; j )
Str = STR HEX_CHR.CHARAT ((NUM >> (j * 8 4)) & 0x0f) HEX_CHR.CHARAT ((Num >> (j * 8)) & 0x0f);
Return Str;
}
/ *
* Convert a string to a sequence of 16-word blocks, Stored As an Array.
* Append Padding Bits and The Length, As Described in The MD5 Standard.
* /
Private int [] str2blks_md5 (String STR)
{
INT NBLK = (Str.length () 8) >> 6) 1;
int [] BLKS = New Int [NBLK * 16];
INT i = 0;
For (i = 0; i
BLKS [I] = 0;
}
For (i = 0; i
BLKS [I >> 2] | = Str.Charat (i) << ((i% 4) * 8);
}
BLKS [I >> 2] | = 0x80 << ((i% 4) * 8);
BLKS [NBLK * 16 - 2] = Str.Length () * 8;
Return BLKS;
}
/ *
* Add integers, Wraping AT 2 ^ 32
* /
Private Int Add (int X, int y)
{
RETURN ((x & 0x7fffffff) (Y & 0x7FFFFFF)) ^ (x & 0x80000000) ^ (Y & 0x80000000);
}
/ *
* Bitwise Rotate a 32-bit number to the left
* /
Private int ROL (Int Num, int CNT)
{
Return (NUM << CNT) | (NUM >>> (32 - CNT));
}
/ *
.
* /
Private int CMN (int Q, Int A, int B, INT X, INT S, INT T)
{
RETURN ADD (ADD (Add (ADD (AD (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 md5.
* /
Public String Calcmd5 (String STR)
{
INT [] x = str2blks_md5 (str);
INT A = 0x67452301;
INT B = 0xEfcdab89;
INT C = 0x98badcfe;
INT D = 0x10325476;
For (int i = 0; i
{
INT OLDA = a;
INT OLDB = B;
INT OLDC = C;
INT OLDD = D;
A = ff (A, B, C, D, X [i 0], 7, 0xD76AA478);
D = ff (d, a, b, c, x [i 1], 12, 0xe8c7b756);
C = ff (C, D, A, B, X [i 2], 17, 0x242070dB);
B = ff (B, C, D, A, X [i 3], 22, 0xC1BDCEEE);
A = ff (A, B, C, D, X [i 4], 7, 0xF57c0FAF);
D = ff (D, A, B, C, X [i 5], 12, 0x4787C62A);
C = ff (C, D, A, B, X [i 6], 17, 0xA8304613);
B = ff (B, C, D, A, X [i 7], 22, 0xFD469501);
A = ff (A, B, C, D, X [i 8], 7, 0x698098d8);
D = ff (D, A, B, C, X [i 9], 12, 0x8B44F7AF);
C = ff (C, D, A, B, X [i 10], 17, 0xFFFFFF5BB1);
B = ff (B, C, D, A, X [i 11], 22, 0x895cd7be);
A = ff (A, B, C, D, X [i 12], 7, 0x6b901122); D = FF (D, A, B, C, X [i 13], 12, 0xFD987193);
C = ff (C, D, A, B, X [i 14], 17, 0xA679438E);
B = ff (B, C, D, A, X [i 15], 22, 0x49b40821);
A = GG (A, B, C, D, X [i 1], 5, 0xF61e2562);
D = GG (D, A, B, C, X [i 6], 9, 0xc040b340);
C = GG (C, D, A, B, X [i 11], 14, 0x265E5A51);
B = GG (B, C, D, A, X [i 0], 20, 0xE9B6C7AA);
A = gg (A, B, C, D, X [i 5], 5, 0xD62F105D);
D = GG (D, A, B, C, X [i 10], 9, 0x02441453);
C = GG (C, D, A, B, X [i 15], 14, 0xD8A1E681);
B = GG (B, C, D, A, X [i 4], 20, 0xE7D3FBC8);
A = GG (A, B, C, D, X [i 9], 5, 0x21e1cde6);
D = GG (D, A, B, C, X [i 14], 9, 0xc33707d6);
C = GG (C, D, A, B, X [i 3], 14, 0xF4D50D87);
B = GG (B, C, D, A, X [i 8], 20, 0x455A14ED);
A = GG (A, B, C, D, X [i 13], 5, 0xA9E3E905);
D = GG (D, A, B, C, X [i 2], 9, 0xFCEFA3F8);
C = GG (C, D, A, B, X [i 7], 14, 0x676F02D9);
B = GG (B, C, D, A, X [i 12], 20, 0x8D2A4C8A);
A = HH (A, B, C, D, X [i 5], 4, 0xFFFFA3942);
D = HH (D, A, B, C, X [i 8], 11, 0x8771F681);
C = HH (C, D, A, B, X [i 11], 16, 0x6d9d6122);
B = HH (B, C, D, A, X [i 14], 23, 0xFDE5380C);
A = HH (A, B, C, D, X [i 1], 4, 0xA4Beea44);
D = HH (D, A, B, C, X [i 4], 11, 0x4 bdecfa9);
C = HH (C, D, A, B, X [i 7], 16, 0xF6bb4b60);
B = HH (B, C, D, A, X [i 10], 23, 0xBebfbc70);
A = HH (A, B, C, D, X [i 13], 4, 0x289B7EC6);
D = HH (D, A, B, C, X [i 0], 11, 0xEAA127FA);
C = HH (C, D, A, B, X [i 3], 16, 0xD4ef3085);
B = HH (B, C, D, A, X [i 6], 23, 0x04881D05);
A = HH (A, B, C, D, X [i 9], 4, 0xD9D4D039); D = HH (D, A, B, C, X [i 12], 11, 0xE6DB99E5);
C = HH (C, D, A, B, X [i 15], 16, 0x1fa27cf8);
B = HH (B, C, D, A, X [i 2], 23, 0xC4AC5665);
A = II (A, B, C, D, X [i 0], 6, 0xF4292244);
D = II (D, A, B, C, X [i 7], 10, 0x432AFF97);
C = II (C, D, A, B, X [i 14], 15, 0xAb9423A7);
B = II (B, C, D, A, X [i 5], 21, 0xFC93A039);
A = II (A, B, C, D, X [i 12], 6, 0x6555B59C3);
D = II (D, A, B, C, X [i 3], 10, 0x8F0ccc92);
C = II (C, D, A, B, X [i 10], 15, 0xffeff47d);
B = II (B, C, D, A, X [i 1], 21, 0x85845DD1);
A = II (A, B, C, D, X [i 8], 6, 0x6fa87e4f);
D = II (D, A, B, C, X [i 15], 10, 0xFE2CE6E0);
C = II (C, D, A, B, X [i 6], 15, 0xA3014314);
B = II (B, C, D, A, X [i 13], 21, 0x4e0811a1);
A = II (A, B, C, D, X [i 4], 6, 0xF7537E82);
D = II (D, A, B, C, X [i 11], 10, 0xBD3AF235);
C = II (C, D, A, B, X [i 2], 15, 0x2AD7D2BB);
B = II (B, C, D, A, X [i 9], 21, 0xeb86d391);
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);
}
}
The above is just the specific implementation of the algorithm. When we truly trial, we often use the JDK to bring the algorithm:
Package myreuse.common.util;
Import sun.misc.base64encoder; import java.security.MPort Java.Security.NOSUCHALGORITHMEXCEPTION;
public abstract class MessageDigester {static MessageDigest SHA1; static MessageDigest MD5; static {try {SHA1 = MessageDigest.getInstance ( "SHA1"); MD5 = MessageDigest.getInstance ( "MD5");} catch (NoSuchAlgorithmException e) {e.printStackTrace ( }
} Public static Byte [] Sha1 (String MSG) {Return Sha1.digest (msg.getbytes ());} public static Byte [] MD5 (String MSG) {Return Md5.digest (msg.getbytes ());}
Private static base64encoder base64encoder = new base64encoder ();
Public static string hex (byte [] b) {stringbuffer result = new stringbuffer (b.Length); for (int i = 0; i
Public static string base64 (byte [] b) {string result = base64encoder.Encode (b); int i = result.indexof ('='); if (i> -1) Result = result.substring (0, i) Return Result;}
Public Static String Base64SHA1 (String MSG) {Return Base64 (SHA1 (MSG));}
Public Static String Base64MD5 (String MSG) {RETURN BASE64 (MD5 (MSG));}
Public Static String HexSha1 (STRING MSG) {Return HEX (SHA1 (MSG));
Public Static String Hexmd5 (String MSG) {Return HEX (MD5 (MSG));
}
Note if (i> -1) Result = result.substring (0, i); this sentence, JDK algorithm is when making Base64 encoding
Several one after the automatic complement, and there is a difference with our base64 implementation, so I cut out several pieces of it.