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

主に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

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

関連記事

Apache HttpClientの通信内容をダンプ

アプリやミドルウェの動作の正常性確認や問題発生時の問題切り分けのために、HTTPリクエストやレスポンスのヘッダやボディを確認したい場合がある。Java系のアプリではApacheのHttpClientが …

jQueryによるデフォルトボタンの実装

デフォルトボタンについて Webページ上でエンターキーを押した場合、そのページ上であらかじめ決められたボタンをクリックしたかのように処理を実行する仕組みがある。何らかのデータの検索を行うようなページは …

Java/JavaEE開発キットの作成

Javaアプリ開発者のローカルPCに、ファイル展開するだけで開発環境をできるようにするための開発キットの準備について記載します。 ★随時更新予定★ 背景 Java/JavaEE等を使ったアプリ開発では …

マスタデータ生成ツール

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

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

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

プロフィール ゆっきーです。
都内でシステムエンジニアをやっています。
もっと詳細を見る