Return MD5 Hash

email me

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