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で暗号化/復号する用途は少ないと思いますが、参考になれば幸いです。
コメント