![email me](http://eddiejackson.net/web_images/email.PNG)
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