PR

【EXCEL】VBAでAES-256-CBCによる暗号化/復号を行う関数

Excelに入力したデータをもとに、SQLのInsert文を生成するコードを書いたのですが、一部のデータは平文のままでは問題があるため暗号化する必要がありました。

しかしExcelVBAは標準で暗号化/復号する関数はないため、ネットの情報を参考に関数を作りました。

ここで紹介するVBAの関数はAES-256-CBCで暗号化/復号するものです。

コード

Option Explicit

'
'AES-256-CBC暗号化
'
Public Function AesEncrypt(plaintext As String, aesKey As String, iv As String) As String
    Dim AES As Object
    Dim utf8 As Object
    Dim cipherBytes() As Byte
    Dim plainBytes() As Byte

    Set AES = CreateObject("System.Security.Cryptography.RijndaelManaged")
    Set utf8 = CreateObject("System.Text.UTF8Encoding")

    AES.KeySize = 256
    AES.BlockSize = 128
    AES.Mode = 1            'CipherMode.CBC
    AES.Padding = 2         'PaddingMode.PKCS7
    AES.key = utf8.GetBytes_4(aesKey)
    AES.iv = utf8.GetBytes_4(iv)
    plainBytes = utf8.GetBytes_4(plaintext)

    cipherBytes = AES.CreateEncryptor().TransformFinalBlock(plainBytes, 0, UBound(plainBytes) + 1)

    AesEncrypt = BytesToBase64(cipherBytes)

    Set AES = Nothing
    Set utf8 = Nothing
End Function

'
'AES-256-CBC復号
'
Public Function AesDecrypt(encryptedString As String, aesKey As String, iv As String) As String
    Dim AES As Object
    Dim utf8 As Object
    Dim encrypted_byte_data() As Byte
    Dim str_byte_data() As Byte

    Set AES = CreateObject("System.Security.Cryptography.RijndaelManaged")
    Set utf8 = CreateObject("System.Text.UTF8Encoding")

    AES.KeySize = 256
    AES.BlockSize = 128
    AES.Mode = 1            'CipherMode.CBC
    AES.Padding = 2         'PaddingMode.PKCS7
    AES.key = utf8.GetBytes_4(aesKey)
    AES.iv = utf8.GetBytes_4(iv)

    encrypted_byte_data = Base64toBytes(encryptedString)
    str_byte_data = AES.CreateDecryptor.TransformFinalBlock(encrypted_byte_data, 0, UBound(encrypted_byte_data) + 1)

    AesDecrypt = utf8.GetString(str_byte_data)

    Set AES = Nothing
    Set utf8 = Nothing
End Function

Function BytesToBase64(varBytes() As Byte) As String
    Dim obj As Object
    Dim elm As Object

    Set obj = CreateObject("MSXML2.DomDocument")
    Set elm = obj.CreateElement("base64")

    elm.DataType = "bin.base64"
    elm.nodeTypedValue = varBytes
    BytesToBase64 = Replace(elm.Text, vbLf, "") '改行が含まれるので除去

    Set obj = Nothing
    Set elm = Nothing
End Function

Function Base64toBytes(varStr As String) As Byte()
    Dim obj As Object
    Dim elm As Object

    Set obj = CreateObject("MSXML2.DOMDocument")
    Set elm = obj.CreateElement("base64")

    elm.DataType = "bin.base64"
    elm.Text = varStr
    Base64toBytes = elm.nodeTypedValue

    Set obj = Nothing
    Set elm = Nothing
End Function

使い方

暗号化/復号、いずれの関数も第一引数に暗号化する文字列/復号する文字列を、第二関数は暗号鍵の文字列を、第三関数に初期化ベクトルの文字列を与えます。

暗号鍵と初期化ベクトルはそれぞれ32バイト、16バイト長の文字列を与えます。

戻り値は暗号化された文字列/復号した文字列です。

暗号化方式はAES-256-CBCなので、暗号化した文字列はphpのopenssl_decrypt関数などで復号できます。

ExcelVBAで暗号化/復号する用途は少ないと思いますが、参考になれば幸いです。

コメント

タイトルとURLをコピーしました