[VBA]SHA256を使用してテキストの改ざんを検出する

やりたいこと

ファイルを手動で移動させたりする過程で中身の情報を書き換えられていないかをチェックしたい。

ソースコード

Public Function Sha256Hash(str As String) As String

    ' 文字列→Byte配列へ変換
    Dim utf8encoding As Object
    Set utf8encoding = CreateObject("System.Text.UTF8Encoding")
    Dim bytes() As Byte
    bytes = utf8encoding.GetBytes_4(str)

    ' ハッシュを取得する
    Dim sha256m As Object
    Set sha256m = CreateObject("System.Security.Cryptography.SHA256Managed")
    Dim hash() As Byte
    hash = sha256m.ComputeHash_2((bytes))

    ' 32bit → 16進数 64桁に変換
    Dim sha256 As String
    Dim i As Integer
    For i = LBound(hash) To UBound(hash)
        sha256 = sha256 & LCase(Right("0" & Hex(hash(i)), 2))
    Next i

    Sha256Hash = sha256
End Function

ソース解析

utf8encoding.GetBytes_4(str)sha256m.ComputeHash_2((bytes))の末尾の数字の意味

こればバイト数ではなくオーバーロードの識別番号らしい。
VBAではオーバーロードは存在しないため、それでも扱えるように番号で呼び分けているようだ。
公式サイト上では、そのような説明は見当たらず。

たしかに、公式のリファレンスを参照するとオーバーロードなメソッドがいくつか用意されているのがわかる。

Right("0" & Hex(hash(i)), 2)の意味

SHA256は1bitを2桁の16進数で表現する(00 ~ FF)
bitの値が、0 ~ 15(0 ~ F)の場合、1桁であるため、必ず2桁になるように0を連結している。

参考サイト

【VBA】Excelでハッシュ値を計算する【SHA256】【MD5】 | ネコニウム研究所

UTF8Encoding クラス (System.Text) | Microsoft Learn

SHA256Managed クラス (System.Security.Cryptography) | Microsoft Learn

WindowsのExcel VBAから.NET Frameworkの暗号サービスを呼び出す方法 : 灰色スズメの足跡