Private Const BlkLenMax = 32 ' maximum block length in bytes Private Const KeyLenMax = 32 ' maximum block length in bytes Private Const KeySchLenMax = 128 ' maximum key schedule length in bytes Private BlkLen As Integer ' actual block length Private KeyLen As Integer ' actual key length Private Type AESctx ' Type to hold the AES context data Ekey(0 To KeySchLenMax - 1) As Long Nrnd As Long Ncol As Long End Type Private Type KeyBlk ' Type to hold user key data K(0 To KeyLenMax - 1) As Byte End Type Private Type IoBlk ' Type to hold cipher input and output blocks IO(0 To BlkLenMax - 1) As Byte End Type Rem Change "d:\dll_pth" in the following lines to the directory path where the AES DLL is located Private Declare Function AesBlkLen Lib "d:\dll_path\aes.dll" Alias "_aes_blk_len@8" (ByVal N As Long, C As AESctx) As Integer Private Declare Function AesEncKey Lib "d:\dll_path\aes.dll" Alias "_aes_enc_key@12" (K As KeyBlk, ByVal N As Long, C As AESctx) As Integer Private Declare Function AesDecKey Lib "d:\dll_path\aes.dll" Alias "_aes_dec_key@12" (K As KeyBlk, ByVal N As Long, C As AESctx) As Integer Private Declare Function AesEncBlk Lib "d:\dll_path\aes.dll" Alias "_aes_enc_blk@12" (Ib As IoBlk, Ob As IoBlk, C As AESctx) As Integer Private Declare Function AesDecBlk Lib "d:\dll_path\aes.dll" Alias "_aes_dec_blk@12" (Ib As IoBlk, Ob As IoBlk, C As AESctx) As Integer Private Sub Hex(X As Byte) ' Output a byte in hexadecimal format Dim H As Byte H = Int(X / 16) If H < 10 Then Debug.Print Chr(48 + H); Else Debug.Print Chr(87 + H); End If H = Int(X Mod 16) If H < 10 Then Debug.Print Chr(48 + H); Else Debug.Print Chr(87 + H); End If End Sub Private Sub OutKey(S As String, B As KeyBlk) ' Display a key value Debug.Print: Debug.Print S; For i = 0 To KeyLen - 1 Hex B.K(i) Next i End Sub Private Sub OutBlock(S As String, B As IoBlk) ' Display an input/output block Debug.Print: Debug.Print S; For i = 0 To BlkLen - 1 Hex B.IO(i) Next i End Sub Rem The following Main routine should output the following in the immediate window: Rem Key = 00000000000000000000000000000000 Rem Input = 00000000000000000000000000000000 Rem Encrypted Text = 66e94bd4ef8a2c3b884cfa59ca342b2e Rem Decrypted Text = 00000000000000000000000000000000 Sub Main() Dim Key As KeyBlk ' These variables are automatically Dim Ib As IoBlk, Ob As IoBlk, Rb As IoBlk Dim Cx As AESctx ' initialised to zero values in VBA Dim RetVal As Integer BlkLen = 16: KeyLen = 16 Rem RetVal = AesBlkLen(BlkLen, Cx) ' include if the cipher block size is variable OutKey "Key = ", Key OutBlock "Input = ", Ib RetVal = AesEncKey(Key, KeyLen, Cx) ' set an all zero encryption key RetVal = AesEncBlk(Ib, Ob, Cx) ' encrypt Ib to Ob OutBlock "Encrypted Text = ", Ob RetVal = AesDecKey(Key, KeyLen, Cx) ' set an all zero decryption key RetVal = AesDecBlk(Ob, Rb, Cx) ' decrypt Ob to Rb OutBlock "Decrypted Text = ", Rb Debug.Print End Sub