アプリ開発ときどきアウトドア

主にJavaを使ったアプリ開発やトラブルシューティング等のノウハウ、キャンプや登山の紹介や体験談など。

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


(adsbygoogle = window.adsbygoogle || []).push({});


(adsbygoogle = window.adsbygoogle || []).push({});

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

執筆者:


comment

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

関連記事

Javaでサポートする暗号化アルゴリズム

Java暗号化アーキテクチャ Javaで暗号化処理を実装する場合、Java暗号化アーキテクチャ(Java Cryptography Architecture: JCA)と呼ばれるフレームワークを使いま …

DOSバッチリファレンス

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

.NET Core: JsonSerializerの単純な使い方

JsonSerializerの基本的な使い方とサンプルを説明します。 概要 .NET Core 3.1の標準パッケージSystem.Text.Jsonに含まれるJsonSerializerを使って、ク …

.NET Core: JsonSerializerの実践的な使い方

業務アプリの開発を想定したJsonSerializerの使い方とサンプルです。 概要 .NET Core 3.1の標準パッケージSystem.Text.Jsonに含まれるJsonSerializerを …

ASP.NET Core: IHttpClientFactoryの使用方法

とりあえず、どんなサンプルになるか知りたい人は下記のサンプルをご覧ください。 ASP.NET Core: IHttpClientFactoryの単純サンプル ASP.NET Core: IHttpCl …