Posted on 2006-04-02 15:54
ikingqu 閱讀(244)
評論(0) 編輯 收藏 所屬分類:
JavaSE&JavaEE
?
/**?*/
/**
**********************************************
?MD5?算法的Java?Bean
?
@author
:Topcat?Tuppin
?Last?Modified:10,Mar,2001
?************************************************
*/
package
?org.waityou.news.util;

import
?java.lang.reflect.
*
;


/**?*/
/**
*****************************************************************************
?*?md5?類實現了RSA?Data?Security,?Inc.在提交給IETF?的RFC1321中的MD5?message-digest?算法。
?*****************************************************************************
*/
public
?
class
?MD5?
{

????
/**/
/*
?????*?下面這些S11-S44實際上是一個4*4的矩陣,在原始的C實現中是用#define?實現的,?這里把它們實現成為static
?????*?final是表示了只讀,切能在同一個進程空間內的多個?Instance間共享
?????
*/
????
static
?
final
?
int
?S11?
=
?
7
;

????
static
?
final
?
int
?S12?
=
?
12
;

????
static
?
final
?
int
?S13?
=
?
17
;

????
static
?
final
?
int
?S14?
=
?
22
;

????
static
?
final
?
int
?S21?
=
?
5
;

????
static
?
final
?
int
?S22?
=
?
9
;

????
static
?
final
?
int
?S23?
=
?
14
;

????
static
?
final
?
int
?S24?
=
?
20
;

????
static
?
final
?
int
?S31?
=
?
4
;

????
static
?
final
?
int
?S32?
=
?
11
;

????
static
?
final
?
int
?S33?
=
?
16
;

????
static
?
final
?
int
?S34?
=
?
23
;

????
static
?
final
?
int
?S41?
=
?
6
;

????
static
?
final
?
int
?S42?
=
?
10
;

????
static
?
final
?
int
?S43?
=
?
15
;

????
static
?
final
?
int
?S44?
=
?
21
;


????
static
?
final
?
byte
[]?PADDING?
=
?
{?
-
128
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,
????????????
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,
????????????
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
,
????????????
0
,?
0
,?
0
,?
0
,?
0
,?
0
,?
0
?}
;


????
/**/
/*
?????*?下面的三個成員是MD5計算過程中用到的3個核心數據,在原始的C實現中?被定義到MD5_CTX結構中
?????*??
?????
*/
????
private
?
long
[]?state?
=
?
new
?
long
[
4
];?
//
?state?(ABCD)
????
private
?
long
[]?count?
=
?
new
?
long
[
2
];?
//
?number?of?bits,?modulo?2^64?(lsb

????
//
?first)
????
private
?
byte
[]?buffer?
=
?
new
?
byte
[
64
];?
//
?input?buffer
????
/**/
/*
?????*?digestHexStr是MD5的唯一一個公共成員,是最新一次計算結果的?16進制ASCII表示.
?????
*/
????
public
?String?digestHexStr;


????
/**/
/*
?????*?digest,是最新一次計算結果的2進制內部表示,表示128bit的MD5值.
?????
*/
????
private
?
byte
[]?digest?
=
?
new
?
byte
[
16
];


????
/**/
/*
?????*?getMD5ofStr是類MD5最主要的公共方法,入口參數是你想要進行MD5變換的字符串
?????*?返回的是變換完的結果,這個結果是從公共成員digestHexStr取得的.
?????
*/
????
public
?String?getMD5ofStr(String?inbuf)?
{
????????md5Init();
????????md5Update(inbuf.getBytes(),?inbuf.length());
????????md5Final();
????????digestHexStr?
=
?
""
;

????????
for
?(
int
?i?
=
?
0
;?i?
<
?
16
;?i
++
)?
{
????????????digestHexStr?
+=
?byteHEX(digest[i]);
????????}
????????
return
?digestHexStr;

????}
????
//
?這是MD5這個類的標準構造函數,JavaBean要求有一個public的并且沒有參數的構造函數
????
public
?MD5()?
{
????????md5Init();

????????
return
;
????}
????
/**/
/*
?md5Init是一個初始化函數,初始化核心變量,裝入標準的幻數?
*/
????
private
?
void
?md5Init()?
{
????????count[
0
]?
=
?
0L
;
????????count[
1
]?
=
?
0L
;
????????
//
/*?Load?magic?initialization?constants.
????????state[
0
]?
=
?
0x67452301L
;
????????state[
1
]?
=
?
0xefcdab89L
;
????????state[
2
]?
=
?
0x98badcfeL
;
????????state[
3
]?
=
?
0x10325476L
;

????????
return
;
????}
????
/**/
/*
?????*?F,?G,?H?,I?是4個基本的MD5函數,在原始的MD5的C實現中,由于它們是
?????*?簡單的位運算,可能出于效率的考慮把它們實現成了宏,在java中,我們把它們?實現成了private方法,名字保持了原來C中的。
?????
*/
????
private
?
long
?F(
long
?x,?
long
?y,?
long
?z)?
{
????????
return
?(x?
&
?y)?
|
?((
~
x)?
&
?z);

????}
????
private
?
long
?G(
long
?x,?
long
?y,?
long
?z)?
{
????????
return
?(x?
&
?z)?
|
?(y?
&
?(
~
z));

????}
????
private
?
long
?H(
long
?x,?
long
?y,?
long
?z)?
{
????????
return
?x?
^
?y?
^
?z;
????}
????
private
?
long
?I(
long
?x,?
long
?y,?
long
?z)?
{
????????
return
?y?
^
?(x?
|
?(
~
z));
????}
????
/**/
/*
?????*?FF,GG,HH和II將調用F,G,H,I進行近一步變換?FF,?GG,?HH,?and?II?transformations?for
?????*?rounds?1,?2,?3,?and?4.?Rotation?is?separate?from?addition?to?prevent
?????*?recomputation.
?????
*/
????
private
?
long
?FF(
long
?a,?
long
?b,?
long
?c,?
long
?d,?
long
?x,?
long
?s,?
long
?ac)?
{
????????a?
+=
?F(b,?c,?d)?
+
?x?
+
?ac;
????????a?
=
?((
int
)?a?
<<
?s)?
|
?((
int
)?a?
>>>
?(
32
?
-
?s));
????????a?
+=
?b;
????????
return
?a;
????}
????
private
?
long
?GG(
long
?a,?
long
?b,?
long
?c,?
long
?d,?
long
?x,?
long
?s,?
long
?ac)?
{
????????a?
+=
?G(b,?c,?d)?
+
?x?
+
?ac;
????????a?
=
?((
int
)?a?
<<
?s)?
|
?((
int
)?a?
>>>
?(
32
?
-
?s));
????????a?
+=
?b;
????????
return
?a;
????}
????
private
?
long
?HH(
long
?a,?
long
?b,?
long
?c,?
long
?d,?
long
?x,?
long
?s,?
long
?ac)?
{
????????a?
+=
?H(b,?c,?d)?
+
?x?
+
?ac;
????????a?
=
?((
int
)?a?
<<
?s)?
|
?((
int
)?a?
>>>
?(
32
?
-
?s));
????????a?
+=
?b;
????????
return
?a;
????}
????
private
?
long
?II(
long
?a,?
long
?b,?
long
?c,?
long
?d,?
long
?x,?
long
?s,?
long
?ac)?
{
????????a?
+=
?I(b,?c,?d)?
+
?x?
+
?ac;
????????a?
=
?((
int
)?a?
<<
?s)?
|
?((
int
)?a?
>>>
?(
32
?
-
?s));
????????a?
+=
?b;
????????
return
?a;
????}
????
/**/
/*
?????*?md5Update是MD5的主計算過程,inbuf是要變換的字節串,inputlen是長度,這個
?????*?函數由getMD5ofStr調用,調用之前需要調用md5init,因此把它設計成private的
?????
*/
????
private
?
void
?md5Update(
byte
[]?inbuf,?
int
?inputLen)?
{

????????
int
?i,?index,?partLen;
????????
byte
[]?block?
=
?
new
?
byte
[
64
];
????????index?
=
?(
int
)?(count[
0
]?
>>>
?
3
)?
&
?
0x3F
;
????????
//
?/*?Update?number?of?bits?*/
????????
if
?((count[
0
]?
+=
?(inputLen?
<<
?
3
))?
<
?(inputLen?
<<
?
3
))
????????????count[
1
]
++
;
????????count[
1
]?
+=
?(inputLen?
>>>
?
29
);

????????partLen?
=
?
64
?
-
?index;

????????
//
?Transform?as?many?times?as?possible.
????????
if
?(inputLen?
>=
?partLen)?
{
????????????md5Memcpy(buffer,?inbuf,?index,?
0
,?partLen);
????????????md5Transform(buffer);


????????????
for
?(i?
=
?partLen;?i?
+
?
63
?
<
?inputLen;?i?
+=
?
64
)?
{

????????????????md5Memcpy(block,?inbuf,?
0
,?i,?
64
);
????????????????md5Transform(block);
????????????}
????????????index?
=
?
0
;

????????}
?
else
????????????i?
=
?
0
;

????????
//
/*?Buffer?remaining?input?*/
????????md5Memcpy(buffer,?inbuf,?index,?i,?inputLen?
-
?i);

????}
????
/**/
/*
?????*?md5Final整理和填寫輸出結果
?????
*/
????
private
?
void
?md5Final()?
{
????????
byte
[]?bits?
=
?
new
?
byte
[
8
];
????????
int
?index,?padLen;

????????
//
/*?Save?number?of?bits?*/
????????Encode(bits,?count,?
8
);

????????
//
/*?Pad?out?to?56?mod?64.
????????index?
=
?(
int
)?(count[
0
]?
>>>
?
3
)?
&
?
0x3f
;
????????padLen?
=
?(index?
<
?
56
)?
?
?(
56
?
-
?index)?:?(
120
?
-
?index);
????????md5Update(PADDING,?padLen);

????????
//
/*?Append?length?(before?padding)?*/
????????md5Update(bits,?
8
);

????????
//
/*?Store?state?in?digest?*/
????????Encode(digest,?state,?
16
);

????}
????
/**/
/*
?????*?md5Memcpy是一個內部使用的byte數組的塊拷貝函數,從input的inpos開始把len長度的
?????*?字節拷貝到output的outpos位置開始
?????
*/
????
private
?
void
?md5Memcpy(
byte
[]?output,?
byte
[]?input,?
int
?outpos,?
int
?inpos,

????????????
int
?len)?
{
????????
int
?i;

????????
for
?(i?
=
?
0
;?i?
<
?len;?i
++
)
????????????output[outpos?
+
?i]?
=
?input[inpos?
+
?i];
????}
????
/**/
/*
?????*?md5Transform是MD5核心變換程序,有md5Update調用,block是分塊的原始字節
?????
*/
????
private
?
void
?md5Transform(
byte
?block[])?
{
????????
long
?a?
=
?state[
0
],?b?
=
?state[
1
],?c?
=
?state[
2
],?d?
=
?state[
3
];
????????
long
[]?x?
=
?
new
?
long
[
16
];

????????Decode(x,?block,?
64
);


????????
/**/
/*
?Round?1?
*/
????????a?
=
?FF(a,?b,?c,?d,?x[
0
],?S11,?
0xd76aa478L
);?
/**/
/*
?1?
*/
????????d?
=
?FF(d,?a,?b,?c,?x[
1
],?S12,?
0xe8c7b756L
);?
/**/
/*
?2?
*/
????????c?
=
?FF(c,?d,?a,?b,?x[
2
],?S13,?
0x242070dbL
);?
/**/
/*
?3?
*/
????????b?
=
?FF(b,?c,?d,?a,?x[
3
],?S14,?
0xc1bdceeeL
);?
/**/
/*
?4?
*/
????????a?
=
?FF(a,?b,?c,?d,?x[
4
],?S11,?
0xf57c0fafL
);?
/**/
/*
?5?
*/
????????d?
=
?FF(d,?a,?b,?c,?x[
5
],?S12,?
0x4787c62aL
);?
/**/
/*
?6?
*/
????????c?
=
?FF(c,?d,?a,?b,?x[
6
],?S13,?
0xa8304613L
);?
/**/
/*
?7?
*/
????????b?
=
?FF(b,?c,?d,?a,?x[
7
],?S14,?
0xfd469501L
);?
/**/
/*
?8?
*/
????????a?
=
?FF(a,?b,?c,?d,?x[
8
],?S11,?
0x698098d8L
);?
/**/
/*
?9?
*/
????????d?
=
?FF(d,?a,?b,?c,?x[
9
],?S12,?
0x8b44f7afL
);?
/**/
/*
?10?
*/
????????c?
=
?FF(c,?d,?a,?b,?x[
10
],?S13,?
0xffff5bb1L
);?
/**/
/*
?11?
*/
????????b?
=
?FF(b,?c,?d,?a,?x[
11
],?S14,?
0x895cd7beL
);?
/**/
/*
?12?
*/
????????a?
=
?FF(a,?b,?c,?d,?x[
12
],?S11,?
0x6b901122L
);?
/**/
/*
?13?
*/
????????d?
=
?FF(d,?a,?b,?c,?x[
13
],?S12,?
0xfd987193L
);?
/**/
/*
?14?
*/
????????c?
=
?FF(c,?d,?a,?b,?x[
14
],?S13,?
0xa679438eL
);?
/**/
/*
?15?
*/
????????b?
=
?FF(b,?c,?d,?a,?x[
15
],?S14,?
0x49b40821L
);?
/**/
/*
?16?
*/
????????
/**/
/*
?Round?2?
*/
????????a?
=
?GG(a,?b,?c,?d,?x[
1
],?S21,?
0xf61e2562L
);?
/**/
/*
?17?
*/
????????d?
=
?GG(d,?a,?b,?c,?x[
6
],?S22,?
0xc040b340L
);?
/**/
/*
?18?
*/
????????c?
=
?GG(c,?d,?a,?b,?x[
11
],?S23,?
0x265e5a51L
);?
/**/
/*
?19?
*/
????????b?
=
?GG(b,?c,?d,?a,?x[
0
],?S24,?
0xe9b6c7aaL
);?
/**/
/*
?20?
*/
????????a?
=
?GG(a,?b,?c,?d,?x[
5
],?S21,?
0xd62f105dL
);?
/**/
/*
?21?
*/
????????d?
=
?GG(d,?a,?b,?c,?x[
10
],?S22,?
0x2441453L
);?
/**/
/*
?22?
*/
????????c?
=
?GG(c,?d,?a,?b,?x[
15
],?S23,?
0xd8a1e681L
);?
/**/
/*
?23?
*/
????????b?
=
?GG(b,?c,?d,?a,?x[
4
],?S24,?
0xe7d3fbc8L
);?
/**/
/*
?24?
*/
????????a?
=
?GG(a,?b,?c,?d,?x[
9
],?S21,?
0x21e1cde6L
);?
/**/
/*
?25?
*/
????????d?
=
?GG(d,?a,?b,?c,?x[
14
],?S22,?
0xc33707d6L
);?
/**/
/*
?26?
*/
????????c?
=
?GG(c,?d,?a,?b,?x[
3
],?S23,?
0xf4d50d87L
);?
/**/
/*
?27?
*/
????????b?
=
?GG(b,?c,?d,?a,?x[
8
],?S24,?
0x455a14edL
);?
/**/
/*
?28?
*/
????????a?
=
?GG(a,?b,?c,?d,?x[
13
],?S21,?
0xa9e3e905L
);?
/**/
/*
?29?
*/
????????d?
=
?GG(d,?a,?b,?c,?x[
2
],?S22,?
0xfcefa3f8L
);?
/**/
/*
?30?
*/
????????c?
=
?GG(c,?d,?a,?b,?x[
7
],?S23,?
0x676f02d9L
);?
/**/
/*
?31?
*/
????????b?
=
?GG(b,?c,?d,?a,?x[
12
],?S24,?
0x8d2a4c8aL
);?
/**/
/*
?32?
*/
????????
/**/
/*
?Round?3?
*/
????????a?
=
?HH(a,?b,?c,?d,?x[
5
],?S31,?
0xfffa3942L
);?
/**/
/*
?33?
*/
????????d?
=
?HH(d,?a,?b,?c,?x[
8
],?S32,?
0x8771f681L
);?
/**/
/*
?34?
*/
????????c?
=
?HH(c,?d,?a,?b,?x[
11
],?S33,?
0x6d9d6122L
);?
/**/
/*
?35?
*/
????????b?
=
?HH(b,?c,?d,?a,?x[
14
],?S34,?
0xfde5380cL
);?
/**/
/*
?36?
*/
????????a?
=
?HH(a,?b,?c,?d,?x[
1
],?S31,?
0xa4beea44L
);?
/**/
/*
?37?
*/
????????d?
=
?HH(d,?a,?b,?c,?x[
4
],?S32,?
0x4bdecfa9L
);?
/**/
/*
?38?
*/
????????c?
=
?HH(c,?d,?a,?b,?x[
7
],?S33,?
0xf6bb4b60L
);?
/**/
/*
?39?
*/
????????b?
=
?HH(b,?c,?d,?a,?x[
10
],?S34,?
0xbebfbc70L
);?
/**/
/*
?40?
*/
????????a?
=
?HH(a,?b,?c,?d,?x[
13
],?S31,?
0x289b7ec6L
);?
/**/
/*
?41?
*/
????????d?
=
?HH(d,?a,?b,?c,?x[
0
],?S32,?
0xeaa127faL
);?
/**/
/*
?42?
*/
????????c?
=
?HH(c,?d,?a,?b,?x[
3
],?S33,?
0xd4ef3085L
);?
/**/
/*
?43?
*/
????????b?
=
?HH(b,?c,?d,?a,?x[
6
],?S34,?
0x4881d05L
);?
/**/
/*
?44?
*/
????????a?
=
?HH(a,?b,?c,?d,?x[
9
],?S31,?
0xd9d4d039L
);?
/**/
/*
?45?
*/
????????d?
=
?HH(d,?a,?b,?c,?x[
12
],?S32,?
0xe6db99e5L
);?
/**/
/*
?46?
*/
????????c?
=
?HH(c,?d,?a,?b,?x[
15
],?S33,?
0x1fa27cf8L
);?
/**/
/*
?47?
*/
????????b?
=
?HH(b,?c,?d,?a,?x[
2
],?S34,?
0xc4ac5665L
);?
/**/
/*
?48?
*/
????????
/**/
/*
?Round?4?
*/
????????a?
=
?II(a,?b,?c,?d,?x[
0
],?S41,?
0xf4292244L
);?
/**/
/*
?49?
*/
????????d?
=
?II(d,?a,?b,?c,?x[
7
],?S42,?
0x432aff97L
);?
/**/
/*
?50?
*/
????????c?
=
?II(c,?d,?a,?b,?x[
14
],?S43,?
0xab9423a7L
);?
/**/
/*
?51?
*/
????????b?
=
?II(b,?c,?d,?a,?x[
5
],?S44,?
0xfc93a039L
);?
/**/
/*
?52?
*/
????????a?
=
?II(a,?b,?c,?d,?x[
12
],?S41,?
0x655b59c3L
);?
/**/
/*
?53?
*/
????????d?
=
?II(d,?a,?b,?c,?x[
3
],?S42,?
0x8f0ccc92L
);?
/**/
/*
?54?
*/
????????c?
=
?II(c,?d,?a,?b,?x[
10
],?S43,?
0xffeff47dL
);?
/**/
/*
?55?
*/
????????b?
=
?II(b,?c,?d,?a,?x[
1
],?S44,?
0x85845dd1L
);?
/**/
/*
?56?
*/
????????a?
=
?II(a,?b,?c,?d,?x[
8
],?S41,?
0x6fa87e4fL
);?
/**/
/*
?57?
*/
????????d?
=
?II(d,?a,?b,?c,?x[
15
],?S42,?
0xfe2ce6e0L
);?
/**/
/*
?58?
*/
????????c?
=
?II(c,?d,?a,?b,?x[
6
],?S43,?
0xa3014314L
);?
/**/
/*
?59?
*/
????????b?
=
?II(b,?c,?d,?a,?x[
13
],?S44,?
0x4e0811a1L
);?
/**/
/*
?60?
*/
????????a?
=
?II(a,?b,?c,?d,?x[
4
],?S41,?
0xf7537e82L
);?
/**/
/*
?61?
*/
????????d?
=
?II(d,?a,?b,?c,?x[
11
],?S42,?
0xbd3af235L
);?
/**/
/*
?62?
*/
????????c?
=
?II(c,?d,?a,?b,?x[
2
],?S43,?
0x2ad7d2bbL
);?
/**/
/*
?63?
*/
????????b?
=
?II(b,?c,?d,?a,?x[
9
],?S44,?
0xeb86d391L
);?
/**/
/*
?64?
*/
????????state[
0
]?
+=
?a;
????????state[
1
]?
+=
?b;
????????state[
2
]?
+=
?c;
????????state[
3
]?
+=
?d;

????}
????
/**/
/*
?????*?Encode把long數組按順序拆成byte數組,因為java的long類型是64bit的,?只拆低32bit,以適應原始C實現的用途
?????
*/
????
private
?
void
?Encode(
byte
[]?output,?
long
[]?input,?
int
?len)?
{
????????
int
?i,?j;


????????
for
?(i?
=
?
0
,?j?
=
?
0
;?j?
<
?len;?i
++
,?j?
+=
?
4
)?
{
????????????output[j]?
=
?(
byte
)?(input[i]?
&
?
0xffL
);
????????????output[j?
+
?
1
]?
=
?(
byte
)?((input[i]?
>>>
?
8
)?
&
?
0xffL
);
????????????output[j?
+
?
2
]?
=
?(
byte
)?((input[i]?
>>>
?
16
)?
&
?
0xffL
);
????????????output[j?
+
?
3
]?
=
?(
byte
)?((input[i]?
>>>
?
24
)?
&
?
0xffL
);
????????}
????}
????
/**/
/*
?????*?Decode把byte數組按順序合成成long數組,因為java的long類型是64bit的,
?????*?只合成低32bit,高32bit清零,以適應原始C實現的用途
?????
*/
????
private
?
void
?Decode(
long
[]?output,?
byte
[]?input,?
int
?len)?
{
????????
int
?i,?j;

????????
for
?(i?
=
?
0
,?j?
=
?
0
;?j?
<
?len;?i
++
,?j?
+=
?
4
)
????????????output[i]?
=
?b2iu(input[j])?
|
?(b2iu(input[j?
+
?
1
])?
<<
?
8
)
????????????????????
|
?(b2iu(input[j?
+
?
2
])?
<<
?
16
)?
|
?(b2iu(input[j?
+
?
3
])?
<<
?
24
);

????????
return
;
????}
????
/**/
/*
?????*?b2iu是我寫的一個把byte按照不考慮正負號的原則的"升位"程序,因為java沒有unsigned運算
?????
*/
????
public
?
static
?
long
?b2iu(
byte
?b)?
{
????????
return
?b?
<
?
0
?
?
?b?
&
?
0x7F
?
+
?
128
?:?b;
????}
????
/**/
/*
?????*?byteHEX(),用來把一個byte類型的數轉換成十六進制的ASCII表示,
?????*?因為java中的byte的toString無法實現這一點,我們又沒有C語言中的?sprintf(outbuf,"%02X",ib)
?????
*/
????
public
?
static
?String?byteHEX(
byte
?ib)?
{

????????
char
[]?Digit?
=
?
{?
'
0
'
,?
'
1
'
,?
'
2
'
,?
'
3
'
,?
'
4
'
,?
'
5
'
,?
'
6
'
,?
'
7
'
,?
'
8
'
,?
'
9
'
,?
'
A
'
,
????????????????
'
B
'
,?
'
C
'
,?
'
D
'
,?
'
E
'
,?
'
F
'
?}
;
????????
char
[]?ob?
=
?
new
?
char
[
2
];
????????ob[
0
]?
=
?Digit[(ib?
>>>
?
4
)?
&
?
0X0F
];
????????ob[
1
]?
=
?Digit[ib?
&
?
0X0F
];
????????String?s?
=
?
new
?String(ob);
????????
return
?s;
????}
????
public
?
static
?
void
?main(String?args[])?
{

????????MD5?m?
=
?
new
?MD5();

????????
if
?(Array.getLength(args)?
==
?
0
)?
{?
//
如果沒有參數,執行標準的Test?Suite
????????????System.out.println(
"
MD5?Test?suite:
"
);
????????????System.out.println(
"
MD5(\
"
850817
\
"
):
"
?
+
?m.getMD5ofStr(
"
850817
"
));
????????????System.out.println(
"
MD5(\
"
\
"
):
"
?
+
?m.getMD5ofStr(
""
));
????????????System.out.println(
"
MD5(\
"
a\
"
):
"
?
+
?m.getMD5ofStr(
"
a
"
));
????????????System.out.println(
"
MD5(\
"
abc\
"
):
"
?
+
?m.getMD5ofStr(
"
abc
"
));
????????????System.out.println(
"
MD5(\
"
message?digest\
"
):
"
????????????????????
+
?m.getMD5ofStr(
"
message?digest
"
));
????????????System.out.println(
"
MD5(\
"
abcdefghijklmnopqrstuvwxyz\
"
):
"
????????????????????
+
?m.getMD5ofStr(
"
abcdefghijklmnopqrstuvwxyz
"
));
????????????System.out
????????????????????.println(
"
MD5(\
"
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\
"
):
"
????????????????????????????
+
?m
????????????????????????????????????.getMD5ofStr(
"
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
"
));
????????}
?
else
????????????System.out
????????????????????.println(
"
MD5(
"
?
+
?args[
0
]?
+
?
"
)=
"
?
+
?m.getMD5ofStr(args[
0
]));

????}
}