【VBA】SHA256のハッシュ値を得る方法(System.Security.Cryptography.SHA256Managed)
今回はVBAを使って、SHA256のハッシュ値を得る方法を紹介します。
使えるソフトが制限されている環境だと、SHA256を求める方法がないかもしれません。
そうしたときは、VBAでも計算することができるので、参考にしてみてください。
この記事では次の2つの方法をお見せします。
- ファイルのハッシュ値を求める方法
- テキストのハッシュ値を求める方法
両方とも一旦Byte型の配列へ変換をします。
このByte型の配列をさらに変換することでSHA256のハッシュ値を得ます。(正確にはハッシュ値のByte型配列を得て、Stringに変換する)
サンプルコードの中にコメントを記載したので、コメントを確認しながら読んでみてください。
事前準備(参照ライブラリ)
このプログラムでは、「.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進数の文字列へと変換します。
ライブラリを利用した関係でコード数はだいぶ少なめです。
分からない部分はステップ実行すれば次第に理解できると思います。