' Base64ToHex.vbs ' VBScript program to convert a base64 encoded string into a hex string. ' ' ---------------------------------------------------------------------- ' Copyright (c) 2010 Richard L. Mueller ' Hilltop Lab web site - http://www.rlmueller.net ' Version 1.0 - January 7, 2010 ' ' Syntax: ' cscript //nologo Base64ToHex.vbs ' where: ' is a Base64 encoded string. ' If no parameter is supplied, the program will prompt. ' ' You have a royalty-free right to use, modify, reproduce, and ' distribute this script file in any way you find useful, provided that ' you agree that the copyright owner above has no warranty, obligations, ' or liability for such use. Option Explicit Dim strValue64, objChars, intLen, objRE, objMatches, objMatch If (Wscript.Arguments.Count <> 1) Then strValue64 = InputBox("Enter Base64 encoded string", "Base64ToHex.vbs") Else strValue64 = Wscript.Arguments(0) End If ' Check for syntax help. If (strValue64 = "/?") _ Or (strValue64 = "-?") _ Or (strValue64 = "?") _ Or (strValue64 = "/H") _ Or (strValue64 = "/h") _ Or (strValue64 = "-H") _ Or (strValue64 = "-h") _ Or (strValue64 = "/help") _ Or (strValue64 = "-help") Then Call Syntax() Wscript.Quit End If intLen = Len(strValue64) ' Validate string. Set objRE = New RegExp objRE.Pattern = "[A-Za-z0-9\+/]+[=]?[=]?" objRE.Global = True Set objMatches = objRE.Execute(strValue64) If (objMatches.Count <> 1) Then Wscript.Echo "Invalid Base64 string: " & strValue64 Call Syntax() Wscript.Quit End If For Each objMatch In objMatches If (objMatch.Length <> intLen) Then Wscript.Echo "Invalid Base64 string: " & strValue64 Call Syntax() Wscript.Quit End If Next If (intLen Mod 4 <> 0) Then Wscript.Echo "Base64 string invalid length: " & strValue64 Call Syntax() Wscript.Quit End If ' Setup dictionary object used to convert Base64 characters into ' base 64 index integers. Set objChars = CreateObject("Scripting.Dictionary") objChars.CompareMode = vbBinaryCompare ' Load dictionary object. Call LoadChars() ' Convert Base64 encoded string into hexadecimal bytes. Wscript.Echo Base64ToHex(strValue64) Function Base64ToHex(strValue) ' Function to convert a base64 encoded string into a hex string. Dim lngValue, lngTemp, lngChar, intLen, k, j, intTerm, strHex intLen = Len(strValue) ' Check padding. intTerm = 0 If (Right(strValue, 1) = "=") Then intTerm = 1 End If If (Right(strValue, 2) = "==") Then intTerm = 2 End If ' Parse into groups of 4 6-bit characters. j = 0 lngValue = 0 Base64ToHex = "" For k = 1 To intLen j = j + 1 ' Calculate 24-bit integer. lngValue = (lngValue * 64) + objChars(Mid(strValue, k, 1)) If (j = 4) Then ' Convert 24-bit integer into 3 8-bit bytes. lngTemp = Fix(lngValue / 256) lngChar = lngValue - (256 * lngTemp) strHex = Right("00" & Hex(lngChar), 2) lngValue = lngTemp lngTemp = Fix(lngValue / 256) lngChar = lngValue - (256 * lngTemp) strHex = Right("00" & Hex(lngChar), 2) & strHex lngValue = lngTemp lngTemp = Fix(lngValue / 256) lngChar = lngValue - (256 * lngTemp) strHex = Right("00" & Hex(lngChar), 2) & strHex Base64ToHex = Base64ToHex & strHex j = 0 lngValue = 0 End If Next ' Account for padding. Base64ToHex = Left(Base64ToHex, Len(Base64ToHex) - (intTerm * 2)) End Function Sub LoadChars() ' Subroutine to load dictionary object with information to convert ' Base64 characters into base 64 index integers. ' Object reference objChars has global scope. objChars.Add "A", 0 objChars.Add "B", 1 objChars.Add "C", 2 objChars.Add "D", 3 objChars.Add "E", 4 objChars.Add "F", 5 objChars.Add "G", 6 objChars.Add "H", 7 objChars.Add "I", 8 objChars.Add "J", 9 objChars.Add "K", 10 objChars.Add "L", 11 objChars.Add "M", 12 objChars.Add "N", 13 objChars.Add "O", 14 objChars.Add "P", 15 objChars.Add "Q", 16 objChars.Add "R", 17 objChars.Add "S", 18 objChars.Add "T", 19 objChars.Add "U", 20 objChars.Add "V", 21 objChars.Add "W", 22 objChars.Add "X", 23 objChars.Add "Y", 24 objChars.Add "Z", 25 objChars.Add "a", 26 objChars.Add "b", 27 objChars.Add "c", 28 objChars.Add "d", 29 objChars.Add "e", 30 objChars.Add "f", 31 objChars.Add "g", 32 objChars.Add "h", 33 objChars.Add "i", 34 objChars.Add "j", 35 objChars.Add "k", 36 objChars.Add "l", 37 objChars.Add "m", 38 objChars.Add "n", 39 objChars.Add "o", 40 objChars.Add "p", 41 objChars.Add "q", 42 objChars.Add "r", 43 objChars.Add "s", 44 objChars.Add "t", 45 objChars.Add "u", 46 objChars.Add "v", 47 objChars.Add "w", 48 objChars.Add "x", 49 objChars.Add "y", 50 objChars.Add "z", 51 objChars.Add "0", 52 objChars.Add "1", 53 objChars.Add "2", 54 objChars.Add "3", 55 objChars.Add "4", 56 objChars.Add "5", 57 objChars.Add "6", 58 objChars.Add "7", 59 objChars.Add "8", 60 objChars.Add "9", 61 objChars.Add "+", 62 objChars.Add "/", 63 End Sub Sub Syntax() ' Subroutine to display syntax message. Wscript.Echo "Syntax:" Wscript.Echo " cscript //nologo Base64ToHex.vbs " Wscript.Echo "where:" Wscript.Echo " is a Base64 encoded string." Wscript.Echo "For example:" Wscript.Echo " cscript //nologo Base64ToHex.vbs VGhpcyBpcyBhIHRlc3Q=" End Sub