Using system.text; using system.collections;
A summary description of Namespace chx.common.commonfunctions {///
Public MD5 () {///}
Public string registera {get {return (state [1] .tostring ());}}
Public string registerb {get {return (state [2] .tostring ());}}
Public string registerc {get {return (state [3] .tostring ());}}
Public string registerd {get {return (state [4] .tostring ());}}
Public string md5_string_calc (String SourceString) {md5init (); Md5Update (SourceString), StringToArray (SourceString)); // Todo: Add parameter md5Final (); return (getValues ());}
// Todo: Add to read file // public function md5_file_calc (Infile As String) AS String // On Error Goto Errorhandler // DiGin // Errorhandler // DigestFileToHexStr = "" // EXIT function //// begin : // dim fileo as integer // fileo = freefile // call filelen // Open infile for binary access / f f w m e /, / / / // if Loc (fileo)
private byte [] StringToArray (string InString) {byte [] byteBuffer = new byte [LenBIncludeChinese (InString)]; byteBuffer = Encoding.Default.GetBytes (InString); return (byteBuffer);}
Public string getValues () {return (longtostring (state [1]) longtostring (state [2]) longtoString (state [4]);}
PRIVATE STRING longtoString (long Num) {byte a; byte b; byte C; byte D;
Long i; string s;
I = NUM & 0xFF;
A = byte.parse (i.tostring ());
IF (a <16) {s = "0" a.tostring ("x");} else {s = a.tostring ("x");}
I = (long) (NUM & 0xFF00) / 256;
B = byte.parse (i.tostring ()); if (b <16) {s = s "0" b.tostring ("x");} else {s = s b.toString ("x ");
I = (long) (NUM & 0xFF000) / 65536;
C = byte.parse (i.tostring ());
IF (c <16) {s = s "0" C.TOString ("x");} else {s = s c.toString ("x");}
IF (Num <0) {i = (Num & 0x7F000000) / 16777216) | 0x80; d = byte.parse (i.tostring ());} else {i = (long) (Num & 0xFF000000) / 16777216; D = byte.parse (i.tostring ());
IF (D <16) {s = s "0" D.Tostring ("x");} else {s = s d.toString ("x");}
Return (s);}
public void MD5Init () {ByteCounter = 0; State [1] = UnsignedToLong (1732584193); State [2] = UnsignedToLong (4023233417); State [3] = UnsignedToLong (2562383102); State [4] = UnsignedToLong (271733878); }
Public void md5final () {double dblbits; byte [] padding = new byte [72]; long lngBytesbuffered; long i;
padding [0] = 0x80; dblBits = ByteCounter * 8; lngBytesBuffered = ByteCounter% 64; if (lngBytesBuffered <= 56) {MD5Update (56 - lngBytesBuffered, padding);} else {MD5Update (120 - ByteCounter, padding);} i = Unsignedtolong (dblbits) & 0xff;
Padding [0] = byte.parse (i.tostring ());
I = ((long) unsignedtolong (dblbits) / 256) & 0xff; padding [1] = byte.parse ());
I = ((long) unsignedtolong (dblbits) / 65536) & 0xFF;
Padding [2] = byte.parse (i.tostring ());
i = ((long) unsignedtolong (dblbits) / 16777216) & 0xFF;
Padding [3] = Byte.Parse (I.TOString ()); Padding [4] = 0; Padding [5] = 0; Padding [6] = 0; Padding [7] = 0; Md5Update (8, Padding) }
Public void md5update (long inputbuff) {INT II; INT i; int J; int K; long lngbufferedBytes; long lngbufferremaining; long lngrem;
LNGBUFFEREDBYTES = BYTECUNTER% 64; lngbufferremaining = 64 - lngbufferedbytes;
BYTECUNTER = INPUTLEN
IF (INPUTLEN> = lngbufferremaining) {for (II = 0; II Md5Transform (Bytebuffer); LNGREM = (Inputlen)% 64; For (i = (int) lngbufferremaining; i <= inputlen - ii - lngrem; i = 64) {for (j = 0; j <64; j ) {bytebuffer [j] = inputbuffer [i j];} MD5TRANSFORM Bytebuffer; LNGBUFFEREDBYTES = 0;} else {i = 0;} For (k = 0; k <= inputlen - i - 1; k ) {bytebuffer [lngbufferedBytes K] = inputbuffer [i k];}} Private void md5transform (Byte [] buffer {long [] x = new long [16]; long a; long b; long c; long d; A = state [1]; b = state [2]; c = state [3]; d = state [4]; Decode (64, x, buffer); FF (REF A, B, C, D, X [0], S11, -680876936); FF (Ref D, A, B, C, X [1], S12, -389564586); FF (Ref C, D , B, X [2], S13, 606105819); FF (Ref B, C, D, A, X [3], S14, -1044525330); FF (Ref A, B, C, D, X [ 4], S11, -176418897); FF (REF D, A, B, C, X [5], S12, 1200080426); FF (Ref C, D, A, B, X [6], S13, -1473231341 ); FF (REF B, C, D, A, X [7], S14, -45705983); FF (Ref A, B, C, D, X [8], S11, 1770035416); FF (Ref D, A, B, C, X [9], S12,-1958414417); FF (REF C, D, A, B, X [10], S13, -42063); FF (Ref B, C, D, A, X [11], S14, -1990404162); FF (Ref A, B, C, D, X [12], S11, 1804603682); FF (Ref D, A, B, C, X [13], S12, -40341101); FF (REF C, D, A, B, X [14], S13, -1502002290); FF (Ref B, C, D, A, X [15], S14, 1236535329); GG (Ref A, B, C, D, X [1], S21,-165796510); GG (REF D, A, B, C, X [6], S22, -1069501632); Gg (REF C, D, A, B, X [11], S23, 643717713); GG (REF B, C, D, A, X [0], S24,-373897302); GG (Ref A, B, C, D, X [5], S21, -701558691); GG (REF D, A, B, C, X [10], S22, 38016083); Gg (REF C, D, A, B, X [15], S23,-660478335); GG (REF B, C, D, A, X [4], S24, -405537848); GG (Ref A, B, C, D, X [9], S21, 568446438); GG (Ref D, A, B , C, X [14], S22 , -1019803690); GG (REF C, D, A, B, X [3], S23,-187363961); GG (REF B, C, D, A, X [8], S24, 1163531501); GG ( REF A, B, C, D, X [13], S21,-1444681467); Gg (REF D, A, B, C, X [2], S22, -51403784); GG (REF C, D, A , B, X [7], S23, 1735328473); GG (REF B, C, D, A, X [12], S24, -1926607734); HH (REF A, B, C, D, X [5], S31,-378558); HH (Ref D, A, B, C, X [8], S32, -2022574463); HH (Ref C, D , B, X [11], S33, 1839030562); HH (Ref B, C, D, A, X [14], S34,-35309556); HH (Ref A, B, C, D, X [ 1], S31, -1530992060); HH (Ref D, A, B, C, X [4], S32, 1272893353); HH (Ref C, D, A, B, X [7], S33, -155497632 HH (REF B, C, D, A, X [10], S34, -1094730640); HH (Ref A, B, C, D, X [13], S31, 681279174); HH (Ref D, A, B, C, X [0], S32,-358537222); HH (REF C, D, A, B, X [3], S33,-722521979); HH (Ref B, C, D, A, X [6], S34, 76029189); HH (Ref A, B, C, D, X [9], S31,-640364487); HH (Ref D, A, B, C, X [12], S32, -421815835); HH (REF C, D, A, B, X [15], S33, 530742520); HH (Ref B, C, D, A, X [2], S34, -995338651); II (Ref A, B, C, D, X [0], S41,-198630844); II (REF D, A, B, C, X [7], S42, 1126891415); II (Ref C, D, A, B , X [14], S43, -1416354905); II (Ref B, C, D, A, X [5], S44, -57434055); II (Ref A, B, C, D, X [12], S41, 1700485571); II (Ref D, A, B, C, X [3], S42,-1894986606); II (REF C, D, A, B, X [10], S43, -1051523); II (REF B, C, D, A, X [1], S44, -2054922799); II (Ref A, B, C, D, X [8], S41, 1873313359); II (Ref D, A, B , C, X [15], S42 , -30611744); II (REF C, D, A, B, X [6], S43,-1560198380); II (Ref B, C, D, A, X [13], S44, 1309151649); II ( REF A, B, C, D, X [4], S41, -145523070); II (Ref D, A, B, C, X [11], S42,-1120210379); II (Ref C, D, A , B, X [2], S43, 718787259); II (REF B, C, D, A, X [9], S44, -343485551); State [1] = longoverflowadd (state [1], a); state [2] = longoverflowadd (state [2], b); state [3] = longoverflowadd (State [3], c); state [4] = LongoverflowAdd (State [4], D); } Private Void Decode (int LENGTH, Long [] OutputBuffer, Byte [] InputBuffer) {INT INTBYTEINDEX = 0; INT INTDBLINDEX = 0; double dblSum; for (intByteIndex = 0; intByteIndex PRIVATE VOID GG (Ref Long A, Long B, Long S, Long AC) {a = longoverflowadd4 (A, (B & D) | (C & ~ D), X, AC) A = longleftrotate (a, s); a = longoverflowadd (a, b);} PRIVATE VOID HH (Ref Long A, Long B, Long C, Long D, Long X, Long S, Long AC) {A = longoverflowAdd4 (A, B ^ C ^ D, X, AC); A = longleftrotate (A, S); a = longoverflowadd (a, b);} PRIVATE VOID II (Ref Long A, Long B, Long C, Long D, Long X, Long A {a = longoverflowadd4 (A, C ^ (B | ~ D), X, AC); A = longftrotate (A, s); a = longoverflowadd (a, b);} Public long longleftrotate (long value, long bits) {long lngsign; long lngi; bits% = 32; if (bits == 0) {return (value); For (LNGI = 1; LNGI <= BITS; LNGI ) {LNGSIGN = Value & 0xC0000000; Value = (Value & 0x3ffffffff) * 2; BOOL B; B = (LNGSign <0); long L; if (b == True ) L = 1; Else L = 0; value = value | (l & 1) | ((LNGSIGN & 0X40000000) & 0x80000000);} returnis;} private long LongOverflowAdd (long Val1, long Val2) {long lngHighWord; long lngLowWord; long lngOverflow; lngLowWord = (Val1 & 0xFFFF) (Val2 & 0xFFFF); lngOverflow = (long) lngLowWord / 65536; lngHighWord = ((long) ( (VAL1 & 0xFFFF0000) / 65536) (VAL2 & 0xFFFF0000) / 65536) LNGOVERFLOW) & 0xfff; Return (unsignedtolong ((LNGHighword * 65536) (LNGLOWORD & 0xFFFF));} PRIVATE Long LongoverflowAdd4 (Long Val1, Long Val2, Long Val3, Long Val4) {Long LNGHighword; Long LngLowWord; Long Lng LNGOVERFLOW; LNGLOWWORD = (VAL1 & 0xFFFF) (VAL3 & 0xFFFF) (VAL3 & 0xFFFF); LNGOVERFLOW = (long) LNGLOWORD / 65536; LNGHIGHWORD = ((long) ((VAL1 & 0xFFF0000) / 65536) (long) ((VAL2 & 0xFFFFFFFF0000) / 65536) ((VAL3 & 0xFFFF0000) / 65536) ((VAL4 & 0xFFFF00) / 655536) LNGOVERFLOW) & 0xffff; Return (unsignedtolong LNGHIGHWORD * 65536) (LNGLOWWORD & 0xFFF))); Private long unsignedtolong (double value) {if (value <0 || value> = offset_4) throw (new overflowexception ()); // Throw overflow errors IF (value <= (double) maxint_4) {return ((long) value);} else {return ((long) value - offset_4);}} Private Double Longtounsigned (LONG VALUE) {IF (value <0) Return (Double) Value Offset_4); Else Return ((Double) Value;} } The original author information is as follows, now you can add my name :) 'Robert hubley and david midkiff (mdj2023@hotmail.com)' modify by Simonyan, Support Chinese 'Modify By Cuixian Cui, Support C # However, the results do not know why, the results got with VB are different. Everyone is interested in helping me see, I with VB's MD5 example, I don't know where it is wrong.