Search code examples
excelvbaencryptionaescbc-mode

VBA AES CBC encryption


I have referred encryption in https://github.com/susam/aes.vbs and below is the code i endup with

Function Min(a, b)
    Min = a
    If b < a Then Min = b
End Function

Function B64Encode(bytes)
    Dim result As String
    Dim b64Block() As Byte
    Dim b64Enc As Object
    Dim utf8 As Object
    Dim Offset, Length, BlockSize As Integer
    
    Set b64Enc = CreateObject("System.Security.Cryptography.ToBase64Transform")
    Set utf8 = CreateObject("System.Text.UTF8Encoding")
    BlockSize = b64Enc.InputBlockSize
    For Offset = 0 To LenB(bytes) - 1 Step BlockSize
        Length = Min(BlockSize, UBound(bytes) - Offset)
        b64Block = b64Enc.TransformFinalBlock((bytes), Offset, Length)
        result = result & utf8.GetString((b64Block))
    Next
    B64Encode = result
End Function

Function B64Decode(b64Str)
    Dim utf8 As Object
    Dim bytes() As Byte
    Dim b64Dec As Object
    
    Set utf8 = CreateObject("System.Text.UTF8Encoding")
    Set b64Dec = CreateObject("System.Security.Cryptography.FromBase64Transform")
    bytes = utf8.GetBytes_4(b64Str)
    B64Decode = b64Dec.TransformFinalBlock((bytes), 0, UBound(bytes))
End Function

Function Encrypt(plaintext, aesKey)
    Dim cipherBytes, aesKeyBytes, ivKeyBytes, plainBytes() As Byte
    
    Dim utf8, AES, aesEnc As Object
    Dim aesIV() As Byte
    Set AES = CreateObject("System.Security.Cryptography.RijndaelManaged")
    Set utf8 = CreateObject("System.Text.UTF8Encoding")
    'Set cipherMode = GetObject("System.Security.Cryptography.CipherMode")
    AES.KeySize = 256
    AES.Mode = 1
    AES.Key = CreateObject("System.Text.UTF8Encoding").GetBytes_4("V$ry300DP3r$0NM3")
    AES.IV = CreateObject("System.Text.UTF8Encoding").GetBytes_4("HR$2pIjHR$2pIjPa")
    plainBytes = utf8.GetBytes_4(plaintext)
    'Set aesEnc = AES.CreateEncryptor_2((aesKeyBytes), (ivKeyBytes))
    cipherBytes = AES.TransformFinalBlock((plainBytes), 0, UBound(plainBytes))
        
    Encrypt = B64Encode(cipherBytes)
End Function

Now the above code is saying me "specified initialization vector (iv) does not match the block size for this algorithm"

Cant we set IV dynamic?


Solution

  • Function Min(a, b)
        Min = a
        If b < a Then Min = b
    End Function
    
    Function B64Encode(bytes)
        Dim result As String
        Dim b64Block() As Byte
        Dim b64Enc As Object
        Dim utf8 As Object
        Dim Offset, Length, BlockSize As Integer
        
        Set b64Enc = CreateObject("System.Security.Cryptography.ToBase64Transform")
        Set utf8 = CreateObject("System.Text.UTF8Encoding")
        BlockSize = b64Enc.InputBlockSize
        For Offset = 0 To LenB(bytes) - 1 Step BlockSize
            Length = Min(BlockSize, UBound(bytes) - Offset)
            b64Block = b64Enc.TransformFinalBlock((bytes), Offset, Length)
            result = result & utf8.GetString((b64Block))
        Next
        B64Encode = result
    End Function
    
    Function B64Decode(b64Str)
        Dim utf8 As Object
        Dim bytes() As Byte
        Dim b64Dec As Object
        
        Set utf8 = CreateObject("System.Text.UTF8Encoding")
        Set b64Dec = CreateObject("System.Security.Cryptography.FromBase64Transform")
        bytes = utf8.GetBytes_4(b64Str)
        B64Decode = b64Dec.TransformFinalBlock((bytes), 0, UBound(bytes))
    End Function
    
    
    Function Encrypt(plaintext, aesKey)
        Dim cipherBytes, aesKeyBytes, ivKeyBytes, plainBytes() As Byte
        
        Dim utf8, AES, aesEnc, cipherMode As Object
        Dim aesIV() As Byte
            
        Set AES = CreateObject("System.Security.Cryptography.RijndaelManaged")
        Set utf8 = CreateObject("System.Text.UTF8Encoding")
        'Set cipherMode = CreateObject("System.Security.Cryptography.CipherMode")
        
        AES.KeySize = 256
        AES.BlockSize = 256
        'CipherMode.CBC
        AES.Mode = 1
        'PaddingMode.PKCS7
        AES.Padding = 2
        AES.Key = CreateObject("System.Text.UTF8Encoding").GetBytes_4("ThirtyTwoBytes3$ThirtyTwoBytes3$")
        AES.IV = CreateObject("System.Text.UTF8Encoding").GetBytes_4("3$ThreeTwoBytes3$ThreeTwoBytes3$")
        'plainBytes = utf8.GetBytes_4(plaintext)
        plainBytes = B64Decode(plaintext)
        'Set aesEnc = AES.CreateEncryptor_2((aesKeyBytes), (ivKeyBytes))
        cipherBytes = AES.CreateEncryptor().TransformFinalBlock((plainBytes), 0, UBound(plainBytes))
            
        Encrypt = B64Encode(cipherBytes)
    End Function
    
    Sub encrypt_hell()
    Debug.Print Encrypt("Hello", "PattamuthuArumug")
    End Sub
    

    I am using AES CBC 256 bits so 32 bytes Key and IV has to be used