Excel(vba)で、MD5/SHA-1/SHA-2(SHA-256)の出力、Hex/Base64エンコード/デコードを調べたので備忘録として残します。
動作検証した環境は、Windows10+Office2010です。
- MD5/SHA1等のハッシュ値の生成、文字列のUTF8変換を実現するために、.NET Frameworkのライブラリ(mscorlib.dll)を使用します。
- バイト列を16進数/Base64形式にエンコードしたり、その逆にデコードするために、Microsoft XMLライブラリを使用します。
サンプルは次の通りです。
実行するためには、上記の2ライブラリの参照設定が必要になります。
使用するXMLライブラリに関して、実行環境がWin7以前の場合はv2.0、Win8以降はv6.0を使用する必要があります。(Windows 8 以降の MSXML2.DOMDocument の使用方法)
今回の検証環境がWindows10であるため、以降に記載するサンプルはv6.0を使用する想定になっています。Win7以前で実行する場合、v2.0を参照設定し、DOMDocument60をDOMDocumentに置き換えてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | Option Explicit '[ツール]-[参照設定]で次を追加してください。 '・Microsoft XML, v6.0(Win7以前はv2.0, Win8以降はv6.0) '・mscorlib.dll(.NET Framework) Sub test() '入力データはUTF-8文字列とする Dim encoding As New utf8encoding Dim inbytes() As Byte Dim str As String Dim outbytes() As Byte Dim digester As Variant Dim hashbytes() As Byte '試験対象の文字列 Dim instring As String instring = "abcdあいうえお" Debug.Print "input : " & instring inbytes = encoding.GetBytes_4(instring) Debug.Print "Hex =============" str = encodeToHex(inbytes) Debug.Print "encode : " & str Debug.Print "decode : " & encoding.GetString(decodeFromHex(str)) Debug.Print "Base64 ==========" str = encodeToBase64(inbytes) Debug.Print "encode : " & str Debug.Print "decode : " & encoding.GetString(decodeFromBase64(str)) Debug.Print "Digest ==========" Set digester = New MD5CryptoServiceProvider 'mscorlib.dllが必要 hashbytes = digester.ComputeHash_2(inbytes) Debug.Print "MD5 : " & encodeToHex(hashbytes) Set digester = New SHA1CryptoServiceProvider 'mscorlib.dllが必要 hashbytes = digester.ComputeHash_2(inbytes) Debug.Print "SHA-1 : " & encodeToHex(hashbytes) Set digester = New SHA256Managed 'mscorlib.dllが必要 hashbytes = digester.ComputeHash_2(inbytes) Debug.Print "SHA-256: " & encodeToHex(hashbytes) End Sub 'バイト列を16進数形式の文字列にエンコードする。 Function encodeToHex(bytes() As Byte) encodeToHex = encode("bin.Hex", bytes) End Function 'バイト列をBASE64形式の文字列にエンコードする。 Function encodeToBase64(bytes() As Byte) encodeToBase64 = encode("bin.base64", bytes) End Function '16進数形式の文字列をバイト列にデコードする。 Function decodeFromHex(text As String) decodeFromHex = decode("bin.Hex", text) End Function 'BASE64形式の文字列をバイト列にデコードする。 Function decodeFromBase64(text As String) decodeFromBase64 = decode("bin.base64", text) End Function 'バイト列を指定タイプの文字列にエンコードする。 Function encode(dataType As String, bytes() As Byte) Dim oXmlDoc As New DOMDocument60 'Microsoft XML, v6.0が必要 With oXmlDoc .LoadXML ("<root />") .DocumentElement.dataType = dataType .DocumentElement.nodeTypedValue = bytes End With encode = Replace(oXmlDoc.DocumentElement.text, vbLf, "") End Function '指定タイプの文字列をバイト列にデコードする。 Function decode(dataType As String, text As String) Dim oXmlDoc As New DOMDocument60 'Microsoft XML, v6.0が必要 With oXmlDoc .LoadXML ("<root />") .DocumentElement.dataType = dataType .DocumentElement.text = text End With decode = oXmlDoc.DocumentElement.nodeTypedValue End Function |
実行する場合、実行ボタンを押して、マクロ名として”test”を選択し、[実行]をクリックしてください。
実行結果はイミディエイトウィンドウ上で次のように表示されます。
イミディエイトウインドウが表示されていない場合、[表示]-[イミディエイトウインドウ]をクリックしてください。
[code title=”実行結果”]input : abcdあいうえお
Hex =============
encode : 61626364e38182e38184e38186e38188e3818a
decode : abcdあいうえお
Base64 ==========
encode : YWJjZOOBguOBhOOBhuOBiOOBig==
decode : abcdあいうえお
Digest ==========
MD5 : 91783233d5c7632d6f55159416869e04
SHA-1 : ba6ce26af36e21b0e9e87fb0b1a7520e283756f0
SHA-256: c4c7f73689afac6d38b8b62fc7d16f6ec41711acb0ba9611f8acf4014867709d
[/code]