ゆっきーのブログ

実践的なシステム設計開発、アプリケーションフレームワーク開発、トラブルシューティング、 後輩育成のためのブログ。その他、キャンプ、トレッキング・登山やレジャー等。

vba 実装技術 開発標準化

vbaでのエンコード/デコードのサンプル

投稿日:


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に置き換えてください。

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”を選択し、[実行]をクリックしてください。
実行結果はイミディエイトウィンドウ上で次のように表示されます。
イミディエイトウインドウが表示されていない場合、[表示]-[イミディエイトウインドウ]をクリックしてください。

input : abcdあいうえお
Hex =============
encode : 61626364e38182e38184e38186e38188e3818a
decode : abcdあいうえお
Base64 ==========
encode : YWJjZOOBguOBhOOBhuOBiOOBig==
decode : abcdあいうえお
Digest ==========
MD5    : 91783233d5c7632d6f55159416869e04
SHA-1  : ba6ce26af36e21b0e9e87fb0b1a7520e283756f0
SHA-256: c4c7f73689afac6d38b8b62fc7d16f6ec41711acb0ba9611f8acf4014867709d

-vba, 実装技術, 開発標準化

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

技術検証

Linuxでの gdrive の使い方

wordpressのデータをgoogle driveにバックアップするための基礎調査を行っている。 google driveに接続可能なライブラリは幾つかあるようだが、ここでは無料でお手軽に始められそ …

マスタデータ生成ツール

開発や結合試験、本番環境等で使用するマスタデータをExcelで管理することがあります。 そのようなExcelファイルからDBに登録するためのインサート文を作成するために、いつもツールに悩むので作成して …

テキストファイルマスクツール

本番環境での性能検証でNGになってしまった。 どの処理でどれほどの処理時間がかかっているかを把握するためにログレベルを変更して、ログを取得した。 対応方法を自社の担当者と検討するために、本番環境からこ …

SLF4Jの仕組みと使用方法

何気に使用しているSLF4Jの仕様やその仕組みを整理したいと思います。 前提 元ネタは次のSLF4J Manualサイトです。  www.slf4j.org  1 sha …

DOSバッチリファレンス

ちょっとした事でbatファイルを作成することが多い。 そのたびにネット検索するのが非効率なため、リファレンス化しようと思う。 そういう目的なので、自分がよく調べる項目に絞っている。 開発時の注意点 直 …