These will return a MD5 hash that you could use to run CRC checks on files or even strings.
If all you need is a MD5, try this…
PowerShell
Clear-Host $PathToYourFile = "C:\YourFileHere.txt" $MD5 = Get-FileHash -Path $PathToYourFile -Algorithm MD5 $MD5
More elaborate handling…
C#
using System; using System.Security.Cryptography; using System.Text; namespace MD5Hash { class Program { static void Main(string[] args) { // String to test encoding and decoding string source = "TheIsATestMessage!"; // Before encoding Console.WriteLine("Before Encoding: " + source); Console.WriteLine(""); // After encoding using (MD5 md5Hash = MD5.Create()) { string hash = GetMd5Hash(md5Hash, source); Console.WriteLine("After Encoding: " + hash); Console.WriteLine(""); if (VerifyMd5Hash(md5Hash, source, hash)) { //the same Console.WriteLine(""); Console.WriteLine("After Decoding (matches)"); Console.ReadKey(); } else { //not the same Console.WriteLine(""); Console.WriteLine("After Decoding (does not match)"); Console.ReadKey(); } } } static string GetMd5Hash(MD5 md5Hash, string input) { // Input string into byte array byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input)); // Collect bytes StringBuilder sBuilder = new StringBuilder(); // Byte to hexadecimal translation for (int i = 0; i < data.Length; i++) { sBuilder.Append(data[i].ToString("x2")); } // Return the hexadecimal string. return sBuilder.ToString(); } // Verify a hash against a string. static bool VerifyMd5Hash(MD5 md5Hash, string input, string OriginalHash) { // Hash input - Will be used to compare hash against original string // string InputHash = GetMd5Hash(md5Hash, input) + "x"; string InputHash = GetMd5Hash(md5Hash, input); // Compare hashes StringComparer comparer = StringComparer.OrdinalIgnoreCase; if (0 == comparer.Compare(InputHash, OriginalHash)) { Console.WriteLine("Compare Old String: " + OriginalHash + " New String: " + InputHash); return true; } else { Console.WriteLine("Compare Old String: " + OriginalHash + " New String: " + InputHash); return false; } } } }
VBScript method, though it is slow if the file is large…
VBScript
'Notes 'I created this using: 'http://www.pro-bono-publico.de/projects/unpacked/misc/mymd4.c 'Could be upgraded to: 'http://www.pro-bono-publico.de/projects/unpacked/misc/mymd5.c 'Pseudocode available here: 'https://en.wikipedia.org/wiki/MD5 Option Explicit Dim PathToYourFile 'The file to return a MD5 PathToYourFile = "C:\YourFileHere.txt" 'No need to modify anything else Private longTrack Private arrayLongConversion(4) Private arraySplit64(63) Private Const OFFSET_4 = 4294967296 Private Const MAXINT_4 = 2147483647 Private Const S11 = 7 Private Const S12 = 12 Private Const S13 = 17 Private Const S14 = 22 Private Const S21 = 5 Private Const S22 = 9 Private Const S23 = 14 Private Const S24 = 20 Private Const S31 = 4 Private Const S32 = 11 Private Const S33 = 16 Private Const S34 = 23 Private Const S41 = 6 Private Const S42 = 10 Private Const S43 = 15 Private Const S44 = 21 'Calls md5 function and returns md5 hash msgbox "MD5: " & MD5Hash(PathToYourFile),64,"MD5" Public Function MD5Hash(strFilename) Dim strMD5, objFSO Set objFSO = CreateObject("Scripting.FileSystemObject") 'clear string strMD5 = "" 'If file exists, try reading it If objFSO.FileExists(strFilename) then strMD5 = BinaryToString(ReadTextFile(strFilename, "")) MD5Hash = CalculateMD5(strMD5) Else MD5Hash = strFilename & VbCrLf & "File not found!" End if End Function Function ReadTextFile(FileName, CharSet) Const adTypeText = 2 Dim BinaryStream Set BinaryStream = CreateObject("ADODB.Stream") BinaryStream.Type = adTypeText If Len(CharSet) > 0 Then BinaryStream.CharSet = CharSet End If BinaryStream.Open BinaryStream.LoadFromFile FileName ReadTextFile = BinaryStream.ReadText End Function Function BinaryToString(Binary) Dim cl1, cl2, cl3, pl1, pl2, pl3, L cl1 = 1 cl2 = 1 cl3 = 1 L = LenB(Binary) Do While cl1<=L pl3 = pl3 & Chr(AscB(MidB(Binary,cl1,1))) cl1 = cl1 + 1 cl3 = cl3 + 1 If cl3>300 Then pl2 = pl2 & pl3 pl3 = "" cl3 = 1 cl2 = cl2 + 1 If cl2>200 Then pl1 = pl1 & pl2 pl2 = "" cl2 = 1 End If End If Loop BinaryToString = pl1 & pl2 & pl3 End Function Private Function MD5Round(stringTranslation, a, b, c, d, X, S, ac) Select Case stringTranslation Case "FF" a = MD5LongAdd4(a, (b And c) Or (Not (b) And d), X, ac) a = MD5Rotate(a, S) a = MD5LongAdd(a, b) Case "GG" a = MD5LongAdd4(a, (b And d) Or (c And Not (d)), X, ac) a = MD5Rotate(a, S) a = MD5LongAdd(a, b) Case "HH" a = MD5LongAdd4(a, b Xor c Xor d, X, ac) a = MD5Rotate(a, S) a = MD5LongAdd(a, b) Case "II" a = MD5LongAdd4(a, c Xor (b Or Not (d)), X, ac) a = MD5Rotate(a, S) a = MD5LongAdd(a, b) End Select End Function Private Function MD5Rotate(longValue, longBits) Dim longSign, longI longBits = (longBits Mod 32) If longBits = 0 Then MD5Rotate = longValue: Exit Function For longI = 1 To longBits longSign = longValue And &HC0000000 longValue = (longValue And &H3FFFFFFF) * 2 longValue = longValue Or ((longSign < 0) And 1) Or (CBool(longSign And &H40000000) And &H80000000) Next MD5Rotate = longValue End Function Private Function TRID() Dim singleNum, longnum, stringResult singleNum = Rnd(2147483648) stringResult = CStr(singleNum) stringResult = Replace(stringResult, "0.", "") stringResult = Replace(stringResult, ".", "") stringResult = Replace(stringResult, "E-", "") TRID = stringResult End Function Private Function MD564Split(longLength, bytBuffer()) Dim longBytesTotal, longBytesToAdd, intLoop, intLoop2, longTrace, intInnerLoop, intLoop3 longBytesTotal = longTrack Mod 64 longBytesToAdd = 64 - longBytesTotal longTrack = (longTrack + longLength) If longLength >= longBytesToAdd Then For intLoop = 0 To longBytesToAdd - 1 arraySplit64(longBytesTotal + intLoop) = bytBuffer(intLoop) Next MD5Conversion arraySplit64 longTrace = (longLength) Mod 64 For intLoop2 = longBytesToAdd To longLength - intLoop - longTrace Step 64 For intInnerLoop = 0 To 63 arraySplit64(intInnerLoop) = bytBuffer(intLoop2 + intInnerLoop) Next MD5Conversion arraySplit64 Next longBytesTotal = 0 Else intLoop2 = 0 End If For intLoop3 = 0 To longLength - intLoop2 - 1 arraySplit64(longBytesTotal + intLoop3) = bytBuffer(intLoop2 + intLoop3) Next End Function Private Function MD5StringArray(strInput) Dim intLoop Dim bytBuffer() ReDim bytBuffer(Len(strInput)) For intLoop = 0 To Len(strInput) - 1 bytBuffer(intLoop) = Asc(Mid(strInput, intLoop + 1, 1)) Next MD5StringArray = bytBuffer End Function Private Sub MD5Conversion(bytBuffer()) Dim X(16), a, b, c, d a = arrayLongConversion(1) b = arrayLongConversion(2) c = arrayLongConversion(3) d = arrayLongConversion(4) MD5Decode 64, X, bytBuffer 'reference: http://www.pro-bono-publico.de/projects/unpacked/misc/mymd4.c '/* Round 1 */ MD5Round "FF", a, b, c, d, X(0), S11, -680876936 MD5Round "FF", d, a, b, c, X(1), S12, -389564586 MD5Round "FF", c, d, a, b, X(2), S13, 606105819 MD5Round "FF", b, c, d, a, X(3), S14, -1044525330 MD5Round "FF", a, b, c, d, X(4), S11, -176418897 MD5Round "FF", d, a, b, c, X(5), S12, 1200080426 MD5Round "FF", c, d, a, b, X(6), S13, -1473231341 MD5Round "FF", b, c, d, a, X(7), S14, -45705983 MD5Round "FF", a, b, c, d, X(8), S11, 1770035416 MD5Round "FF", d, a, b, c, X(9), S12, -1958414417 MD5Round "FF", c, d, a, b, X(10), S13, -42063 MD5Round "FF", b, c, d, a, X(11), S14, -1990404162 MD5Round "FF", a, b, c, d, X(12), S11, 1804603682 MD5Round "FF", d, a, b, c, X(13), S12, -40341101 MD5Round "FF", c, d, a, b, X(14), S13, -1502002290 MD5Round "FF", b, c, d, a, X(15), S14, 1236535329 '/* Round 2 */ MD5Round "GG", a, b, c, d, X(1), S21, -165796510 MD5Round "GG", d, a, b, c, X(6), S22, -1069501632 MD5Round "GG", c, d, a, b, X(11), S23, 643717713 MD5Round "GG", b, c, d, a, X(0), S24, -373897302 MD5Round "GG", a, b, c, d, X(5), S21, -701558691 MD5Round "GG", d, a, b, c, X(10), S22, 38016083 MD5Round "GG", c, d, a, b, X(15), S23, -660478335 MD5Round "GG", b, c, d, a, X(4), S24, -405537848 MD5Round "GG", a, b, c, d, X(9), S21, 568446438 MD5Round "GG", d, a, b, c, X(14), S22, -1019803690 MD5Round "GG", c, d, a, b, X(3), S23, -187363961 MD5Round "GG", b, c, d, a, X(8), S24, 1163531501 MD5Round "GG", a, b, c, d, X(13), S21, -1444681467 MD5Round "GG", d, a, b, c, X(2), S22, -51403784 MD5Round "GG", c, d, a, b, X(7), S23, 1735328473 MD5Round "GG", b, c, d, a, X(12), S24, -1926607734 '/* Round 3 */ MD5Round "HH", a, b, c, d, X(5), S31, -378558 MD5Round "HH", d, a, b, c, X(8), S32, -2022574463 MD5Round "HH", c, d, a, b, X(11), S33, 1839030562 MD5Round "HH", b, c, d, a, X(14), S34, -35309556 MD5Round "HH", a, b, c, d, X(1), S31, -1530992060 MD5Round "HH", d, a, b, c, X(4), S32, 1272893353 MD5Round "HH", c, d, a, b, X(7), S33, -155497632 MD5Round "HH", b, c, d, a, X(10), S34, -1094730640 MD5Round "HH", a, b, c, d, X(13), S31, 681279174 MD5Round "HH", d, a, b, c, X(0), S32, -358537222 MD5Round "HH", c, d, a, b, X(3), S33, -722521979 MD5Round "HH", b, c, d, a, X(6), S34, 76029189 MD5Round "HH", a, b, c, d, X(9), S31, -640364487 MD5Round "HH", d, a, b, c, X(12), S32, -421815835 MD5Round "HH", c, d, a, b, X(15), S33, 530742520 MD5Round "HH", b, c, d, a, X(2), S34, -995338651 '/* Round 4 */ MD5Round "II", a, b, c, d, X(0), S41, -198630844 MD5Round "II", d, a, b, c, X(7), S42, 1126891415 MD5Round "II", c, d, a, b, X(14), S43, -1416354905 MD5Round "II", b, c, d, a, X(5), S44, -57434055 MD5Round "II", a, b, c, d, X(12), S41, 1700485571 MD5Round "II", d, a, b, c, X(3), S42, -1894986606 MD5Round "II", c, d, a, b, X(10), S43, -1051523 MD5Round "II", b, c, d, a, X(1), S44, -2054922799 MD5Round "II", a, b, c, d, X(8), S41, 1873313359 MD5Round "II", d, a, b, c, X(15), S42, -30611744 MD5Round "II", c, d, a, b, X(6), S43, -1560198380 MD5Round "II", b, c, d, a, X(13), S44, 1309151649 MD5Round "II", a, b, c, d, X(4), S41, -145523070 MD5Round "II", d, a, b, c, X(11), S42, -1120210379 MD5Round "II", c, d, a, b, X(2), S43, 718787259 MD5Round "II", b, c, d, a, X(9), S44, -343485551 arrayLongConversion(1) = MD5LongAdd(arrayLongConversion(1), a) arrayLongConversion(2) = MD5LongAdd(arrayLongConversion(2), b) arrayLongConversion(3) = MD5LongAdd(arrayLongConversion(3), c) arrayLongConversion(4) = MD5LongAdd(arrayLongConversion(4), d) End Sub Private Function MD5LongAdd(longVal1, longVal2) Dim longHighWord, longLowWord, longOverflow longLowWord = (longVal1 And &HFFFF&) + (longVal2 And &HFFFF&) longOverflow = longLowWord \ 65536 longHighWord = (((longVal1 And &HFFFF0000) \ 65536) + ((longVal2 And &HFFFF0000) \ 65536) + longOverflow) And &HFFFF& MD5LongAdd = MD5LongConversion((longHighWord * 65536) + (longLowWord And &HFFFF&)) End Function Private Function MD5LongAdd4(longVal1, longVal2, longVal3, longVal4) Dim longHighWord, longLowWord, longOverflow longLowWord = (longVal1 And &HFFFF&) + (longVal2 And &HFFFF&) + (longVal3 And &HFFFF&) + (longVal4 And &HFFFF&) longOverflow = longLowWord \ 65536 longHighWord = (((longVal1 And &HFFFF0000) \ 65536) + ((longVal2 And &HFFFF0000) \ 65536) + ((longVal3 And &HFFFF0000) \ 65536) + ((longVal4 And &HFFFF0000) \ 65536) + longOverflow) And &HFFFF& MD5LongAdd4 = MD5LongConversion((longHighWord * 65536) + (longLowWord And &HFFFF&)) End Function Private Sub MD5Decode(intLength, longOutBuffer(), bytInBuffer()) Dim intdoubleIndex, intByteIndex, doubleSum intdoubleIndex = 0 For intByteIndex = 0 To intLength - 1 Step 4 doubleSum = bytInBuffer(intByteIndex) + bytInBuffer(intByteIndex + 1) * 256 + bytInBuffer(intByteIndex + 2) * 65536 + bytInBuffer(intByteIndex + 3) * 16777216 longOutBuffer(intdoubleIndex) = MD5LongConversion(doubleSum) intdoubleIndex = (intdoubleIndex + 1) Next End Sub Private Function MD5LongConversion(doubleValue) If doubleValue < 0 Or doubleValue >= OFFSET_4 Then Error 6 If doubleValue <= MAXINT_4 Then MD5LongConversion = doubleValue Else MD5LongConversion = doubleValue - OFFSET_4 End If End Function Private Sub MD5Finish() Dim doubleBits, arrayPadding(72), longBytesBuffered arrayPadding(0) = &H80 doubleBits = longTrack * 8 longBytesBuffered = longTrack Mod 64 If longBytesBuffered <= 56 Then MD564Split (56 - longBytesBuffered), arrayPadding Else MD564Split (120 - longTrack), arrayPadding End If arrayPadding(0) = MD5LongConversion(doubleBits) And &HFF& arrayPadding(1) = MD5LongConversion(doubleBits) \ 256 And &HFF& arrayPadding(2) = MD5LongConversion(doubleBits) \ 65536 And &HFF& arrayPadding(3) = MD5LongConversion(doubleBits) \ 16777216 And &HFF& arrayPadding(4) = 0 arrayPadding(5) = 0 arrayPadding(6) = 0 arrayPadding(7) = 0 MD564Split 8, arrayPadding End Sub Private Function MD5StringChange(longnum) Dim bytA, bytB, bytc, bytD bytA = longnum And &HFF& If bytA < 16 Then MD5StringChange = "0" & Hex(bytA) Else MD5StringChange = Hex(bytA) End If bytB = (longnum And &HFF00&) \ 256 If bytB < 16 Then MD5StringChange = MD5StringChange & "0" & Hex(bytB) Else MD5StringChange = MD5StringChange & Hex(bytB) End If bytC = (longnum And &HFF0000) \ 65536 If bytC < 16 Then MD5StringChange = MD5StringChange & "0" & Hex(bytC) Else MD5StringChange = MD5StringChange & Hex(bytC) End If If longnum < 0 Then bytD = ((longnum And &H7F000000) \ 16777216) Or &H80& Else bytD = (longnum And &HFF000000) \ 16777216 End If If bytD < 16 Then MD5StringChange = MD5StringChange & "0" & Hex(bytD) Else MD5StringChange = MD5StringChange & Hex(bytD) End If End Function Private Function MD5Value() MD5Value = LCase(MD5StringChange(arrayLongConversion(1)) &_ MD5StringChange(arrayLongConversion(2)) &_ MD5StringChange(arrayLongConversion(3)) &_ MD5StringChange(arrayLongConversion(4))) End Function Public Function CalculateMD5(strMessage) Dim bytBuffer bytBuffer = MD5StringArray(strMessage) MD5Start MD564Split Len(strMessage), bytBuffer MD5Finish CalculateMD5 = MD5Value End Function Private Sub MD5Start() longTrack = 0 arrayLongConversion(1) = MD5LongConversion(1732584193) arrayLongConversion(2) = MD5LongConversion(4023233417) arrayLongConversion(3) = MD5LongConversion(2562383102) arrayLongConversion(4) = MD5LongConversion(271733878) End Sub
Notes
Microsoft File Checksum Integrity Verifier
http://www.pro-bono-publico.de/projects/unpacked/misc/mymd4.c
http://www.pro-bono-publico.de/projects/unpacked/misc/mymd5.c
Batch
for /r %%a in (*) do md5.exe %%a << md5.txt md5.exe C:\YourFileHere.txt < md5.txt