やりたいこと
ファイルを手動で移動させたりする過程で中身の情報を書き換えられていないかをチェックしたい。
ソースコード
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