このサイトの記事内では「アフィリエイト広告」などの広告を掲載している場合があります。
消費者庁が問題としている「誇大な宣伝や表現」とならないよう配慮しコンテンツを制作しておりますのでご安心ください。
問題のある表現が見つかりましたらお問い合わせよりご一報いただけますと幸いです。

【VBA】SHA256のハッシュ値を得る方法(System.Security.Cryptography.SHA256Managed)

SHA256のハッシュ値を得る方法

今回はVBAを使って、SHA256のハッシュ値を得る方法を紹介します。

使えるソフトが制限されている環境だと、SHA256を求める方法がないかもしれません。

そうしたときは、VBAでも計算することができるので、参考にしてみてください。

この記事では次の2つの方法をお見せします。

  • ファイルのハッシュ値を求める方法
  • テキストのハッシュ値を求める方法

両方とも一旦Byte型の配列へ変換をします。

このByte型の配列をさらに変換することでSHA256のハッシュ値を得ます。(正確にはハッシュ値のByte型配列を得て、Stringに変換する)

サンプルコードの中にコメントを記載したので、コメントを確認しながら読んでみてください。

VBAが難しいと感じたら
ココナラにてマクロ(VBA)の作成代行を始めました。
ご依頼はこちらから

事前準備(参照ライブラリ)

このプログラムでは、「.NET Framework 3.5」のライブラリを使用します。

そのため、このライブラリが無効の場合は有効化する必要があります。

※無効の場合、「オートメーションエラーです」というエラーが発生します。

Windowsの機能の有効化または無効化を開いて、「.NET Framework 3.5」を有効化してから動かしてください。

画像のように■であれば、有効化されています。

□であればクリックしてからOKボタンを押します。すると、ライブラリの有効化が始まります。

ファイルのハッシュ値を求めるコード

Sub File2SHA256_Sample()
    '''File2SHA256を呼び出すサンプルコード
    
    Dim fullPath As String
    fullPath = Application.GetOpenFilename
    
    Debug.Print String2SHA256$(fullPath)
End Sub


Public Function File2SHA256(fullPath As String) As String
    '''ファイルのハッシュを計算する関数
    
    ''指定したファイルがあるか確認
    If Len(Dir(fullPath)) = 0 Then
        MsgBox "ファイルが存在しません"
        Exit Function
    End If
    
    ''ファイルのByte型配列を取得
    Dim buff() As Byte
    Dim ff&
    ff = FreeFile
    Open fullPath For Binary Lock Read As #ff
    ReDim buff(LOF(ff) - 1)
    Get #ff, , buff
    Close #ff
    
    'ハッシュ(Byte型配列)を計算
    Dim objSHA256 As Object
    Set objSHA256 = CreateObject("System.Security.Cryptography.SHA256Managed")
    Dim hashValues() As Byte
    hashValues = objSHA256.ComputeHash_2(buff)
    
    '16進法表示に変換
    Dim description As String, hashValue
    For Each hashValue In hashValues
        description = description & Right("0" & Hex(hashValue), 2)
    Next
    
    File2SHA256 = description
End Function

ファイルのハッシュ値を求めるコードはこのようになります。

実際に、ファイルのハッシュ値を作成するのはFile2SHA256という関数の方です。

サンプルコードでは、Application.GetOpenFilenameで選択したファイルのハッシュ値を表示します。

    ''ファイルのByte型配列を取得
    Dim buff() As Byte
    Dim ff&
    ff = FreeFile
    Open fullPath For Binary Lock Read As #ff
    ReDim buff(LOF(ff) - 1)
    Get #ff, , buff
    Close #ff

まず、この部分でファイルを開いて、ファイル情報をByte型の配列buffに書き込んでいます。

    'ハッシュ(Byte型配列)を計算
    Dim objSHA256 As Object
    Set objSHA256 = CreateObject("System.Security.Cryptography.SHA256Managed")
    Dim hashValues() As Byte
    hashValues = objSHA256.ComputeHash_2(buff)

ハッシュ値へ変換しているのはこの箇所です。

ライブラリを読み込み、先ほどのbuffをハッシュ値のByte型の配列hashValuesへと変換しています。

    '16進法表示に変換
    Dim description As String, hashValue
    For Each hashValue In hashValues
        description = description & Right("0" & Hex(hashValue), 2)
    Next

最後のここでは、ハッシュ値がByte型の配列のため、1要素ずつ呼び出して16進数の文字列へと変換しています。

テキストのハッシュ値を求めるコード

Sub String2SHA256_Sample()
    '''String2SHA256を呼び出すサンプルコード
    
    Dim str As String
    str = "適当な文字列"
    
    Debug.Print String2SHA256$(str)
End Sub
 
 
Public Function String2SHA256(str As String) As String
    '''文字列からハッシュを計算する関数
    
    ''文字列のByte型配列へ変換(UTF-8形式)
    Dim objUTF8 As Object
    Set objUTF8 = CreateObject("System.Text.UTF8Encoding")
    Dim code() As Byte
    code = objUTF8.GetBytes_4(str)
    
    'ハッシュ(Byte型配列)を計算
    Dim objSHA256 As Object
    Set objSHA256 = CreateObject("System.Security.Cryptography.SHA256Managed")
    Dim hashValues() As Byte
    hashValues = objSHA256.ComputeHash_2(code)
    
    '16進法表示に変換
    Dim description As String, hashValue
    For Each hashValue In hashValues
        description = description & Right("0" & Hex(hashValue), 2)
    Next
    
    String2SHA256 = description
End Function

テキストのハッシュ値を求めるコードはこのようになります。

サンプルコードでは、"適当な文字列"をハッシュ値へ変換しています。

    ''文字列のByte型配列へ変換(UTF-8形式)
    Dim objUTF8 As Object
    Set objUTF8 = CreateObject("System.Text.UTF8Encoding")
    Dim code() As Byte
    code = objUTF8.GetBytes_4(str)

最初に、ライブラリを使用して、文字列のByte型配列へと変換しています。

これ以降はファイルの場合と全く同じです。

    'ハッシュ(Byte型配列)を計算
    Dim objSHA256 As Object
    Set objSHA256 = CreateObject("System.Security.Cryptography.SHA256Managed")
    Dim hashValues() As Byte
    hashValues = objSHA256.ComputeHash_2(code)
    
    '16進法表示に変換
    Dim description As String, hashValue
    For Each hashValue In hashValues
        description = description & Right("0" & Hex(hashValue), 2)
    Next

Byte型配列をハッシュのByte型配列へと変換して、16進数の文字列へと変換します。

ライブラリを利用した関係でコード数はだいぶ少なめです。

分からない部分はステップ実行すれば次第に理解できると思います。

VBAが難しいと感じたら
ココナラにてマクロ(VBA)の作成代行を始めました。
ご依頼はこちらから

VBA

Posted by やろまい