VB AES 字符串和文件加密

此代码在源码天空等多个源码站点上可以下载本人仅做了简单的修改总结为4个函数进行调用

1.EncryptStr/加密字符串

2.DecryptStr/解密字符串

3.EncryptFile/加密文件

4.DecryptFile/解密文件

'*************************************************************************
'描述:加密字符串
'函数结构EncryptStr(要加密字符串,密匙,密匙大小,字段大小,是否十六进制)
'*************************************************************************
Public Function EncryptStr(ByVal EnStr As String, ByVal pwd As String, ByVal KeyBit As Long, ByVal BlockBit As Long, ByVal HEX As Boolean) As String
    Dim pass()        As Byte
    Dim plaintext()   As Byte
    Dim ciphertext() As Byte
    Dim KeyBits       As Long
    Dim BlockBits     As Long
    Dim EnString As String
    Dim PassWd As String
    Dim SFHEX As Boolean
    EnString = EnStr
    PassWd = pwd
    KeyBits = KeyBit
    BlockBits = BlockBit
    SFHEX = HEX
    '如果加密字符串为空
    If Len(EnString) = 0 Then
        MsgBox "加密字符串为空"
    Else
        '如果密码为空
        If Len(PassWd) = 0 Then
            MsgBox "没有设置加密密码"
        Else
        '如果不是十六进制显示
        If SFHEX = False Then
            pass = StrConv(pwd, vbFromUnicode)
            plaintext = StrConv(EnString, vbFromUnicode)
            ReDim Preserve pass(31)
        Else
            If HexDisplayRev(pwd, pass) <> (KeyBits \ 8) Then
                pass = StrConv(pwd, vbFromUnicode)
                ReDim Preserve pass(31)
            End If
            If HexDisplayRev(EnString, plaintext) = 0 Then
                    MsgBox "加密字符串不是HEX数据"
                    Exit Function
            End If
        End If
            m_Rijndael.SetCipherKey pass, KeyBits
            m_Rijndael.ArrayEncrypt plaintext, ciphertext, 0
            EncryptStr = HexDisplay(ciphertext, UBound(ciphertext) + 1, BlockBits \ 8)
        End If
    End If
End Function
'*************************************************************************
'描述:解密字符串
'函数结构DecryptStr(要加密字符串,密匙,密匙大小,字段大小,是否十六进制)
'*************************************************************************
Public Function DecryptStr(ByVal DeStr As String, ByVal pwd As String, ByVal KeyBit As Long, ByVal BlockBit As Long, ByVal HEX As Boolean) As String
    Dim pass()        As Byte
    Dim plaintext()   As Byte
    Dim ciphertext() As Byte
    Dim KeyBits       As Long
    Dim BlockBits     As Long
    Dim DeString, PassWd As String
    Dim SFHEX As Boolean
    DeString = DeStr
    PassWd = pwd
    KeyBits = KeyBit
    BlockBits = BlockBit
    SFHEX = HEX
    If Len(DeString) = 0 Then
        MsgBox "解密字符串为空"
    Else
        If Len(PassWd) = 0 Then
            MsgBox "没有设置解密密码"
        Else
            If SFHEX = False Then
                pass = StrConv(PassWd, vbFromUnicode)
                ReDim Preserve pass(31)
            Else
                If HexDisplayRev(PassWd, pass) <> (KeyBits \ 8) Then
                    pass = StrConv(PassWd, vbFromUnicode)
                    ReDim Preserve pass(31)
                End If
            End If
            If HexDisplayRev(DeString, ciphertext) = 0 Then
                MsgBox "解密字符串不是HEX数据"
                Exit Function
            End If
            m_Rijndael.SetCipherKey pass, KeyBits
            If m_Rijndael.ArrayDecrypt(plaintext, ciphertext, 0) <> 0 Then
                Exit Function
            End If
            If SFHEX = False Then
                DecryptStr = StrConv(plaintext, vbUnicode)
            Else
                DecryptStr = HexDisplay(plaintext, UBound(plaintext) + 1, BlockBits \ 8)
            End If
        End If
    End If
End Function
'*************************************************************************
'描述:加密文件
'函数结构EncryptFile(要加密文件,目标文件,密匙,密匙大小,字段大小)
'*************************************************************************
Public Function EncryptFile(ByVal srcpath As String, ByVal trgpath As String, ByVal pwd As String, ByVal KeyBit As Long, ByVal BlockBit As Long) As Boolean
    Dim FileName As String
    Dim FileName2 As String
    Dim pass()    As Byte
    Dim KeyBits   As Long
    Dim BlockBits As Long
    Dim PassWd As String
    PassWd = pwd
    FileName = srcpath
    FileName2 = trgpath
    KeyBits = KeyBit
    BlockBits = BlockBit
    If Len(PassWd) = 0 Then
        MsgBox "没有设置加密文件密码"
        EncryptFile = False
        Exit Function
    Else
        If Len(FileName) <> 0 Then
            If Len(FileName2) <> 0 Then
                RidFile FileName2
                pass = StrConv(PassWd, vbFromUnicode)
                ReDim Preserve pass(31)
                m_Rijndael.SetCipherKey pass, KeyBits
                m_Rijndael.FileEncrypt FileName, FileName2
                EncryptFile = True
            End If
        End If
    End If
End Function
'*************************************************************************
'描述:解密文件
'函数结构DecryptFile(要解密文件,目标文件,密匙,密匙大小,字段大小)
'*************************************************************************
Public Function DecryptFile(ByVal srcpath As String, ByVal trgpath As String, ByVal pwd As String, ByVal KeyBit As Long, ByVal BlockBit As Long) As Boolean
    Dim FileName As String
    Dim FileName2 As String
    Dim pass()    As Byte
    Dim KeyBits   As Long
    Dim BlockBits As Long
    Dim PassWd As String
    PassWd = pwd
    FileName = srcpath
    FileName2 = trgpath
    KeyBits = KeyBit
    BlockBits = BlockBit
    If Len(PassWd) = 0 Then
        MsgBox "没有设置解密文件密码"
        DecryptFile = False
        Exit Function
    Else
        If Len(FileName) <> 0 Then
            If Len(FileName2) <> 0 Then
                RidFile FileName2
                pass = StrConv(PassWd, vbFromUnicode)
                ReDim Preserve pass(31)
                m_Rijndael.SetCipherKey pass, KeyBits
                m_Rijndael.FileDecrypt FileName2, FileName
                DecryptFile = True
            End If
        End If
    End If
End Function

 

以下为cRijndael 类


Option Explicit


'Title:     cRijndael - Advanced Encryption Standard (AES) Class
'Author:    John Korejwa  <korejwa@tiac.net>
'Filename:  Rijndael.cls
'Date:      09 / July / 2006
'Version:   1.0

'Usage:
'Create an instance of the class, set the cipher key, encrypt/decrypt to your heart's content


#Const SUPPORT_LEVEL = 0     'Default=0
'SUPPORT_LEVEL = 0 [AES Compliant]   Blocksize = 128                        Keysize = 128, 192, 256
'SUPPORT_LEVEL = 1 [Common Sizes ]   Blocksize = 128, 192, 256              Keysize = 128, 192, 256
'SUPPORT_LEVEL = 2 [  All Sizes  ]   Blocksize = 128, 160, 192, 224, 256    Keysize = 128, 160, 192, 224, 256

#Const COMPILE_CONSTANTS = 0 'Default=0
'COMPILE_CONSTANTS = 0 [Fast compile, small exe size]  Calculate tables during Class initialization
'COMPILE_CONSTANTS = 1 [Fast run time initialization]  Compile tables of constants


'These are arrays of constants.  They are initialized with the Class and do not change.
Private Te0(255)      As Long
Private Te1(255)      As Long
Private Te2(255)      As Long
Private Te3(255)      As Long
Private Te4(255)      As Long

Private Td0(255)      As Long
Private Td1(255)      As Long
Private Td2(255)      As Long
Private Td3(255)      As Long
Private Td4(255)      As Long

#If SUPPORT_LEVEL Then
Private rco(28)       As Long
#Else
Private rco(9)        As Long
#End If

'Key schedule arrays
Private Nr            As Long 'Number of rounds [For 128 bit block, Nr = {10, 12, 14} for 128, 192, 256 bit cipher key]
#If SUPPORT_LEVEL Then
Private fkey(119)     As Long 'Nb*(Nr + 1)
Private rkey(119)     As Long 'Nb*(Nr + 1)
#Else
Private fkey(59)      As Long 'Nb*(Nr + 1)
Private rkey(59)      As Long 'Nb*(Nr + 1)
#End If

'For file encryption, this is the maximum amount of memory (in bytes) allowed for file data
Private Const MaxFileChunkSize As Long = 4000000

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)


'Decryption Key Scheduler.  Calculate rkey() decryption keys based on fkey() and Nr.
'Nb is the number of 32 bit units in the block size.
Private Sub CreateDecryptionKeys(Nb As Long)
    Dim i    As Long
    Dim j    As Long
    Dim k    As Long
    Dim s(3) As Byte

    'Invert the order of the round keys
    i = 0
    j = Nb * Nr
    For k = 0 To Nr
        CopyMemory rkey(i), fkey(j), Nb * 4&
        i = i + Nb
        j = j - Nb
    Next k

    'Apply the inverse MixColumn transform to all round keys except the first and the last
    For i = Nb To Nb * Nr - 1
        CopyMemory s(0), rkey(i), 4&
        rkey(i) = Td0(Te4(s(0)) And &HFF&) Xor _
                  Td1(Te4(s(1)) And &HFF&) Xor _
                  Td2(Te4(s(2)) And &HFF&) Xor _
                  Td3(Te4(s(3)) And &HFF&)
    Next i
End Sub


'Key Scheduler. Expand the cipher key into the encryption key schedule.
'pass(0 ... n-1) contains the cipher key, where n = {16, 20, 24, 28, 32} , depending on KeyBits.
'If SUPPORT_LEVEL is non-zero, you must specify BlockBits for the block size you will be using.
'Returns zero on success.
#If SUPPORT_LEVEL Then
Public Function SetCipherKey(pass() As Byte, KeyBits As Long, BlockBits As Long) As Long
#Else
Public Function SetCipherKey(pass() As Byte, KeyBits As Long) As Long
#End If
    Dim i    As Long
    Dim j    As Long
    Dim s(3) As Byte

#If SUPPORT_LEVEL Then
    Select Case BlockBits
    Case 128
#End If

    '128 bit block size
    Select Case KeyBits
    Case 128
        i = 4
        CopyMemory fkey(0), pass(0), 4& * i
        For j = 0 To 9
            CopyMemory s(0), fkey(i - 1), 4&
            fkey(i) = fkey(i - 4) Xor (Te4(s(0)) And &HFF000000) _
                                  Xor (Te4(s(3)) And &HFF0000) _
                                  Xor (Te4(s(2)) And &HFF00&) _
                                  Xor (Te4(s(1)) And &HFF&) _
                                  Xor rco(j)
            fkey(i + 1) = fkey(i - 3) Xor fkey(i)
            fkey(i + 2) = fkey(i - 2) Xor fkey(i + 1)
            fkey(i + 3) = fkey(i - 1) Xor fkey(i + 2)
            i = i + 4
        Next j
        Nr = 10
'Debug.Assert i = (Nr + 1) * 4
#If SUPPORT_LEVEL = 2 Then
    Case 160
        i = 5
        j = 0
        CopyMemory fkey(0), pass(0), 4& * i
        Do
            CopyMemory s(0), fkey(i - 1), 4&
            fkey(i) = fkey(i - 5) Xor (Te4(s(0)) And &HFF000000) _
                                  Xor (Te4(s(3)) And &HFF0000) _
                                  Xor (Te4(s(2)) And &HFF00&) _
                                  Xor (Te4(s(1)) And &HFF&) _
                                  Xor rco(j)
            fkey(i + 1) = fkey(i - 4) Xor fkey(i)
            fkey(i + 2) = fkey(i - 3) Xor fkey(i + 1)
            If j = 8 Then Exit Do
            fkey(i + 3) = fkey(i - 2) Xor fkey(i + 2)
            fkey(i + 4) = fkey(i - 1) Xor fkey(i + 3)
            i = i + 5
            j = j + 1
        Loop
        Nr = 11
'Debug.Assert i + 3 = (Nr + 1) * 4
#End If
    Case 192
        i = 6
        j = 0
        CopyMemory fkey(0), pass(0), 4& * i
        Do
            CopyMemory s(0), fkey(i - 1), 4&
            fkey(i) = fkey(i - 6) Xor (Te4(s(0)) And &HFF000000) _
                                  Xor (Te4(s(3)) And &HFF0000) _
                                  Xor (Te4(s(2)) And &HFF00&) _
                                  Xor (Te4(s(1)) And &HFF&) _
                                  Xor rco(j)
            fkey(i + 1) = fkey(i - 5) Xor fkey(i)
            fkey(i + 2) = fkey(i - 4) Xor fkey(i + 1)
            fkey(i + 3) = fkey(i - 3) Xor fkey(i + 2)
            If j = 7 Then Exit Do
            fkey(i + 4) = fkey(i - 2) Xor fkey(i + 3)
            fkey(i + 5) = fkey(i - 1) Xor fkey(i + 4)
            i = i + 6
            j = j + 1
        Loop
        Nr = 12
'Debug.Assert i + 4 = (Nr + 1) * 4
#If SUPPORT_LEVEL = 2 Then
    Case 224
        i = 7
        CopyMemory fkey(0), pass(0), 4& * i
        For j = 0 To 6
            CopyMemory s(0), fkey(i - 1), 4&
            fkey(i) = fkey(i - 7) Xor (Te4(s(0)) And &HFF000000) _
                                  Xor (Te4(s(3)) And &HFF0000) _
                                  Xor (Te4(s(2)) And &HFF00&) _
                                  Xor (Te4(s(1)) And &HFF&) _
                                  Xor rco(j)
            fkey(i + 1) = fkey(i - 6) Xor fkey(i)
            fkey(i + 2) = fkey(i - 5) Xor fkey(i + 1)
            fkey(i + 3) = fkey(i - 4) Xor fkey(i + 2)
            CopyMemory s(0), fkey(i + 3), 4&
            fkey(i + 4) = fkey(i - 3) Xor (Te4(s(3)) And &HFF000000) _
                                      Xor (Te4(s(2)) And &HFF0000) _
                                      Xor (Te4(s(1)) And &HFF00&) _
                                      Xor (Te4(s(0)) And &HFF&)
            fkey(i + 5) = fkey(i - 2) Xor fkey(i + 4)
            fkey(i + 6) = fkey(i - 1) Xor fkey(i + 5)
            i = i + 7
        Next j
        Nr = 13
'Debug.Assert i = (Nr + 1) * 4
#End If
    Case 256
        i = 8
        j = 0
        CopyMemory fkey(0), pass(0), 4& * i
        Do
            CopyMemory s(0), fkey(i - 1), 4&
            fkey(i) = fkey(i - 8) Xor (Te4(s(0)) And &HFF000000) _
                                  Xor (Te4(s(3)) And &HFF0000) _
                                  Xor (Te4(s(2)) And &HFF00&) _
                                  Xor (Te4(s(1)) And &HFF&) _
                                  Xor rco(j)
            fkey(i + 1) = fkey(i - 7) Xor fkey(i)
            fkey(i + 2) = fkey(i - 6) Xor fkey(i + 1)
            fkey(i + 3) = fkey(i - 5) Xor fkey(i + 2)
            If j = 6 Then Exit Do
            CopyMemory s(0), fkey(i + 3), 4&
            fkey(i + 4) = fkey(i - 4) Xor (Te4(s(3)) And &HFF000000) _
                                      Xor (Te4(s(2)) And &HFF0000) _
                                      Xor (Te4(s(1)) And &HFF00&) _
                                      Xor (Te4(s(0)) And &HFF&)
            fkey(i + 5) = fkey(i - 3) Xor fkey(i + 4)
            fkey(i + 6) = fkey(i - 2) Xor fkey(i + 5)
            fkey(i + 7) = fkey(i - 1) Xor fkey(i + 6)
            i = i + 8
            j = j + 1
        Loop
        Nr = 14
'Debug.Assert i + 4 = (Nr + 1) * 4
    Case Else
        Err.Raise 1, , "cRijndael.SetCipherKey - Illegal KeyBits Value"
        SetCipherKey = 1
        Exit Function
    End Select
    CreateDecryptionKeys 4

#If SUPPORT_LEVEL Then
#If SUPPORT_LEVEL = 2 Then
    Case 160

    '160 bit block size
    Select Case KeyBits
    Case 128
        i = 4
        CopyMemory fkey(0), pass(0), 4& * i
        For j = 0 To 13
            CopyMemory s(0), fkey(i - 1), 4&
            fkey(i) = fkey(i - 4) Xor (Te4(s(0)) And &HFF000000) _
                                  Xor (Te4(s(3)) And &HFF0000) _
                                  Xor (Te4(s(2)) And &HFF00&) _
                                  Xor (Te4(s(1)) And &HFF&) _
                                  Xor rco(j)
            fkey(i + 1) = fkey(i - 3) Xor fkey(i)
            fkey(i + 2) = fkey(i - 2) Xor fkey(i + 1)
            fkey(i + 3) = fkey(i - 1) Xor fkey(i + 2)
            i = i + 4
        Next j
        Nr = 11
'Debug.Assert i = (Nr + 1) * 5
    Case 160
        i = 5
        CopyMemory fkey(0), pass(0), 4& * i
        For j = 0 To 10
            CopyMemory s(0), fkey(i - 1), 4&
            fkey(i) = fkey(i - 5) Xor (Te4(s(0)) And &HFF000000) _
                                  Xor (Te4(s(3)) And &HFF0000) _
                                  Xor (Te4(s(2)) And &HFF00&) _
                                  Xor (Te4(s(1)) And &HFF&) _
                                  Xor rco(j)
            fkey(i + 1) = fkey(i - 4) Xor fkey(i)
            fkey(i + 2) = fkey(i - 3) Xor fkey(i + 1)
            fkey(i + 3) = fkey(i - 2) Xor fkey(i + 2)
            fkey(i + 4) = fkey(i - 1) Xor fkey(i + 3)
            i = i + 5
        Next j
        Nr = 11
'Debug.Assert i = (Nr + 1) * 5
    Case 192
        i = 6
        j = 0
        CopyMemory fkey(0), pass(0), 4& * i
        Do
            CopyMemory s(0), fkey(i - 1), 4&
            fkey(i) = fkey(i - 6) Xor (Te4(s(0)) And &HFF000000) _
                                  Xor (Te4(s(3)) And &HFF0000) _
                                  Xor (Te4(s(2)) And &HFF00&) _
                                  Xor (Te4(s(1)) And &HFF&) _
                                  Xor rco(j)
            fkey(i + 1) = fkey(i - 5) Xor fkey(i)
            fkey(i + 2) = fkey(i - 4) Xor fkey(i + 1)
            fkey(i + 3) = fkey(i - 3) Xor fkey(i + 2)
            fkey(i + 4) = fkey(i - 2) Xor fkey(i + 3)
            If j = 9 Then Exit Do
            fkey(i + 5) = fkey(i - 1) Xor fkey(i + 4)
            i = i + 6
            j = j + 1
        Loop
        Nr = 12
'Debug.Assert i + 5 = (Nr + 1) * 5
    Case 224
        i = 7
        CopyMemory fkey(0), pass(0), 4& * i
        For j = 0 To 8
            CopyMemory s(0), fkey(i - 1), 4&
            fkey(i) = fkey(i - 7) Xor (Te4(s(0)) And &HFF000000) _
                                  Xor (Te4(s(3)) And &HFF0000) _
                                  Xor (Te4(s(2)) And &HFF00&) _
                                  Xor (Te4(s(1)) And &HFF&) _
                                  Xor rco(j)
            fkey(i + 1) = fkey(i - 6) Xor fkey(i)
            fkey(i + 2) = fkey(i - 5) Xor fkey(i + 1)
            fkey(i + 3) = fkey(i - 4) Xor fkey(i + 2)
            CopyMemory s(0), fkey(i + 3), 4&
            fkey(i + 4) = fkey(i - 3) Xor (Te4(s(3)) And &HFF000000) _
                                      Xor (Te4(s(2)) And &HFF0000) _
                                      Xor (Te4(s(1)) And &HFF00&) _
                                      Xor (Te4(s(0)) And &HFF&)
            fkey(i + 5) = fkey(i - 2) Xor fkey(i + 4)
            fkey(i + 6) = fkey(i - 1) Xor fkey(i + 5)
            i = i + 7
        Next j
        Nr = 13
'Debug.Assert i = (Nr + 1) * 5
    Case 256
        i = 8
        j = 0
        CopyMemory fkey(0), pass(0), 4& * i
        Do
            CopyMemory s(0), fkey(i - 1), 4&
            fkey(i) = fkey(i - 8) Xor (Te4(s(0)) And &HFF000000) _
                                  Xor (Te4(s(3)) And &HFF0000) _
                                  Xor (Te4(s(2)) And &HFF00&) _
                                  Xor (Te4(s(1)) And &HFF&) _
                                  Xor rco(j)
            fkey(i + 1) = fkey(i - 7) Xor fkey(i)
            fkey(i + 2) = fkey(i - 6) Xor fkey(i + 1)
            If j = 8 Then Exit Do
            fkey(i + 3) = fkey(i - 5) Xor fkey(i + 2)
            CopyMemory s(0), fkey(i + 3), 4&
            fkey(i + 4) = fkey(i - 4) Xor (Te4(s(3)) And &HFF000000) _
                                      Xor (Te4(s(2)) And &HFF0000) _
                                      Xor (Te4(s(1)) And &HFF00&) _
                                      Xor (Te4(s(0)) And &HFF&)
            fkey(i + 5) = fkey(i - 3) Xor fkey(i + 4)
            fkey(i + 6) = fkey(i - 2) Xor fkey(i + 5)
            fkey(i + 7) = fkey(i - 1) Xor fkey(i + 6)
            i = i + 8
            j = j + 1
        Loop
        Nr = 14
'Debug.Assert i + 3 = (Nr + 1) * 5
    Case Else
        Err.Raise 1, , "cRijndael.SetCipherKey - Illegal KeyBits Value"
        SetCipherKey = 1
        Exit Function
    End Select
    CreateDecryptionKeys 5
#End If
    Case 192

    '192 bit block size
    Select Case KeyBits
    Case 128
        i = 4
        j = 0
        CopyMemory fkey(0), pass(0), 4& * i
        Do
            CopyMemory s(0), fkey(i - 1), 4&
            fkey(i) = fkey(i - 4) Xor (Te4(s(0)) And &HFF000000) _
                                  Xor (Te4(s(3)) And &HFF0000) _
                                  Xor (Te4(s(2)) And &HFF00&) _
                                  Xor (Te4(s(1)) And &HFF&) _
                                  Xor rco(j)
            fkey(i + 1) = fkey(i - 3) Xor fkey(i)
            If j = 18 Then Exit Do
            fkey(i + 2) = fkey(i - 2) Xor fkey(i + 1)
            fkey(i + 3) = fkey(i - 1) Xor fkey(i + 2)
            i = i + 4
            j = j + 1
        Loop
        Nr = 12
'Debug.Assert i + 2 = (Nr + 1) * 6
#If SUPPORT_LEVEL = 2 Then
    Case 160
        i = 5
        j = 0
        CopyMemory fkey(0), pass(0), 4& * i
        Do
            CopyMemory s(0), fkey(i - 1), 4&
            fkey(i) = fkey(i - 5) Xor (Te4(s(0)) And &HFF000000) _
                                  Xor (Te4(s(3)) And &HFF0000) _
                                  Xor (Te4(s(2)) And &HFF00&) _
                                  Xor (Te4(s(1)) And &HFF&) _
                                  Xor rco(j)
            fkey(i + 1) = fkey(i - 4) Xor fkey(i)
            fkey(i + 2) = fkey(i - 3) Xor fkey(i + 1)
            If j = 14 Then Exit Do
            fkey(i + 3) = fkey(i - 2) Xor fkey(i + 2)
            fkey(i + 4) = fkey(i - 1) Xor fkey(i + 3)
            i = i + 5
            j = j + 1
        Loop
        Nr = 12
'Debug.Assert i + 3 = (Nr + 1) * 6
#End If
    Case 192
        i = 6
        CopyMemory fkey(0), pass(0), 4& * i
        For j = 0 To 11
            CopyMemory s(0), fkey(i - 1), 4&
            fkey(i) = fkey(i - 6) Xor (Te4(s(0)) And &HFF000000) _
                                  Xor (Te4(s(3)) And &HFF0000) _
                                  Xor (Te4(s(2)) And &HFF00&) _
                                  Xor (Te4(s(1)) And &HFF&) _
                                  Xor rco(j)
            fkey(i + 1) = fkey(i - 5) Xor fkey(i)
            fkey(i + 2) = fkey(i - 4) Xor fkey(i + 1)
            fkey(i + 3) = fkey(i - 3) Xor fkey(i + 2)
            fkey(i + 4) = fkey(i - 2) Xor fkey(i + 3)
            fkey(i + 5) = fkey(i - 1) Xor fkey(i + 4)
            i = i + 6
        Next j
        Nr = 12
'Debug.Assert i = (Nr + 1) * 6
#If SUPPORT_LEVEL = 2 Then
    Case 224 '(Nr+1)*Nb/Nk  (when to exit)
        i = 7
        CopyMemory fkey(0), pass(0), 4& * i
        For j = 0 To 10
            CopyMemory s(0), fkey(i - 1), 4&
            fkey(i) = fkey(i - 7) Xor (Te4(s(0)) And &HFF000000) _
                                  Xor (Te4(s(3)) And &HFF0000) _
                                  Xor (Te4(s(2)) And &HFF00&) _
                                  Xor (Te4(s(1)) And &HFF&) _
                                  Xor rco(j)
            fkey(i + 1) = fkey(i - 6) Xor fkey(i)
            fkey(i + 2) = fkey(i - 5) Xor fkey(i + 1)
            fkey(i + 3) = fkey(i - 4) Xor fkey(i + 2)
            CopyMemory s(0), fkey(i + 3), 4&
            fkey(i + 4) = fkey(i - 3) Xor (Te4(s(3)) And &HFF000000) _
                                      Xor (Te4(s(2)) And &HFF0000) _
                                      Xor (Te4(s(1)) And &HFF00&) _
                                      Xor (Te4(s(0)) And &HFF&)
            fkey(i + 5) = fkey(i - 2) Xor fkey(i + 4)
            fkey(i + 6) = fkey(i - 1) Xor fkey(i + 5)
            i = i + 7
        Next j
        Nr = 13
'Debug.Assert i = (Nr + 1) * 6
#End If
    Case 256
        i = 8
        j = 0
        CopyMemory fkey(0), pass(0), 4& * i
        Do
            CopyMemory s(0), fkey(i - 1), 4&
            fkey(i) = fkey(i - 8) Xor (Te4(s(0)) And &HFF000000) _
                                  Xor (Te4(s(3)) And &HFF0000) _
                                  Xor (Te4(s(2)) And &HFF00&) _
                                  Xor (Te4(s(1)) And &HFF&) _
                                  Xor rco(j)
            fkey(i + 1) = fkey(i - 7) Xor fkey(i)
            If j = 10 Then Exit Do
            fkey(i + 2) = fkey(i - 6) Xor fkey(i + 1)
            fkey(i + 3) = fkey(i - 5) Xor fkey(i + 2)
            CopyMemory s(0), fkey(i + 3), 4&
            fkey(i + 4) = fkey(i - 4) Xor (Te4(s(3)) And &HFF000000) _
                                      Xor (Te4(s(2)) And &HFF0000) _
                                      Xor (Te4(s(1)) And &HFF00&) _
                                      Xor (Te4(s(0)) And &HFF&)
            fkey(i + 5) = fkey(i - 3) Xor fkey(i + 4)
            fkey(i + 6) = fkey(i - 2) Xor fkey(i + 5)
            fkey(i + 7) = fkey(i - 1) Xor fkey(i + 6)
            i = i + 8
            j = j + 1
        Loop
        Nr = 14
'Debug.Assert i + 2 = (Nr + 1) * 6
    Case Else
        Err.Raise 1, , "cRijndael.SetCipherKey - Illegal KeyBits Value"
        SetCipherKey = 1
        Exit Function
    End Select
    CreateDecryptionKeys 6

#If SUPPORT_LEVEL = 2 Then
    Case 224

    '224 bit block size
    Select Case KeyBits
    Case 128
        i = 4
        j = 0
        CopyMemory fkey(0), pass(0), 4& * i
        Do
            CopyMemory s(0), fkey(i - 1), 4&
            fkey(i) = fkey(i - 4) Xor (Te4(s(0)) And &HFF000000) _
                                  Xor (Te4(s(3)) And &HFF0000) _
                                  Xor (Te4(s(2)) And &HFF00&) _
                                  Xor (Te4(s(1)) And &HFF&) _
                                  Xor rco(j)
            fkey(i + 1) = fkey(i - 3) Xor fkey(i)
            If j = 23 Then Exit Do
            fkey(i + 2) = fkey(i - 2) Xor fkey(i + 1)
            fkey(i + 3) = fkey(i - 1) Xor fkey(i + 2)
            i = i + 4
            j = j + 1
        Loop
        Nr = 13
'Debug.Assert i + 2 = (Nr + 1) * 7
    Case 160
        i = 5
        j = 0
        CopyMemory fkey(0), pass(0), 4& * i
        Do
            CopyMemory s(0), fkey(i - 1), 4&
            fkey(i) = fkey(i - 5) Xor (Te4(s(0)) And &HFF000000) _
                                  Xor (Te4(s(3)) And &HFF0000) _
                                  Xor (Te4(s(2)) And &HFF00&) _
                                  Xor (Te4(s(1)) And &HFF&) _
                                  Xor rco(j)
            fkey(i + 1) = fkey(i - 4) Xor fkey(i)
            fkey(i + 2) = fkey(i - 3) Xor fkey(i + 1)
            If j = 18 Then Exit Do
            fkey(i + 3) = fkey(i - 2) Xor fkey(i + 2)
            fkey(i + 4) = fkey(i - 1) Xor fkey(i + 3)
            i = i + 5
            j = j + 1
        Loop
        Nr = 13
'Debug.Assert i + 3 = (Nr + 1) * 7
    Case 192
        i = 6
        j = 0
        CopyMemory fkey(0), pass(0), 4& * i
        Do
            CopyMemory s(0), fkey(i - 1), 4&
            fkey(i) = fkey(i - 6) Xor (Te4(s(0)) And &HFF000000) _
                                  Xor (Te4(s(3)) And &HFF0000) _
                                  Xor (Te4(s(2)) And &HFF00&) _
                                  Xor (Te4(s(1)) And &HFF&) _
                                  Xor rco(j)
            fkey(i + 1) = fkey(i - 5) Xor fkey(i)
            If j = 15 Then Exit Do
            fkey(i + 2) = fkey(i - 4) Xor fkey(i + 1)
            fkey(i + 3) = fkey(i - 3) Xor fkey(i + 2)
            fkey(i + 4) = fkey(i - 2) Xor fkey(i + 3)
            fkey(i + 5) = fkey(i - 1) Xor fkey(i + 4)
            i = i + 6
            j = j + 1
        Loop
        Nr = 13
'Debug.Assert i + 2 = (Nr + 1) * 7
    Case 224
        i = 7
        CopyMemory fkey(0), pass(0), 4& * i
        For j = 0 To 12
            CopyMemory s(0), fkey(i - 1), 4&
            fkey(i) = fkey(i - 7) Xor (Te4(s(0)) And &HFF000000) _
                                  Xor (Te4(s(3)) And &HFF0000) _
                                  Xor (Te4(s(2)) And &HFF00&) _
                                  Xor (Te4(s(1)) And &HFF&) _
                                  Xor rco(j)
            fkey(i + 1) = fkey(i - 6) Xor fkey(i)
            fkey(i + 2) = fkey(i - 5) Xor fkey(i + 1)
            fkey(i + 3) = fkey(i - 4) Xor fkey(i + 2)
            CopyMemory s(0), fkey(i + 3), 4&
            fkey(i + 4) = fkey(i - 3) Xor (Te4(s(3)) And &HFF000000) _
                                      Xor (Te4(s(2)) And &HFF0000) _
                                      Xor (Te4(s(1)) And &HFF00&) _
                                      Xor (Te4(s(0)) And &HFF&)
            fkey(i + 5) = fkey(i - 2) Xor fkey(i + 4)
            fkey(i + 6) = fkey(i - 1) Xor fkey(i + 5)
            i = i + 7
        Next j
        Nr = 13
'Debug.Assert i = (Nr + 1) * 7
    Case 256
        i = 8
        j = 0
        CopyMemory fkey(0), pass(0), 4& * i
        Do
            CopyMemory s(0), fkey(i - 1), 4&
            fkey(i) = fkey(i - 8) Xor (Te4(s(0)) And &HFF000000) _
                                  Xor (Te4(s(3)) And &HFF0000) _
                                  Xor (Te4(s(2)) And &HFF00&) _
                                  Xor (Te4(s(1)) And &HFF&) _
                                  Xor rco(j)
            If j = 12 Then Exit Do
            fkey(i + 1) = fkey(i - 7) Xor fkey(i)
            fkey(i + 2) = fkey(i - 6) Xor fkey(i + 1)
            fkey(i + 3) = fkey(i - 5) Xor fkey(i + 2)
            CopyMemory s(0), fkey(i + 3), 4&
            fkey(i + 4) = fkey(i - 4) Xor (Te4(s(3)) And &HFF000000) _
                                      Xor (Te4(s(2)) And &HFF0000) _
                                      Xor (Te4(s(1)) And &HFF00&) _
                                      Xor (Te4(s(0)) And &HFF&)
            fkey(i + 5) = fkey(i - 3) Xor fkey(i + 4)
            fkey(i + 6) = fkey(i - 2) Xor fkey(i + 5)
            fkey(i + 7) = fkey(i - 1) Xor fkey(i + 6)
            i = i + 8
            j = j + 1
        Loop
        Nr = 14
'Debug.Assert i + 1 = (Nr + 1) * 7
    Case Else
        Err.Raise 1, , "cRijndael.SetCipherKey - Illegal KeyBits Value"
        SetCipherKey = 1
        Exit Function
    End Select
    CreateDecryptionKeys 7
#End If

    Case 256

    '256 bit block size
    Select Case KeyBits
    Case 128
        i = 4
        CopyMemory fkey(0), pass(0), 4& * i
        For j = 0 To 28
            CopyMemory s(0), fkey(i - 1), 4&
            fkey(i) = fkey(i - 4) Xor (Te4(s(0)) And &HFF000000) _
                                  Xor (Te4(s(3)) And &HFF0000) _
                                  Xor (Te4(s(2)) And &HFF00&) _
                                  Xor (Te4(s(1)) And &HFF&) _
                                  Xor rco(j)
            fkey(i + 1) = fkey(i - 3) Xor fkey(i)
            fkey(i + 2) = fkey(i - 2) Xor fkey(i + 1)
            fkey(i + 3) = fkey(i - 1) Xor fkey(i + 2)
            i = i + 4
        Next j
        Nr = 14
'Debug.Assert i = (Nr + 1) * 8
#If SUPPORT_LEVEL = 2 Then
    Case 160
        i = 5
        CopyMemory fkey(0), pass(0), 4& * i
        For j = 0 To 22
            CopyMemory s(0), fkey(i - 1), 4&
            fkey(i) = fkey(i - 5) Xor (Te4(s(0)) And &HFF000000) _
                                  Xor (Te4(s(3)) And &HFF0000) _
                                  Xor (Te4(s(2)) And &HFF00&) _
                                  Xor (Te4(s(1)) And &HFF&) _
                                  Xor rco(j)
            fkey(i + 1) = fkey(i - 4) Xor fkey(i)
            fkey(i + 2) = fkey(i - 3) Xor fkey(i + 1)
            fkey(i + 3) = fkey(i - 2) Xor fkey(i + 2)
            fkey(i + 4) = fkey(i - 1) Xor fkey(i + 3)
            i = i + 5
        Next j
        Nr = 14
'Debug.Assert i = (Nr + 1) * 8
#End If
    Case 192
        i = 6
        CopyMemory fkey(0), pass(0), 4& * i
        For j = 0 To 18
            CopyMemory s(0), fkey(i - 1), 4&
            fkey(i) = fkey(i - 6) Xor (Te4(s(0)) And &HFF000000) _
                                  Xor (Te4(s(3)) And &HFF0000) _
                                  Xor (Te4(s(2)) And &HFF00&) _
                                  Xor (Te4(s(1)) And &HFF&) _
                                  Xor rco(j)
            fkey(i + 1) = fkey(i - 5) Xor fkey(i)
            fkey(i + 2) = fkey(i - 4) Xor fkey(i + 1)
            fkey(i + 3) = fkey(i - 3) Xor fkey(i + 2)
            fkey(i + 4) = fkey(i - 2) Xor fkey(i + 3)
            fkey(i + 5) = fkey(i - 1) Xor fkey(i + 4)
            i = i + 6
        Next j
        Nr = 14
'Debug.Assert i = (Nr + 1) * 8
#If SUPPORT_LEVEL = 2 Then
    Case 224
        i = 7
        j = 0
        CopyMemory fkey(0), pass(0), 4& * i
        Do
            CopyMemory s(0), fkey(i - 1), 4&
            fkey(i) = fkey(i - 7) Xor (Te4(s(0)) And &HFF000000) _
                                  Xor (Te4(s(3)) And &HFF0000) _
                                  Xor (Te4(s(2)) And &HFF00&) _
                                  Xor (Te4(s(1)) And &HFF&) _
                                  Xor rco(j)
            If j = 16 Then Exit Do
            fkey(i + 1) = fkey(i - 6) Xor fkey(i)
            fkey(i + 2) = fkey(i - 5) Xor fkey(i + 1)
            fkey(i + 3) = fkey(i - 4) Xor fkey(i + 2)
            CopyMemory s(0), fkey(i + 3), 4&
            fkey(i + 4) = fkey(i - 3) Xor (Te4(s(3)) And &HFF000000) _
                                      Xor (Te4(s(2)) And &HFF0000) _
                                      Xor (Te4(s(1)) And &HFF00&) _
                                      Xor (Te4(s(0)) And &HFF&)
            fkey(i + 5) = fkey(i - 2) Xor fkey(i + 4)
            fkey(i + 6) = fkey(i - 1) Xor fkey(i + 5)
            i = i + 7
            j = j + 1
        Loop
        Nr = 14
'Debug.Assert i + 1 = (Nr + 1) * 8
#End If
    Case 256
        i = 8
        CopyMemory fkey(0), pass(0), 4& * i
        For j = 0 To 13
            CopyMemory s(0), fkey(i - 1), 4&
            fkey(i) = fkey(i - 8) Xor (Te4(s(0)) And &HFF000000) _
                                  Xor (Te4(s(3)) And &HFF0000) _
                                  Xor (Te4(s(2)) And &HFF00&) _
                                  Xor (Te4(s(1)) And &HFF&) _
                                  Xor rco(j)
            fkey(i + 1) = fkey(i - 7) Xor fkey(i)
            fkey(i + 2) = fkey(i - 6) Xor fkey(i + 1)
            fkey(i + 3) = fkey(i - 5) Xor fkey(i + 2)
            CopyMemory s(0), fkey(i + 3), 4&
            fkey(i + 4) = fkey(i - 4) Xor (Te4(s(3)) And &HFF000000) _
                                      Xor (Te4(s(2)) And &HFF0000) _
                                      Xor (Te4(s(1)) And &HFF00&) _
                                      Xor (Te4(s(0)) And &HFF&)
            fkey(i + 5) = fkey(i - 3) Xor fkey(i + 4)
            fkey(i + 6) = fkey(i - 2) Xor fkey(i + 5)
            fkey(i + 7) = fkey(i - 1) Xor fkey(i + 6)
            i = i + 8
        Next j
        Nr = 14
'Debug.Assert i = (Nr + 1) * 8
    Case Else
        Err.Raise 1, , "cRijndael.SetCipherKey - Illegal KeyBits Value"
        SetCipherKey = 1
        Exit Function
    End Select
    CreateDecryptionKeys 8

    Case Else
        Err.Raise 1, , "cRijndael.SetCipherKey - Illegal BlockBits Value"
        SetCipherKey = 1
        Exit Function
    End Select
#End If
End Function

#If SUPPORT_LEVEL Then
Public Function SetCipherKeyString(PassPhrase As String, KeyBits As Long, BlockBits As Long) As Long
    Dim pass() As Byte

    pass = StrConv(PassPhrase, vbFromUnicode)
    ReDim Preserve pass(31)
    SetCipherKeyString = SetCipherKey(pass, KeyBits, BlockBits)
End Function
#Else
Public Function SetCipherKeyString(PassPhrase As String, KeyBits As Long) As Long
    Dim pass() As Byte

    pass = StrConv(PassPhrase, vbFromUnicode)
    ReDim Preserve pass(31)
    SetCipherKeyString = SetCipherKey(pass, KeyBits)
End Function
#End If


'Encrypt a 128 bit block.  plaintext(p ... p+15) is input, ciphertext(q ... q+15) is output.
'plaintext and ciphertext can be the same array.  Will crash if ciphertext(q ... q+15) is not allocated.
Public Sub BlockEncrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
    Dim i     As Long
    Dim k     As Long
    Dim t0    As Long
    Dim t1    As Long
    Dim t2    As Long
    Dim t3    As Long
    Dim s(15) As Byte

    CopyMemory t0, plaintext(p + 0), 4&
    CopyMemory t1, plaintext(p + 4), 4&
    CopyMemory t2, plaintext(p + 8), 4&
    CopyMemory t3, plaintext(p + 12), 4&
    t0 = t0 Xor fkey(0)
    t1 = t1 Xor fkey(1)
    t2 = t2 Xor fkey(2)
    t3 = t3 Xor fkey(3)
    k = 4

    For i = 1 To Nr - 1 'Nr is number of rounds
        CopyMemory s(0), t0, 4&
        CopyMemory s(4), t1, 4&
        CopyMemory s(8), t2, 4&
        CopyMemory s(12), t3, 4&
        t0 = Te0(s(0)) Xor Te1(s(5)) Xor Te2(s(10)) Xor Te3(s(15)) Xor fkey(k + 0)
        t1 = Te0(s(4)) Xor Te1(s(9)) Xor Te2(s(14)) Xor Te3(s(3)) Xor fkey(k + 1)
        t2 = Te0(s(8)) Xor Te1(s(13)) Xor Te2(s(2)) Xor Te3(s(7)) Xor fkey(k + 2)
        t3 = Te0(s(12)) Xor Te1(s(1)) Xor Te2(s(6)) Xor Te3(s(11)) Xor fkey(k + 3)
        k = k + 4
    Next i

    'Final round
    CopyMemory s(0), t0, 4&
    CopyMemory s(4), t1, 4&
    CopyMemory s(8), t2, 4&
    CopyMemory s(12), t3, 4&
    t0 = (Te4(s(0)) And &HFF&) Xor (Te4(s(5)) And &HFF00&) Xor (Te4(s(10)) And &HFF0000) Xor (Te4(s(15)) And &HFF000000) Xor fkey(k + 0)
    t1 = (Te4(s(4)) And &HFF&) Xor (Te4(s(9)) And &HFF00&) Xor (Te4(s(14)) And &HFF0000) Xor (Te4(s(3)) And &HFF000000) Xor fkey(k + 1)
    t2 = (Te4(s(8)) And &HFF&) Xor (Te4(s(13)) And &HFF00&) Xor (Te4(s(2)) And &HFF0000) Xor (Te4(s(7)) And &HFF000000) Xor fkey(k + 2)
    t3 = (Te4(s(12)) And &HFF&) Xor (Te4(s(1)) And &HFF00&) Xor (Te4(s(6)) And &HFF0000) Xor (Te4(s(11)) And &HFF000000) Xor fkey(k + 3)
    CopyMemory ciphertext(q + 0), t0, 4&
    CopyMemory ciphertext(q + 4), t1, 4&
    CopyMemory ciphertext(q + 8), t2, 4&
    CopyMemory ciphertext(q + 12), t3, 4&
End Sub

'Decrypt a 128 bit block.  ciphertext(q ... q+15) is input, plaintext(p ... p+15) is output.
'plaintext and ciphertext can be the same array.  Will crash if plaintext(p ... p+15) is not allocated.
Public Sub BlockDecrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
    Dim i     As Long
    Dim k     As Long
    Dim t0    As Long
    Dim t1    As Long
    Dim t2    As Long
    Dim t3    As Long
    Dim s(15) As Byte

    CopyMemory t0, ciphertext(q + 0), 4&
    CopyMemory t1, ciphertext(q + 4), 4&
    CopyMemory t2, ciphertext(q + 8), 4&
    CopyMemory t3, ciphertext(q + 12), 4&
    t0 = t0 Xor rkey(0)
    t1 = t1 Xor rkey(1)
    t2 = t2 Xor rkey(2)
    t3 = t3 Xor rkey(3)
    k = 4

    For i = 1 To Nr - 1 'Nr is number of rounds
        CopyMemory s(0), t0, 4&
        CopyMemory s(4), t1, 4&
        CopyMemory s(8), t2, 4&
        CopyMemory s(12), t3, 4&
        t0 = Td0(s(0)) Xor Td1(s(13)) Xor Td2(s(10)) Xor Td3(s(7)) Xor rkey(k + 0)
        t1 = Td0(s(4)) Xor Td1(s(1)) Xor Td2(s(14)) Xor Td3(s(11)) Xor rkey(k + 1)
        t2 = Td0(s(8)) Xor Td1(s(5)) Xor Td2(s(2)) Xor Td3(s(15)) Xor rkey(k + 2)
        t3 = Td0(s(12)) Xor Td1(s(9)) Xor Td2(s(6)) Xor Td3(s(3)) Xor rkey(k + 3)
        k = k + 4
    Next i

    'Final round
    CopyMemory s(0), t0, 4&
    CopyMemory s(4), t1, 4&
    CopyMemory s(8), t2, 4&
    CopyMemory s(12), t3, 4&
    t0 = (Td4(s(0)) And &HFF&) Xor (Td4(s(13)) And &HFF00&) Xor (Td4(s(10)) And &HFF0000) Xor (Td4(s(7)) And &HFF000000) Xor rkey(k + 0)
    t1 = (Td4(s(4)) And &HFF&) Xor (Td4(s(1)) And &HFF00&) Xor (Td4(s(14)) And &HFF0000) Xor (Td4(s(11)) And &HFF000000) Xor rkey(k + 1)
    t2 = (Td4(s(8)) And &HFF&) Xor (Td4(s(5)) And &HFF00&) Xor (Td4(s(2)) And &HFF0000) Xor (Td4(s(15)) And &HFF000000) Xor rkey(k + 2)
    t3 = (Td4(s(12)) And &HFF&) Xor (Td4(s(9)) And &HFF00&) Xor (Td4(s(6)) And &HFF0000) Xor (Td4(s(3)) And &HFF000000) Xor rkey(k + 3)
    CopyMemory plaintext(p + 0), t0, 4&
    CopyMemory plaintext(p + 4), t1, 4&
    CopyMemory plaintext(p + 8), t2, 4&
    CopyMemory plaintext(p + 12), t3, 4&
End Sub

#If SUPPORT_LEVEL Then
#If SUPPORT_LEVEL = 2 Then
'Encrypt a 160 bit block.  plaintext(p ... p+19) is input, ciphertext(q ... q+19) is output.
'plaintext and ciphertext can be the same array.  Will crash if ciphertext(q ... q+19) is not allocated.
Public Sub Block160Encrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
    Dim i     As Long
    Dim k     As Long
    Dim t0    As Long
    Dim t1    As Long
    Dim t2    As Long
    Dim t3    As Long
    Dim t4    As Long
    Dim s(19) As Byte

    CopyMemory t0, plaintext(p + 0), 4&
    CopyMemory t1, plaintext(p + 4), 4&
    CopyMemory t2, plaintext(p + 8), 4&
    CopyMemory t3, plaintext(p + 12), 4&
    CopyMemory t4, plaintext(p + 16), 4&
    t0 = t0 Xor fkey(0)
    t1 = t1 Xor fkey(1)
    t2 = t2 Xor fkey(2)
    t3 = t3 Xor fkey(3)
    t4 = t4 Xor fkey(4)
    k = 5

    For i = 1 To Nr - 1 'Nr is number of rounds
        CopyMemory s(0), t0, 4&
        CopyMemory s(4), t1, 4&
        CopyMemory s(8), t2, 4&
        CopyMemory s(12), t3, 4&
        CopyMemory s(16), t4, 4&
        t0 = Te0(s(0)) Xor Te1(s(5)) Xor Te2(s(10)) Xor Te3(s(15)) Xor fkey(k + 0)
        t1 = Te0(s(4)) Xor Te1(s(9)) Xor Te2(s(14)) Xor Te3(s(19)) Xor fkey(k + 1)
        t2 = Te0(s(8)) Xor Te1(s(13)) Xor Te2(s(18)) Xor Te3(s(3)) Xor fkey(k + 2)
        t3 = Te0(s(12)) Xor Te1(s(17)) Xor Te2(s(2)) Xor Te3(s(7)) Xor fkey(k + 3)
        t4 = Te0(s(16)) Xor Te1(s(1)) Xor Te2(s(6)) Xor Te3(s(11)) Xor fkey(k + 4)
        k = k + 5
    Next i

    'Final round
    CopyMemory s(0), t0, 4&
    CopyMemory s(4), t1, 4&
    CopyMemory s(8), t2, 4&
    CopyMemory s(12), t3, 4&
    CopyMemory s(16), t4, 4&
    t0 = (Te4(s(0)) And &HFF&) Xor (Te4(s(5)) And &HFF00&) Xor (Te4(s(10)) And &HFF0000) Xor (Te4(s(15)) And &HFF000000) Xor fkey(k + 0)
    t1 = (Te4(s(4)) And &HFF&) Xor (Te4(s(9)) And &HFF00&) Xor (Te4(s(14)) And &HFF0000) Xor (Te4(s(19)) And &HFF000000) Xor fkey(k + 1)
    t2 = (Te4(s(8)) And &HFF&) Xor (Te4(s(13)) And &HFF00&) Xor (Te4(s(18)) And &HFF0000) Xor (Te4(s(3)) And &HFF000000) Xor fkey(k + 2)
    t3 = (Te4(s(12)) And &HFF&) Xor (Te4(s(17)) And &HFF00&) Xor (Te4(s(2)) And &HFF0000) Xor (Te4(s(7)) And &HFF000000) Xor fkey(k + 3)
    t4 = (Te4(s(16)) And &HFF&) Xor (Te4(s(1)) And &HFF00&) Xor (Te4(s(6)) And &HFF0000) Xor (Te4(s(11)) And &HFF000000) Xor fkey(k + 4)
    CopyMemory ciphertext(q + 0), t0, 4&
    CopyMemory ciphertext(q + 4), t1, 4&
    CopyMemory ciphertext(q + 8), t2, 4&
    CopyMemory ciphertext(q + 12), t3, 4&
    CopyMemory ciphertext(q + 16), t4, 4&
End Sub

'Decrypt a 160 bit block.  ciphertext(q ... q+19) is input, plaintext(p ... p+19) is output.
'plaintext and ciphertext can be the same array.  Will crash if plaintext(p ... p+19) is not allocated.
Public Sub Block160Decrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
    Dim i     As Long
    Dim k     As Long
    Dim t0    As Long
    Dim t1    As Long
    Dim t2    As Long
    Dim t3    As Long
    Dim t4    As Long
    Dim s(19) As Byte

    CopyMemory t0, ciphertext(q + 0), 4&
    CopyMemory t1, ciphertext(q + 4), 4&
    CopyMemory t2, ciphertext(q + 8), 4&
    CopyMemory t3, ciphertext(q + 12), 4&
    CopyMemory t4, ciphertext(q + 16), 4&
    t0 = t0 Xor rkey(0)
    t1 = t1 Xor rkey(1)
    t2 = t2 Xor rkey(2)
    t3 = t3 Xor rkey(3)
    t4 = t4 Xor rkey(4)
    k = 5

    For i = 1 To Nr - 1 'Nr is number of rounds
        CopyMemory s(0), t0, 4&
        CopyMemory s(4), t1, 4&
        CopyMemory s(8), t2, 4&
        CopyMemory s(12), t3, 4&
        CopyMemory s(16), t4, 4&
        t0 = Td0(s(0)) Xor Td1(s(17)) Xor Td2(s(14)) Xor Td3(s(11)) Xor rkey(k + 0)
        t1 = Td0(s(4)) Xor Td1(s(1)) Xor Td2(s(18)) Xor Td3(s(15)) Xor rkey(k + 1)
        t2 = Td0(s(8)) Xor Td1(s(5)) Xor Td2(s(2)) Xor Td3(s(19)) Xor rkey(k + 2)
        t3 = Td0(s(12)) Xor Td1(s(9)) Xor Td2(s(6)) Xor Td3(s(3)) Xor rkey(k + 3)
        t4 = Td0(s(16)) Xor Td1(s(13)) Xor Td2(s(10)) Xor Td3(s(7)) Xor rkey(k + 4)
        k = k + 5
    Next i

    'Final round
    CopyMemory s(0), t0, 4&
    CopyMemory s(4), t1, 4&
    CopyMemory s(8), t2, 4&
    CopyMemory s(12), t3, 4&
    CopyMemory s(16), t4, 4&
    t0 = (Td4(s(0)) And &HFF&) Xor (Td4(s(17)) And &HFF00&) Xor (Td4(s(14)) And &HFF0000) Xor (Td4(s(11)) And &HFF000000) Xor rkey(k + 0)
    t1 = (Td4(s(4)) And &HFF&) Xor (Td4(s(1)) And &HFF00&) Xor (Td4(s(18)) And &HFF0000) Xor (Td4(s(15)) And &HFF000000) Xor rkey(k + 1)
    t2 = (Td4(s(8)) And &HFF&) Xor (Td4(s(5)) And &HFF00&) Xor (Td4(s(2)) And &HFF0000) Xor (Td4(s(19)) And &HFF000000) Xor rkey(k + 2)
    t3 = (Td4(s(12)) And &HFF&) Xor (Td4(s(9)) And &HFF00&) Xor (Td4(s(6)) And &HFF0000) Xor (Td4(s(3)) And &HFF000000) Xor rkey(k + 3)
    t4 = (Td4(s(16)) And &HFF&) Xor (Td4(s(13)) And &HFF00&) Xor (Td4(s(10)) And &HFF0000) Xor (Td4(s(7)) And &HFF000000) Xor rkey(k + 4)
    CopyMemory plaintext(p + 0), t0, 4&
    CopyMemory plaintext(p + 4), t1, 4&
    CopyMemory plaintext(p + 8), t2, 4&
    CopyMemory plaintext(p + 12), t3, 4&
    CopyMemory plaintext(p + 16), t4, 4&
End Sub
#End If

'Encrypt a 192 bit block.  plaintext(p ... p+23) is input, ciphertext(q ... q+23) is output.
'plaintext and ciphertext can be the same array.  Will crash if ciphertext(q ... q+23) is not allocated.
Public Sub Block192Encrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
    Dim i     As Long
    Dim k     As Long
    Dim t0    As Long
    Dim t1    As Long
    Dim t2    As Long
    Dim t3    As Long
    Dim t4    As Long
    Dim t5    As Long
    Dim s(23) As Byte

    CopyMemory t0, plaintext(p + 0), 4&
    CopyMemory t1, plaintext(p + 4), 4&
    CopyMemory t2, plaintext(p + 8), 4&
    CopyMemory t3, plaintext(p + 12), 4&
    CopyMemory t4, plaintext(p + 16), 4&
    CopyMemory t5, plaintext(p + 20), 4&
    t0 = t0 Xor fkey(0)
    t1 = t1 Xor fkey(1)
    t2 = t2 Xor fkey(2)
    t3 = t3 Xor fkey(3)
    t4 = t4 Xor fkey(4)
    t5 = t5 Xor fkey(5)
    k = 6

    For i = 1 To Nr - 1 'Nr is number of rounds
        CopyMemory s(0), t0, 4&
        CopyMemory s(4), t1, 4&
        CopyMemory s(8), t2, 4&
        CopyMemory s(12), t3, 4&
        CopyMemory s(16), t4, 4&
        CopyMemory s(20), t5, 4&
        t0 = Te0(s(0)) Xor Te1(s(5)) Xor Te2(s(10)) Xor Te3(s(15)) Xor fkey(k + 0)
        t1 = Te0(s(4)) Xor Te1(s(9)) Xor Te2(s(14)) Xor Te3(s(19)) Xor fkey(k + 1)
        t2 = Te0(s(8)) Xor Te1(s(13)) Xor Te2(s(18)) Xor Te3(s(23)) Xor fkey(k + 2)
        t3 = Te0(s(12)) Xor Te1(s(17)) Xor Te2(s(22)) Xor Te3(s(3)) Xor fkey(k + 3)
        t4 = Te0(s(16)) Xor Te1(s(21)) Xor Te2(s(2)) Xor Te3(s(7)) Xor fkey(k + 4)
        t5 = Te0(s(20)) Xor Te1(s(1)) Xor Te2(s(6)) Xor Te3(s(11)) Xor fkey(k + 5)
        k = k + 6
    Next i

    'Final round
    CopyMemory s(0), t0, 4&
    CopyMemory s(4), t1, 4&
    CopyMemory s(8), t2, 4&
    CopyMemory s(12), t3, 4&
    CopyMemory s(16), t4, 4&
    CopyMemory s(20), t5, 4&
    t0 = (Te4(s(0)) And &HFF&) Xor (Te4(s(5)) And &HFF00&) Xor (Te4(s(10)) And &HFF0000) Xor (Te4(s(15)) And &HFF000000) Xor fkey(k + 0)
    t1 = (Te4(s(4)) And &HFF&) Xor (Te4(s(9)) And &HFF00&) Xor (Te4(s(14)) And &HFF0000) Xor (Te4(s(19)) And &HFF000000) Xor fkey(k + 1)
    t2 = (Te4(s(8)) And &HFF&) Xor (Te4(s(13)) And &HFF00&) Xor (Te4(s(18)) And &HFF0000) Xor (Te4(s(23)) And &HFF000000) Xor fkey(k + 2)
    t3 = (Te4(s(12)) And &HFF&) Xor (Te4(s(17)) And &HFF00&) Xor (Te4(s(22)) And &HFF0000) Xor (Te4(s(3)) And &HFF000000) Xor fkey(k + 3)
    t4 = (Te4(s(16)) And &HFF&) Xor (Te4(s(21)) And &HFF00&) Xor (Te4(s(2)) And &HFF0000) Xor (Te4(s(7)) And &HFF000000) Xor fkey(k + 4)
    t5 = (Te4(s(20)) And &HFF&) Xor (Te4(s(1)) And &HFF00&) Xor (Te4(s(6)) And &HFF0000) Xor (Te4(s(11)) And &HFF000000) Xor fkey(k + 5)

    CopyMemory ciphertext(q + 0), t0, 4&
    CopyMemory ciphertext(q + 4), t1, 4&
    CopyMemory ciphertext(q + 8), t2, 4&
    CopyMemory ciphertext(q + 12), t3, 4&
    CopyMemory ciphertext(q + 16), t4, 4&
    CopyMemory ciphertext(q + 20), t5, 4&
End Sub

'Decrypt a 192 bit block.  ciphertext(q ... q+23) is input, plaintext(p ... p+23) is output.
'plaintext and ciphertext can be the same array.  Will crash if plaintext(p ... p+23) is not allocated.
Public Sub Block192Decrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
    Dim i     As Long
    Dim k     As Long
    Dim t0    As Long
    Dim t1    As Long
    Dim t2    As Long
    Dim t3    As Long
    Dim t4    As Long
    Dim t5    As Long
    Dim s(23) As Byte

    CopyMemory t0, ciphertext(q + 0), 4&
    CopyMemory t1, ciphertext(q + 4), 4&
    CopyMemory t2, ciphertext(q + 8), 4&
    CopyMemory t3, ciphertext(q + 12), 4&
    CopyMemory t4, ciphertext(q + 16), 4&
    CopyMemory t5, ciphertext(q + 20), 4&
    t0 = t0 Xor rkey(0)
    t1 = t1 Xor rkey(1)
    t2 = t2 Xor rkey(2)
    t3 = t3 Xor rkey(3)
    t4 = t4 Xor rkey(4)
    t5 = t5 Xor rkey(5)
    k = 6

    For i = 1 To Nr - 1 'Nr is number of rounds
        CopyMemory s(0), t0, 4&
        CopyMemory s(4), t1, 4&
        CopyMemory s(8), t2, 4&
        CopyMemory s(12), t3, 4&
        CopyMemory s(16), t4, 4&
        CopyMemory s(20), t5, 4&
        t0 = Td0(s(0)) Xor Td1(s(21)) Xor Td2(s(18)) Xor Td3(s(15)) Xor rkey(k + 0)
        t1 = Td0(s(4)) Xor Td1(s(1)) Xor Td2(s(22)) Xor Td3(s(19)) Xor rkey(k + 1)
        t2 = Td0(s(8)) Xor Td1(s(5)) Xor Td2(s(2)) Xor Td3(s(23)) Xor rkey(k + 2)
        t3 = Td0(s(12)) Xor Td1(s(9)) Xor Td2(s(6)) Xor Td3(s(3)) Xor rkey(k + 3)
        t4 = Td0(s(16)) Xor Td1(s(13)) Xor Td2(s(10)) Xor Td3(s(7)) Xor rkey(k + 4)
        t5 = Td0(s(20)) Xor Td1(s(17)) Xor Td2(s(14)) Xor Td3(s(11)) Xor rkey(k + 5)
        k = k + 6
    Next i

    'Final round
    CopyMemory s(0), t0, 4&
    CopyMemory s(4), t1, 4&
    CopyMemory s(8), t2, 4&
    CopyMemory s(12), t3, 4&
    CopyMemory s(16), t4, 4&
    CopyMemory s(20), t5, 4&
    t0 = (Td4(s(0)) And &HFF&) Xor (Td4(s(21)) And &HFF00&) Xor (Td4(s(18)) And &HFF0000) Xor (Td4(s(15)) And &HFF000000) Xor rkey(k + 0)
    t1 = (Td4(s(4)) And &HFF&) Xor (Td4(s(1)) And &HFF00&) Xor (Td4(s(22)) And &HFF0000) Xor (Td4(s(19)) And &HFF000000) Xor rkey(k + 1)
    t2 = (Td4(s(8)) And &HFF&) Xor (Td4(s(5)) And &HFF00&) Xor (Td4(s(2)) And &HFF0000) Xor (Td4(s(23)) And &HFF000000) Xor rkey(k + 2)
    t3 = (Td4(s(12)) And &HFF&) Xor (Td4(s(9)) And &HFF00&) Xor (Td4(s(6)) And &HFF0000) Xor (Td4(s(3)) And &HFF000000) Xor rkey(k + 3)
    t4 = (Td4(s(16)) And &HFF&) Xor (Td4(s(13)) And &HFF00&) Xor (Td4(s(10)) And &HFF0000) Xor (Td4(s(7)) And &HFF000000) Xor rkey(k + 4)
    t5 = (Td4(s(20)) And &HFF&) Xor (Td4(s(17)) And &HFF00&) Xor (Td4(s(14)) And &HFF0000) Xor (Td4(s(11)) And &HFF000000) Xor rkey(k + 5)
    CopyMemory plaintext(p + 0), t0, 4&
    CopyMemory plaintext(p + 4), t1, 4&
    CopyMemory plaintext(p + 8), t2, 4&
    CopyMemory plaintext(p + 12), t3, 4&
    CopyMemory plaintext(p + 16), t4, 4&
    CopyMemory plaintext(p + 20), t5, 4&
End Sub

#If SUPPORT_LEVEL = 2 Then
'Encrypt a 224 bit block.  plaintext(p ... p+27) is input, ciphertext(q ... q+27) is output.
'plaintext and ciphertext can be the same array.  Will crash if ciphertext(q ... q+27) is not allocated.
Public Sub Block224Encrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
    Dim i     As Long
    Dim k     As Long
    Dim t0    As Long
    Dim t1    As Long
    Dim t2    As Long
    Dim t3    As Long
    Dim t4    As Long
    Dim t5    As Long
    Dim t6    As Long
    Dim s(27) As Byte

    CopyMemory t0, plaintext(p + 0), 4&
    CopyMemory t1, plaintext(p + 4), 4&
    CopyMemory t2, plaintext(p + 8), 4&
    CopyMemory t3, plaintext(p + 12), 4&
    CopyMemory t4, plaintext(p + 16), 4&
    CopyMemory t5, plaintext(p + 20), 4&
    CopyMemory t6, plaintext(p + 24), 4&
    t0 = t0 Xor fkey(0)
    t1 = t1 Xor fkey(1)
    t2 = t2 Xor fkey(2)
    t3 = t3 Xor fkey(3)
    t4 = t4 Xor fkey(4)
    t5 = t5 Xor fkey(5)
    t6 = t6 Xor fkey(6)
    k = 7

    For i = 1 To Nr - 1 'Nr is number of rounds
        CopyMemory s(0), t0, 4&
        CopyMemory s(4), t1, 4&
        CopyMemory s(8), t2, 4&
        CopyMemory s(12), t3, 4&
        CopyMemory s(16), t4, 4&
        CopyMemory s(20), t5, 4&
        CopyMemory s(24), t6, 4&
        t0 = Te0(s(0)) Xor Te1(s(5)) Xor Te2(s(10)) Xor Te3(s(19)) Xor fkey(k + 0)
        t1 = Te0(s(4)) Xor Te1(s(9)) Xor Te2(s(14)) Xor Te3(s(23)) Xor fkey(k + 1)
        t2 = Te0(s(8)) Xor Te1(s(13)) Xor Te2(s(18)) Xor Te3(s(27)) Xor fkey(k + 2)
        t3 = Te0(s(12)) Xor Te1(s(17)) Xor Te2(s(22)) Xor Te3(s(3)) Xor fkey(k + 3)
        t4 = Te0(s(16)) Xor Te1(s(21)) Xor Te2(s(26)) Xor Te3(s(7)) Xor fkey(k + 4)
        t5 = Te0(s(20)) Xor Te1(s(25)) Xor Te2(s(2)) Xor Te3(s(11)) Xor fkey(k + 5)
        t6 = Te0(s(24)) Xor Te1(s(1)) Xor Te2(s(6)) Xor Te3(s(15)) Xor fkey(k + 6)
        k = k + 7
    Next i

    'Final round
    CopyMemory s(0), t0, 4&
    CopyMemory s(4), t1, 4&
    CopyMemory s(8), t2, 4&
    CopyMemory s(12), t3, 4&
    CopyMemory s(16), t4, 4&
    CopyMemory s(20), t5, 4&
    CopyMemory s(24), t6, 4&
    t0 = (Te4(s(0)) And &HFF&) Xor (Te4(s(5)) And &HFF00&) Xor (Te4(s(10)) And &HFF0000) Xor (Te4(s(19)) And &HFF000000) Xor fkey(k + 0)
    t1 = (Te4(s(4)) And &HFF&) Xor (Te4(s(9)) And &HFF00&) Xor (Te4(s(14)) And &HFF0000) Xor (Te4(s(23)) And &HFF000000) Xor fkey(k + 1)
    t2 = (Te4(s(8)) And &HFF&) Xor (Te4(s(13)) And &HFF00&) Xor (Te4(s(18)) And &HFF0000) Xor (Te4(s(27)) And &HFF000000) Xor fkey(k + 2)
    t3 = (Te4(s(12)) And &HFF&) Xor (Te4(s(17)) And &HFF00&) Xor (Te4(s(22)) And &HFF0000) Xor (Te4(s(3)) And &HFF000000) Xor fkey(k + 3)
    t4 = (Te4(s(16)) And &HFF&) Xor (Te4(s(21)) And &HFF00&) Xor (Te4(s(26)) And &HFF0000) Xor (Te4(s(7)) And &HFF000000) Xor fkey(k + 4)
    t5 = (Te4(s(20)) And &HFF&) Xor (Te4(s(25)) And &HFF00&) Xor (Te4(s(2)) And &HFF0000) Xor (Te4(s(11)) And &HFF000000) Xor fkey(k + 5)
    t6 = (Te4(s(24)) And &HFF&) Xor (Te4(s(1)) And &HFF00&) Xor (Te4(s(6)) And &HFF0000) Xor (Te4(s(15)) And &HFF000000) Xor fkey(k + 6)
    CopyMemory ciphertext(q + 0), t0, 4&
    CopyMemory ciphertext(q + 4), t1, 4&
    CopyMemory ciphertext(q + 8), t2, 4&
    CopyMemory ciphertext(q + 12), t3, 4&
    CopyMemory ciphertext(q + 16), t4, 4&
    CopyMemory ciphertext(q + 20), t5, 4&
    CopyMemory ciphertext(q + 24), t6, 4&
End Sub

'Decrypt a 224 bit block.  ciphertext(q ... q+27) is input, plaintext(p ... p+27) is output.
'plaintext and ciphertext can be the same array.  Will crash if plaintext(p ... p+27) is not allocated.
Public Sub Block224Decrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
    Dim i     As Long
    Dim k     As Long
    Dim t0    As Long
    Dim t1    As Long
    Dim t2    As Long
    Dim t3    As Long
    Dim t4    As Long
    Dim t5    As Long
    Dim t6    As Long
    Dim s(27) As Byte

    CopyMemory t0, ciphertext(q + 0), 4&
    CopyMemory t1, ciphertext(q + 4), 4&
    CopyMemory t2, ciphertext(q + 8), 4&
    CopyMemory t3, ciphertext(q + 12), 4&
    CopyMemory t4, ciphertext(q + 16), 4&
    CopyMemory t5, ciphertext(q + 20), 4&
    CopyMemory t6, ciphertext(q + 24), 4&
    t0 = t0 Xor rkey(0)
    t1 = t1 Xor rkey(1)
    t2 = t2 Xor rkey(2)
    t3 = t3 Xor rkey(3)
    t4 = t4 Xor rkey(4)
    t5 = t5 Xor rkey(5)
    t6 = t6 Xor rkey(6)
    k = 7

    For i = 1 To Nr - 1 'Nr is number of rounds
        CopyMemory s(0), t0, 4&
        CopyMemory s(4), t1, 4&
        CopyMemory s(8), t2, 4&
        CopyMemory s(12), t3, 4&
        CopyMemory s(16), t4, 4&
        CopyMemory s(20), t5, 4&
        CopyMemory s(24), t6, 4&
        t0 = Td0(s(0)) Xor Td1(s(25)) Xor Td2(s(22)) Xor Td3(s(15)) Xor rkey(k + 0)
        t1 = Td0(s(4)) Xor Td1(s(1)) Xor Td2(s(26)) Xor Td3(s(19)) Xor rkey(k + 1)
        t2 = Td0(s(8)) Xor Td1(s(5)) Xor Td2(s(2)) Xor Td3(s(23)) Xor rkey(k + 2)
        t3 = Td0(s(12)) Xor Td1(s(9)) Xor Td2(s(6)) Xor Td3(s(27)) Xor rkey(k + 3)
        t4 = Td0(s(16)) Xor Td1(s(13)) Xor Td2(s(10)) Xor Td3(s(3)) Xor rkey(k + 4)
        t5 = Td0(s(20)) Xor Td1(s(17)) Xor Td2(s(14)) Xor Td3(s(7)) Xor rkey(k + 5)
        t6 = Td0(s(24)) Xor Td1(s(21)) Xor Td2(s(18)) Xor Td3(s(11)) Xor rkey(k + 6)
        k = k + 7
    Next i

    'Final round
    CopyMemory s(0), t0, 4&
    CopyMemory s(4), t1, 4&
    CopyMemory s(8), t2, 4&
    CopyMemory s(12), t3, 4&
    CopyMemory s(16), t4, 4&
    CopyMemory s(20), t5, 4&
    CopyMemory s(24), t6, 4&
    t0 = (Td4(s(0)) And &HFF&) Xor (Td4(s(25)) And &HFF00&) Xor (Td4(s(22)) And &HFF0000) Xor (Td4(s(15)) And &HFF000000) Xor rkey(k + 0)
    t1 = (Td4(s(4)) And &HFF&) Xor (Td4(s(1)) And &HFF00&) Xor (Td4(s(26)) And &HFF0000) Xor (Td4(s(19)) And &HFF000000) Xor rkey(k + 1)
    t2 = (Td4(s(8)) And &HFF&) Xor (Td4(s(5)) And &HFF00&) Xor (Td4(s(2)) And &HFF0000) Xor (Td4(s(23)) And &HFF000000) Xor rkey(k + 2)
    t3 = (Td4(s(12)) And &HFF&) Xor (Td4(s(9)) And &HFF00&) Xor (Td4(s(6)) And &HFF0000) Xor (Td4(s(27)) And &HFF000000) Xor rkey(k + 3)
    t4 = (Td4(s(16)) And &HFF&) Xor (Td4(s(13)) And &HFF00&) Xor (Td4(s(10)) And &HFF0000) Xor (Td4(s(3)) And &HFF000000) Xor rkey(k + 4)
    t5 = (Td4(s(20)) And &HFF&) Xor (Td4(s(17)) And &HFF00&) Xor (Td4(s(14)) And &HFF0000) Xor (Td4(s(7)) And &HFF000000) Xor rkey(k + 5)
    t6 = (Td4(s(24)) And &HFF&) Xor (Td4(s(21)) And &HFF00&) Xor (Td4(s(18)) And &HFF0000) Xor (Td4(s(11)) And &HFF000000) Xor rkey(k + 6)
    CopyMemory plaintext(p + 0), t0, 4&
    CopyMemory plaintext(p + 4), t1, 4&
    CopyMemory plaintext(p + 8), t2, 4&
    CopyMemory plaintext(p + 12), t3, 4&
    CopyMemory plaintext(p + 16), t4, 4&
    CopyMemory plaintext(p + 20), t5, 4&
    CopyMemory plaintext(p + 24), t6, 4&
End Sub
#End If

'Encrypt a 256 bit block.  plaintext(p ... p+31) is input, ciphertext(q ... q+31) is output.
'plaintext and ciphertext can be the same array.  Will crash if ciphertext(q ... q+31) is not allocated.
Public Sub Block256Encrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
    Dim i     As Long
    Dim k     As Long
    Dim t0    As Long
    Dim t1    As Long
    Dim t2    As Long
    Dim t3    As Long
    Dim t4    As Long
    Dim t5    As Long
    Dim t6    As Long
    Dim t7    As Long
    Dim s(31) As Byte

    CopyMemory t0, plaintext(p + 0), 4&
    CopyMemory t1, plaintext(p + 4), 4&
    CopyMemory t2, plaintext(p + 8), 4&
    CopyMemory t3, plaintext(p + 12), 4&
    CopyMemory t4, plaintext(p + 16), 4&
    CopyMemory t5, plaintext(p + 20), 4&
    CopyMemory t6, plaintext(p + 24), 4&
    CopyMemory t7, plaintext(p + 28), 4&
    t0 = t0 Xor fkey(0)
    t1 = t1 Xor fkey(1)
    t2 = t2 Xor fkey(2)
    t3 = t3 Xor fkey(3)
    t4 = t4 Xor fkey(4)
    t5 = t5 Xor fkey(5)
    t6 = t6 Xor fkey(6)
    t7 = t7 Xor fkey(7)
    k = 8

    For i = 1 To Nr - 1 'Nr is number of rounds
        CopyMemory s(0), t0, 4&
        CopyMemory s(4), t1, 4&
        CopyMemory s(8), t2, 4&
        CopyMemory s(12), t3, 4&
        CopyMemory s(16), t4, 4&
        CopyMemory s(20), t5, 4&
        CopyMemory s(24), t6, 4&
        CopyMemory s(28), t7, 4&
        t0 = Te0(s(0)) Xor Te1(s(5)) Xor Te2(s(14)) Xor Te3(s(19)) Xor fkey(k + 0)
        t1 = Te0(s(4)) Xor Te1(s(9)) Xor Te2(s(18)) Xor Te3(s(23)) Xor fkey(k + 1)
        t2 = Te0(s(8)) Xor Te1(s(13)) Xor Te2(s(22)) Xor Te3(s(27)) Xor fkey(k + 2)
        t3 = Te0(s(12)) Xor Te1(s(17)) Xor Te2(s(26)) Xor Te3(s(31)) Xor fkey(k + 3)
        t4 = Te0(s(16)) Xor Te1(s(21)) Xor Te2(s(30)) Xor Te3(s(3)) Xor fkey(k + 4)
        t5 = Te0(s(20)) Xor Te1(s(25)) Xor Te2(s(2)) Xor Te3(s(7)) Xor fkey(k + 5)
        t6 = Te0(s(24)) Xor Te1(s(29)) Xor Te2(s(6)) Xor Te3(s(11)) Xor fkey(k + 6)
        t7 = Te0(s(28)) Xor Te1(s(1)) Xor Te2(s(10)) Xor Te3(s(15)) Xor fkey(k + 7)
        k = k + 8
    Next i

    'Final round
    CopyMemory s(0), t0, 4&
    CopyMemory s(4), t1, 4&
    CopyMemory s(8), t2, 4&
    CopyMemory s(12), t3, 4&
    CopyMemory s(16), t4, 4&
    CopyMemory s(20), t5, 4&
    CopyMemory s(24), t6, 4&
    CopyMemory s(28), t7, 4&
    t0 = (Te4(s(0)) And &HFF&) Xor (Te4(s(5)) And &HFF00&) Xor (Te4(s(14)) And &HFF0000) Xor (Te4(s(19)) And &HFF000000) Xor fkey(k + 0)
    t1 = (Te4(s(4)) And &HFF&) Xor (Te4(s(9)) And &HFF00&) Xor (Te4(s(18)) And &HFF0000) Xor (Te4(s(23)) And &HFF000000) Xor fkey(k + 1)
    t2 = (Te4(s(8)) And &HFF&) Xor (Te4(s(13)) And &HFF00&) Xor (Te4(s(22)) And &HFF0000) Xor (Te4(s(27)) And &HFF000000) Xor fkey(k + 2)
    t3 = (Te4(s(12)) And &HFF&) Xor (Te4(s(17)) And &HFF00&) Xor (Te4(s(26)) And &HFF0000) Xor (Te4(s(31)) And &HFF000000) Xor fkey(k + 3)
    t4 = (Te4(s(16)) And &HFF&) Xor (Te4(s(21)) And &HFF00&) Xor (Te4(s(30)) And &HFF0000) Xor (Te4(s(3)) And &HFF000000) Xor fkey(k + 4)
    t5 = (Te4(s(20)) And &HFF&) Xor (Te4(s(25)) And &HFF00&) Xor (Te4(s(2)) And &HFF0000) Xor (Te4(s(7)) And &HFF000000) Xor fkey(k + 5)
    t6 = (Te4(s(24)) And &HFF&) Xor (Te4(s(29)) And &HFF00&) Xor (Te4(s(6)) And &HFF0000) Xor (Te4(s(11)) And &HFF000000) Xor fkey(k + 6)
    t7 = (Te4(s(28)) And &HFF&) Xor (Te4(s(1)) And &HFF00&) Xor (Te4(s(10)) And &HFF0000) Xor (Te4(s(15)) And &HFF000000) Xor fkey(k + 7)
    CopyMemory ciphertext(q + 0), t0, 4&
    CopyMemory ciphertext(q + 4), t1, 4&
    CopyMemory ciphertext(q + 8), t2, 4&
    CopyMemory ciphertext(q + 12), t3, 4&
    CopyMemory ciphertext(q + 16), t4, 4&
    CopyMemory ciphertext(q + 20), t5, 4&
    CopyMemory ciphertext(q + 24), t6, 4&
    CopyMemory ciphertext(q + 28), t7, 4&
End Sub

'Decrypt a 256 bit block.  ciphertext(q ... q+31) is input, plaintext(p ... p+31) is output.
'plaintext and ciphertext can be the same array.  Will crash if plaintext(p ... p+31) is not allocated.
Public Sub Block256Decrypt(plaintext() As Byte, ciphertext() As Byte, p As Long, q As Long)
    Dim i     As Long
    Dim k     As Long
    Dim t0    As Long
    Dim t1    As Long
    Dim t2    As Long
    Dim t3    As Long
    Dim t4    As Long
    Dim t5    As Long
    Dim t6    As Long
    Dim t7    As Long
    Dim s(31) As Byte

    CopyMemory t0, ciphertext(q + 0), 4&
    CopyMemory t1, ciphertext(q + 4), 4&
    CopyMemory t2, ciphertext(q + 8), 4&
    CopyMemory t3, ciphertext(q + 12), 4&
    CopyMemory t4, ciphertext(q + 16), 4&
    CopyMemory t5, ciphertext(q + 20), 4&
    CopyMemory t6, ciphertext(q + 24), 4&
    CopyMemory t7, ciphertext(q + 28), 4&
    t0 = t0 Xor rkey(0)
    t1 = t1 Xor rkey(1)
    t2 = t2 Xor rkey(2)
    t3 = t3 Xor rkey(3)
    t4 = t4 Xor rkey(4)
    t5 = t5 Xor rkey(5)
    t6 = t6 Xor rkey(6)
    t7 = t7 Xor rkey(7)
    k = 8

    For i = 1 To Nr - 1 'Nr is number of rounds
        CopyMemory s(0), t0, 4&
        CopyMemory s(4), t1, 4&
        CopyMemory s(8), t2, 4&
        CopyMemory s(12), t3, 4&
        CopyMemory s(16), t4, 4&
        CopyMemory s(20), t5, 4&
        CopyMemory s(24), t6, 4&
        CopyMemory s(28), t7, 4&
        t0 = Td0(s(0)) Xor Td1(s(29)) Xor Td2(s(22)) Xor Td3(s(19)) Xor rkey(k + 0)
        t1 = Td0(s(4)) Xor Td1(s(1)) Xor Td2(s(26)) Xor Td3(s(23)) Xor rkey(k + 1)
        t2 = Td0(s(8)) Xor Td1(s(5)) Xor Td2(s(30)) Xor Td3(s(27)) Xor rkey(k + 2)
        t3 = Td0(s(12)) Xor Td1(s(9)) Xor Td2(s(2)) Xor Td3(s(31)) Xor rkey(k + 3)
        t4 = Td0(s(16)) Xor Td1(s(13)) Xor Td2(s(6)) Xor Td3(s(3)) Xor rkey(k + 4)
        t5 = Td0(s(20)) Xor Td1(s(17)) Xor Td2(s(10)) Xor Td3(s(7)) Xor rkey(k + 5)
        t6 = Td0(s(24)) Xor Td1(s(21)) Xor Td2(s(14)) Xor Td3(s(11)) Xor rkey(k + 6)
        t7 = Td0(s(28)) Xor Td1(s(25)) Xor Td2(s(18)) Xor Td3(s(15)) Xor rkey(k + 7)
        k = k + 8
    Next i

    'Final round
    CopyMemory s(0), t0, 4&
    CopyMemory s(4), t1, 4&
    CopyMemory s(8), t2, 4&
    CopyMemory s(12), t3, 4&
    CopyMemory s(16), t4, 4&
    CopyMemory s(20), t5, 4&
    CopyMemory s(24), t6, 4&
    CopyMemory s(28), t7, 4&
    t0 = (Td4(s(0)) And &HFF&) Xor (Td4(s(29)) And &HFF00&) Xor (Td4(s(22)) And &HFF0000) Xor (Td4(s(19)) And &HFF000000) Xor rkey(k + 0)
    t1 = (Td4(s(4)) And &HFF&) Xor (Td4(s(1)) And &HFF00&) Xor (Td4(s(26)) And &HFF0000) Xor (Td4(s(23)) And &HFF000000) Xor rkey(k + 1)
    t2 = (Td4(s(8)) And &HFF&) Xor (Td4(s(5)) And &HFF00&) Xor (Td4(s(30)) And &HFF0000) Xor (Td4(s(27)) And &HFF000000) Xor rkey(k + 2)
    t3 = (Td4(s(12)) And &HFF&) Xor (Td4(s(9)) And &HFF00&) Xor (Td4(s(2)) And &HFF0000) Xor (Td4(s(31)) And &HFF000000) Xor rkey(k + 3)
    t4 = (Td4(s(16)) And &HFF&) Xor (Td4(s(13)) And &HFF00&) Xor (Td4(s(6)) And &HFF0000) Xor (Td4(s(3)) And &HFF000000) Xor rkey(k + 4)
    t5 = (Td4(s(20)) And &HFF&) Xor (Td4(s(17)) And &HFF00&) Xor (Td4(s(10)) And &HFF0000) Xor (Td4(s(7)) And &HFF000000) Xor rkey(k + 5)
    t6 = (Td4(s(24)) And &HFF&) Xor (Td4(s(21)) And &HFF00&) Xor (Td4(s(14)) And &HFF0000) Xor (Td4(s(11)) And &HFF000000) Xor rkey(k + 6)
    t7 = (Td4(s(28)) And &HFF&) Xor (Td4(s(25)) And &HFF00&) Xor (Td4(s(18)) And &HFF0000) Xor (Td4(s(15)) And &HFF000000) Xor rkey(k + 7)
    CopyMemory plaintext(p + 0), t0, 4&
    CopyMemory plaintext(p + 4), t1, 4&
    CopyMemory plaintext(p + 8), t2, 4&
    CopyMemory plaintext(p + 12), t3, 4&
    CopyMemory plaintext(p + 16), t4, 4&
    CopyMemory plaintext(p + 20), t5, 4&
    CopyMemory plaintext(p + 24), t6, 4&
    CopyMemory plaintext(p + 28), t7, 4&
End Sub
#End If


'Encrypt an arbritrary size array in blocks.  plaintext(0 ... n-1) is input,
'ciphertext(0 ... m-1) is output, where m is n padded to a multiple of (BlockBits\8) bytes.
'plaintext and ciphertext must be distinct, and ciphertext must be a redimensionable array.
'If appendsize is non-zero, a one byte length field is appended to the plaintext
'before encrypting so the original length can be retrieved after decryption.
#If SUPPORT_LEVEL Then
Public Function ArrayEncrypt(plaintext() As Byte, ciphertext() As Byte, appendsize As Long, BlockBits As Long) As Long
#Else
Public Function ArrayEncrypt(plaintext() As Byte, ciphertext() As Byte, appendsize As Long) As Long
#End If
    Dim i           As Long
    Dim m           As Long
    Dim n           As Long
#If SUPPORT_LEVEL = 0 Then
    Const BlockSize As Long = 16 'bytes
#Else
    Dim BlockSize   As Long

    Select Case BlockBits
    Case 128:  BlockSize = 16
    Case 192:  BlockSize = 24
    Case 256:  BlockSize = 32
#If SUPPORT_LEVEL = 2 Then
    Case 160:  BlockSize = 20
    Case 224:  BlockSize = 28
#End If
    Case Else: Err.Raise 1, , "cRijndael.ArrayEncrypt - Illegal BlockBits value"
    End Select
#End If

    If LBound(plaintext) <> 0 Then Err.Raise 1, , "cRijndael.ArrayEncrypt - plaintext must be zero based array"

    n = UBound(plaintext) + 1
    If appendsize = 0 Then
#If SUPPORT_LEVEL Then
        m = ((n + BlockSize - 1) \ BlockSize) * BlockSize
#Else
        m = (n + BlockSize - 1) And &HFFFFFFF0  'BlockSize=16 specific
#End If
        ReDim ciphertext(m - 1)
    Else
#If SUPPORT_LEVEL Then
        m = ((n + BlockSize) \ BlockSize) * BlockSize
#Else
        m = (n + BlockSize) And &HFFFFFFF0      'BlockSize=16 specific
#End If
        ReDim ciphertext(m - 1)
        ciphertext(m - 1) = n Mod BlockSize
    End If

#If SUPPORT_LEVEL Then
    Select Case BlockBits
    Case 128
#End If

    For i = 0 To n - BlockSize Step BlockSize
        BlockEncrypt plaintext, ciphertext, i, i
    Next i

#If SUPPORT_LEVEL Then
    Case 192
    For i = 0 To n - BlockSize Step BlockSize
        Block192Encrypt plaintext, ciphertext, i, i
    Next i
    Case 256
    For i = 0 To n - BlockSize Step BlockSize
        Block256Encrypt plaintext, ciphertext, i, i
    Next i
#If SUPPORT_LEVEL = 2 Then
    Case 160
    For i = 0 To n - BlockSize Step BlockSize
        Block160Encrypt plaintext, ciphertext, i, i
    Next i
    Case 224
    For i = 0 To n - BlockSize Step BlockSize
        Block224Encrypt plaintext, ciphertext, i, i
    Next i
#End If
    End Select
#End If

    If (n Mod BlockSize) <> 0 Then CopyMemory ciphertext(i), plaintext(i), n Mod BlockSize

#If SUPPORT_LEVEL Then
    Select Case BlockBits
    Case 128
#End If

    If i <> m Then BlockEncrypt ciphertext, ciphertext, i, i

#If SUPPORT_LEVEL Then
    Case 192
    If i <> m Then Block192Encrypt ciphertext, ciphertext, i, i
    Case 256
    If i <> m Then Block256Encrypt ciphertext, ciphertext, i, i
#If SUPPORT_LEVEL = 2 Then
    Case 160
    If i <> m Then Block160Encrypt ciphertext, ciphertext, i, i
    Case 224
    If i <> m Then Block224Encrypt ciphertext, ciphertext, i, i
#End If
    End Select
#End If

End Function

'Decrypts an array encrypted with the ArrayEncrypt function
#If SUPPORT_LEVEL Then
Public Function ArrayDecrypt(plaintext() As Byte, ciphertext() As Byte, appendsize As Long, BlockBits As Long) As Long
#Else
Public Function ArrayDecrypt(plaintext() As Byte, ciphertext() As Byte, appendsize As Long) As Long
#End If
    Dim i           As Long
    Dim m           As Long
    Dim n           As Long
#If SUPPORT_LEVEL = 0 Then
    Const BlockSize As Long = 16 'bytes
#Else
    Dim BlockSize   As Long

    Select Case BlockBits
    Case 128:  BlockSize = 16
    Case 192:  BlockSize = 24
    Case 256:  BlockSize = 32
#If SUPPORT_LEVEL = 2 Then
    Case 160:  BlockSize = 20
    Case 224:  BlockSize = 28
#End If
    Case Else: Err.Raise 1, , "cRijndael.ArrayDecrypt - Illegal BlockBits value"
    End Select
#End If

    If LBound(ciphertext) <> 0 Then Err.Raise 1, , "cRijndael.ArrayDecrypt - ciphertext must be zero based array"

    n = UBound(ciphertext) + 1
    If ((n Mod BlockSize) = 0) Then
        ReDim plaintext(n - 1)

#If SUPPORT_LEVEL Then
        Select Case BlockBits
        Case 128
#End If

        For i = 0 To n - BlockSize Step BlockSize
            BlockDecrypt plaintext, ciphertext, i, i
        Next i

#If SUPPORT_LEVEL Then
        Case 192
        For i = 0 To n - BlockSize Step BlockSize
            Block192Decrypt plaintext, ciphertext, i, i
        Next i
        Case 256
        For i = 0 To n - BlockSize Step BlockSize
            Block256Decrypt plaintext, ciphertext, i, i
        Next i
#If SUPPORT_LEVEL = 2 Then
        Case 160
        For i = 0 To n - BlockSize Step BlockSize
            Block160Decrypt plaintext, ciphertext, i, i
        Next i
        Case 224
        For i = 0 To n - BlockSize Step BlockSize
            Block224Decrypt plaintext, ciphertext, i, i
        Next i
#End If
        End Select
#End If

        If appendsize Then
            If plaintext(n - 1) < BlockSize Then
                n = n - BlockSize + plaintext(n - 1)
                If n > 0 Then ReDim Preserve plaintext(n - 1)
            Else
                MsgBox "warning - incorrect length field"
                ArrayDecrypt = 1
            End If
        End If
    Else
        MsgBox "ciphertext size not a multiple of block size"
        ArrayDecrypt = -1
    End If

End Function

 


'File encryption.  The ciphertext file will be padded to a multiple of (BlockBits\8) bytes.
'One byte is appended to the ciphertext to indicate the length of the final block.
'FileDecrypt recovers this length field and restores the original plaintext file length.
'PlaintextFileName and CiphertextFileName must be distinct, PlaintextFileName must exist,
'CiphertextFileName must not exist, etc.  Be sure to do file checking before calling this.
#If SUPPORT_LEVEL Then
Public Function FileEncrypt(PlaintextFileName As String, CiphertextFileName As String, BlockBits As Long) As Long
#Else
Public Function FileEncrypt(PlaintextFileName As String, CiphertextFileName As String) As Long
#End If
    Dim FileNum     As Integer
    Dim FileNum2    As Integer
    Dim i           As Long
    Dim m           As Long 'ciphertext file size
    Dim n           As Long 'plaintext file size
    Dim data()      As Byte
#If SUPPORT_LEVEL = 0 Then
    Const BlockSize As Long = 16 'bytes
    Const MaxBlocks As Long = MaxFileChunkSize \ BlockSize
#Else
    Dim BlockSize   As Long
    Dim MaxBlocks   As Long

    Select Case BlockBits
    Case 128:  BlockSize = 16
    Case 192:  BlockSize = 24
    Case 256:  BlockSize = 32
#If SUPPORT_LEVEL = 2 Then
    Case 160:  BlockSize = 20
    Case 224:  BlockSize = 28
#End If
    Case Else: Err.Raise 1, , "cRijndael.FileEncrypt - Illegal BlockBits value"
    End Select
    MaxBlocks = MaxFileChunkSize \ BlockSize
#End If

    n = FileLen(PlaintextFileName)
#If SUPPORT_LEVEL Then
    m = ((n + BlockSize) \ BlockSize) * BlockSize
#Else
    m = (n + BlockSize) And (-BlockSize) 'BlockSize=16 specific
#End If

    FileNum = FreeFile
    Open PlaintextFileName For Binary Access Read As FileNum
    FileNum2 = FreeFile
    Open CiphertextFileName For Binary Access Write As FileNum2

    'For large files, encrypt in pieces no larger than MaxFileChunkSize
    If m > MaxBlocks * BlockSize Then
        ReDim data(MaxBlocks * BlockSize - 1)
        Do
            Get #FileNum, , data
#If SUPPORT_LEVEL Then
            Select Case BlockBits
            Case 128
#End If
            For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize
                BlockEncrypt data, data, i, i
            Next i
#If SUPPORT_LEVEL Then
            Case 192
            For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize
                Block192Encrypt data, data, i, i
            Next i
            Case 256
            For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize
                Block256Encrypt data, data, i, i
            Next i
#If SUPPORT_LEVEL = 2 Then
            Case 160
            For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize
                Block160Encrypt data, data, i, i
            Next i
            Case 224
            For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize
                Block224Encrypt data, data, i, i
            Next i
#End If
            End Select
#End If
            Put #FileNum2, , data
            m = m - MaxBlocks * BlockSize
        Loop While m > MaxBlocks * BlockSize
    End If

    'Encrypt the last piece of the file
    ReDim data(m - 1)
    Get #FileNum, , data
    data(m - 1) = n Mod BlockSize
#If SUPPORT_LEVEL Then
    Select Case BlockBits
    Case 128
#End If
    For i = 0 To m - BlockSize Step BlockSize
        BlockEncrypt data, data, i, i
    Next i
#If SUPPORT_LEVEL Then
    Case 192
    For i = 0 To m - BlockSize Step BlockSize
        Block192Encrypt data, data, i, i
    Next i
    Case 256
    For i = 0 To m - BlockSize Step BlockSize
        Block256Encrypt data, data, i, i
    Next i
#If SUPPORT_LEVEL = 2 Then
    Case 160
    For i = 0 To m - BlockSize Step BlockSize
        Block160Encrypt data, data, i, i
    Next i
    Case 224
    For i = 0 To m - BlockSize Step BlockSize
        Block224Encrypt data, data, i, i
    Next i
#End If
    End Select
#End If
    Put FileNum2, , data

    Close FileNum
    Close FileNum2
End Function

'File decryption.
#If SUPPORT_LEVEL Then
Public Function FileDecrypt(PlaintextFileName As String, CiphertextFileName As String, BlockBits As Long) As Long
#Else
Public Function FileDecrypt(PlaintextFileName As String, CiphertextFileName As String) As Long
#End If
    Dim FileNum     As Integer
    Dim FileNum2    As Integer
    Dim i           As Long
    Dim m           As Long 'ciphertext file size
    Dim n           As Long 'plaintext file size
    Dim data()      As Byte
#If SUPPORT_LEVEL = 0 Then
    Const BlockSize As Long = 16 'bytes
    Const MaxBlocks As Long = MaxFileChunkSize \ BlockSize
#Else
    Dim BlockSize   As Long
    Dim MaxBlocks   As Long

    Select Case BlockBits
    Case 128:  BlockSize = 16
    Case 192:  BlockSize = 24
    Case 256:  BlockSize = 32
#If SUPPORT_LEVEL = 2 Then
    Case 160:  BlockSize = 20
    Case 224:  BlockSize = 28
#End If
    Case Else: Err.Raise 1, , "cRijndael.FileDecrypt - Illegal BlockBits value"
    End Select
    MaxBlocks = MaxFileChunkSize \ BlockSize
#End If

    m = FileLen(CiphertextFileName)
#If SUPPORT_LEVEL Then
    If (m = 0) Or ((m Mod BlockSize) <> 0) Then
#Else
    If (m = 0) Or ((m And (BlockSize - 1)) <> 0) Then 'BlockSize=16 specific
#End If
        MsgBox "File Size Error - ciphertext file not a multiple of block size"
        FileDecrypt = 1
    Else
        FileNum = FreeFile
        Open CiphertextFileName For Binary Access Read As FileNum
        FileNum2 = FreeFile
        Open PlaintextFileName For Binary Access Write As FileNum2

        'For large files, decrypt in pieces no larger than MaxFileChunkSize
        If m > MaxBlocks * BlockSize Then
            ReDim data(MaxBlocks * BlockSize - 1)
            Do
                Get #FileNum, , data
#If SUPPORT_LEVEL Then
                Select Case BlockBits
                Case 128
#End If
                For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize
                    BlockDecrypt data, data, i, i
                Next i
#If SUPPORT_LEVEL Then
                Case 192
                For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize
                    Block192Decrypt data, data, i, i
                Next i
                Case 256
                For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize
                    Block256Decrypt data, data, i, i
                Next i
#If SUPPORT_LEVEL = 2 Then
                Case 160
                For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize
                    Block160Decrypt data, data, i, i
                Next i
                Case 224
                For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize
                    Block224Decrypt data, data, i, i
                Next i
#End If
                End Select
#End If
                Put #FileNum2, , data
                m = m - MaxBlocks * BlockSize
            Loop While m > MaxBlocks * BlockSize
        End If

        'Decrypt the last piece of the file
        ReDim data(m - 1)
        Get #FileNum, , data
#If SUPPORT_LEVEL Then
        Select Case BlockBits
        Case 128
#End If
        For i = 0 To m - BlockSize Step BlockSize
            BlockDecrypt data, data, i, i
        Next i
#If SUPPORT_LEVEL Then
        Case 192
        For i = 0 To m - BlockSize Step BlockSize
            Block192Decrypt data, data, i, i
        Next i
        Case 256
        For i = 0 To m - BlockSize Step BlockSize
            Block256Decrypt data, data, i, i
        Next i
#If SUPPORT_LEVEL = 2 Then
        Case 160
        For i = 0 To m - BlockSize Step BlockSize
            Block160Decrypt data, data, i, i
        Next i
        Case 224
        For i = 0 To m - BlockSize Step BlockSize
            Block224Decrypt data, data, i, i
        Next i
#End If
        End Select
#End If
        'Recover length field
        If data(m - 1) < BlockSize Then
            n = m - BlockSize + CLng(data(m - 1))
        Else
#If SUPPORT_LEVEL Then
            MsgBox "warning - incorrect length field in decrypted file." & vbCrLf & "Wrong key, keysize, or blocksize?"
#Else
            MsgBox "warning - incorrect length field in decrypted file." & vbCrLf & "Wrong key or keysize?"
#End If
            n = m
        End If
        If n > 0 Then
            ReDim Preserve data(n - 1)
            Put FileNum2, , data
        End If

        Close FileNum
        Close FileNum2
    End If
End Function


Private Sub Class_Initialize()
#If COMPILE_CONSTANTS = 0 Then
    Dim i          As Long
    Dim y          As Byte
    Dim s(7)       As Byte
    Dim ib         As Byte
    Dim ptab(255)  As Byte
    Dim ltab(255)  As Byte

    'use 3 as primitive root to generate power and log tables
    ltab(0) = 0
    ltab(1) = 0
    ltab(3) = 1
    ptab(0) = 1
    ptab(1) = 3
    For i = 2 To 255 'ptab(i) = ptab(i - 1) Xor Xtime(ptab(i - 1))
        If (ptab(i - 1) And &H80) Then
            ptab(i) = ptab(i - 1) Xor ((ptab(i - 1) And 127) * 2) Xor &H1B
        Else
            ptab(i) = ptab(i - 1) Xor (ptab(i - 1) * 2)
        End If
        ltab(ptab(i)) = i
    Next i

    'affine transformation:- each bit is xored with itself shifted one bit
    Te4(0) = &H63636363
    Td4(&H63) = 0
    For i = 1 To 255
        y = ptab(255 - ltab(i)) 'multiplicative inverse
        ib = y
        If ib And &H80 Then ib = (ib And 127) * 2 Or 1 Else ib = ib * 2 'RotateLeftByte
        y = y Xor ib
        If ib And &H80 Then ib = (ib And 127) * 2 Or 1 Else ib = ib * 2
        y = y Xor ib
        If ib And &H80 Then ib = (ib And 127) * 2 Or 1 Else ib = ib * 2
        y = y Xor ib
        If ib And &H80 Then ib = (ib And 127) * 2 Or 1 Else ib = ib * 2
        y = y Xor ib Xor &H63

        s(0) = y
        s(1) = s(0)
        s(2) = s(0)
        s(3) = s(0)
        CopyMemory Te4(i), s(0), 4&

        s(0) = i
        s(1) = s(0)
        s(2) = s(0)
        s(3) = s(0)
        CopyMemory Td4(y), s(0), 4&
    Next i

    y = 1
    For i = 0 To UBound(rco)
        rco(i) = y
        If (y And &H80) Then 'y = Xtime(y)
            y = ((y And 127) * 2) Xor &H1B
        Else
            y = y * 2
        End If
    Next i

    'calculate forward and reverse tables
    For i = 0 To 255
        y = Te4(i) And &HFF&
        's(3) = y Xor Xtime(y)
'        s(0) = Xtime(y)
        If (y And &H80) Then
            s(0) = ((y And 127) * 2) Xor &H1B
            s(3) = y Xor s(0)
        Else
            s(0) = y * 2
            s(3) = y Xor s(0)
        End If
        s(2) = y
        s(1) = y
        CopyMemory s(4), s(0), 4&
        CopyMemory Te0(i), s(0), 4&
        CopyMemory Te1(i), s(3), 4&
        CopyMemory Te2(i), s(2), 4&
        CopyMemory Te3(i), s(1), 4&
        y = Td4(i) And &HFF&
        If y = 0 Then 'x.y= AntiLog(Log(x) + Log(y))
            s(3) = 0
            s(2) = 0
            s(1) = 0
            s(0) = 0
        Else
            s(3) = ptab((CLng(ltab(&HB)) + CLng(ltab(y))) Mod 255)
            s(2) = ptab((CLng(ltab(&HD)) + CLng(ltab(y))) Mod 255)
            s(1) = ptab((CLng(ltab(&H9)) + CLng(ltab(y))) Mod 255)
            s(0) = ptab((CLng(ltab(&HE)) + CLng(ltab(y))) Mod 255)
        End If
        CopyMemory s(4), s(0), 4&
        CopyMemory Td0(i), s(0), 4&
        CopyMemory Td1(i), s(3), 4&
        CopyMemory Td2(i), s(2), 4&
        CopyMemory Td3(i), s(1), 4&
    Next i
#Else
    Te0(0) = &HA56363C6:   Te0(1) = &H847C7CF8:   Te0(2) = &H997777EE:   Te0(3) = &H8D7B7BF6:   Te0(4) = &HDF2F2FF:    Te0(5) = &HBD6B6BD6:   Te0(6) = &HB16F6FDE:   Te0(7) = &H54C5C591
    Te0(8) = &H50303060:   Te0(9) = &H3010102:    Te0(10) = &HA96767CE:  Te0(11) = &H7D2B2B56:  Te0(12) = &H19FEFEE7:  Te0(13) = &H62D7D7B5:  Te0(14) = &HE6ABAB4D:  Te0(15) = &H9A7676EC
    Te0(16) = &H45CACA8F:  Te0(17) = &H9D82821F:  Te0(18) = &H40C9C989:  Te0(19) = &H877D7DFA:  Te0(20) = &H15FAFAEF:  Te0(21) = &HEB5959B2:  Te0(22) = &HC947478E:  Te0(23) = &HBF0F0FB
    Te0(24) = &HECADAD41:  Te0(25) = &H67D4D4B3:  Te0(26) = &HFDA2A25F:  Te0(27) = &HEAAFAF45:  Te0(28) = &HBF9C9C23:  Te0(29) = &HF7A4A453:  Te0(30) = &H967272E4:  Te0(31) = &H5BC0C09B
    Te0(32) = &HC2B7B775:  Te0(33) = &H1CFDFDE1:  Te0(34) = &HAE93933D:  Te0(35) = &H6A26264C:  Te0(36) = &H5A36366C:  Te0(37) = &H413F3F7E:  Te0(38) = &H2F7F7F5:   Te0(39) = &H4FCCCC83
    Te0(40) = &H5C343468:  Te0(41) = &HF4A5A551:  Te0(42) = &H34E5E5D1:  Te0(43) = &H8F1F1F9:   Te0(44) = &H937171E2:  Te0(45) = &H73D8D8AB:  Te0(46) = &H53313162:  Te0(47) = &H3F15152A
    Te0(48) = &HC040408:   Te0(49) = &H52C7C795:  Te0(50) = &H65232346:  Te0(51) = &H5EC3C39D:  Te0(52) = &H28181830:  Te0(53) = &HA1969637:  Te0(54) = &HF05050A:   Te0(55) = &HB59A9A2F
    Te0(56) = &H907070E:   Te0(57) = &H36121224:  Te0(58) = &H9B80801B:  Te0(59) = &H3DE2E2DF:  Te0(60) = &H26EBEBCD:  Te0(61) = &H6927274E:  Te0(62) = &HCDB2B27F:  Te0(63) = &H9F7575EA
    Te0(64) = &H1B090912:  Te0(65) = &H9E83831D:  Te0(66) = &H742C2C58:  Te0(67) = &H2E1A1A34:  Te0(68) = &H2D1B1B36:  Te0(69) = &HB26E6EDC:  Te0(70) = &HEE5A5AB4:  Te0(71) = &HFBA0A05B
    Te0(72) = &HF65252A4:  Te0(73) = &H4D3B3B76:  Te0(74) = &H61D6D6B7:  Te0(75) = &HCEB3B37D:  Te0(76) = &H7B292952:  Te0(77) = &H3EE3E3DD:  Te0(78) = &H712F2F5E:  Te0(79) = &H97848413
    Te0(80) = &HF55353A6:  Te0(81) = &H68D1D1B9:  Te0(82) = &H0&:        Te0(83) = &H2CEDEDC1:  Te0(84) = &H60202040:  Te0(85) = &H1FFCFCE3:  Te0(86) = &HC8B1B179:  Te0(87) = &HED5B5BB6
    Te0(88) = &HBE6A6AD4:  Te0(89) = &H46CBCB8D:  Te0(90) = &HD9BEBE67:  Te0(91) = &H4B393972:  Te0(92) = &HDE4A4A94:  Te0(93) = &HD44C4C98:  Te0(94) = &HE85858B0:  Te0(95) = &H4ACFCF85
    Te0(96) = &H6BD0D0BB:  Te0(97) = &H2AEFEFC5:  Te0(98) = &HE5AAAA4F:  Te0(99) = &H16FBFBED:  Te0(100) = &HC5434386: Te0(101) = &HD74D4D9A: Te0(102) = &H55333366: Te0(103) = &H94858511
    Te0(104) = &HCF45458A: Te0(105) = &H10F9F9E9: Te0(106) = &H6020204:  Te0(107) = &H817F7FFE: Te0(108) = &HF05050A0: Te0(109) = &H443C3C78: Te0(110) = &HBA9F9F25: Te0(111) = &HE3A8A84B
    Te0(112) = &HF35151A2: Te0(113) = &HFEA3A35D: Te0(114) = &HC0404080: Te0(115) = &H8A8F8F05: Te0(116) = &HAD92923F: Te0(117) = &HBC9D9D21: Te0(118) = &H48383870: Te0(119) = &H4F5F5F1
    Te0(120) = &HDFBCBC63: Te0(121) = &HC1B6B677: Te0(122) = &H75DADAAF: Te0(123) = &H63212142: Te0(124) = &H30101020: Te0(125) = &H1AFFFFE5: Te0(126) = &HEF3F3FD:  Te0(127) = &H6DD2D2BF
    Te0(128) = &H4CCDCD81: Te0(129) = &H140C0C18: Te0(130) = &H35131326: Te0(131) = &H2FECECC3: Te0(132) = &HE15F5FBE: Te0(133) = &HA2979735: Te0(134) = &HCC444488: Te0(135) = &H3917172E
    Te0(136) = &H57C4C493: Te0(137) = &HF2A7A755: Te0(138) = &H827E7EFC: Te0(139) = &H473D3D7A: Te0(140) = &HAC6464C8: Te0(141) = &HE75D5DBA: Te0(142) = &H2B191932: Te0(143) = &H957373E6
    Te0(144) = &HA06060C0: Te0(145) = &H98818119: Te0(146) = &HD14F4F9E: Te0(147) = &H7FDCDCA3: Te0(148) = &H66222244: Te0(149) = &H7E2A2A54: Te0(150) = &HAB90903B: Te0(151) = &H8388880B
    Te0(152) = &HCA46468C: Te0(153) = &H29EEEEC7: Te0(154) = &HD3B8B86B: Te0(155) = &H3C141428: Te0(156) = &H79DEDEA7: Te0(157) = &HE25E5EBC: Te0(158) = &H1D0B0B16: Te0(159) = &H76DBDBAD
    Te0(160) = &H3BE0E0DB: Te0(161) = &H56323264: Te0(162) = &H4E3A3A74: Te0(163) = &H1E0A0A14: Te0(164) = &HDB494992: Te0(165) = &HA06060C:  Te0(166) = &H6C242448: Te0(167) = &HE45C5CB8
    Te0(168) = &H5DC2C29F: Te0(169) = &H6ED3D3BD: Te0(170) = &HEFACAC43: Te0(171) = &HA66262C4: Te0(172) = &HA8919139: Te0(173) = &HA4959531: Te0(174) = &H37E4E4D3: Te0(175) = &H8B7979F2
    Te0(176) = &H32E7E7D5: Te0(177) = &H43C8C88B: Te0(178) = &H5937376E: Te0(179) = &HB76D6DDA: Te0(180) = &H8C8D8D01: Te0(181) = &H64D5D5B1: Te0(182) = &HD24E4E9C: Te0(183) = &HE0A9A949
    Te0(184) = &HB46C6CD8: Te0(185) = &HFA5656AC: Te0(186) = &H7F4F4F3:  Te0(187) = &H25EAEACF: Te0(188) = &HAF6565CA: Te0(189) = &H8E7A7AF4: Te0(190) = &HE9AEAE47: Te0(191) = &H18080810
    Te0(192) = &HD5BABA6F: Te0(193) = &H887878F0: Te0(194) = &H6F25254A: Te0(195) = &H722E2E5C: Te0(196) = &H241C1C38: Te0(197) = &HF1A6A657: Te0(198) = &HC7B4B473: Te0(199) = &H51C6C697
    Te0(200) = &H23E8E8CB: Te0(201) = &H7CDDDDA1: Te0(202) = &H9C7474E8: Te0(203) = &H211F1F3E: Te0(204) = &HDD4B4B96: Te0(205) = &HDCBDBD61: Te0(206) = &H868B8B0D: Te0(207) = &H858A8A0F
    Te0(208) = &H907070E0: Te0(209) = &H423E3E7C: Te0(210) = &HC4B5B571: Te0(211) = &HAA6666CC: Te0(212) = &HD8484890: Te0(213) = &H5030306:  Te0(214) = &H1F6F6F7:  Te0(215) = &H120E0E1C
    Te0(216) = &HA36161C2: Te0(217) = &H5F35356A: Te0(218) = &HF95757AE: Te0(219) = &HD0B9B969: Te0(220) = &H91868617: Te0(221) = &H58C1C199: Te0(222) = &H271D1D3A: Te0(223) = &HB99E9E27
    Te0(224) = &H38E1E1D9: Te0(225) = &H13F8F8EB: Te0(226) = &HB398982B: Te0(227) = &H33111122: Te0(228) = &HBB6969D2: Te0(229) = &H70D9D9A9: Te0(230) = &H898E8E07: Te0(231) = &HA7949433
    Te0(232) = &HB69B9B2D: Te0(233) = &H221E1E3C: Te0(234) = &H92878715: Te0(235) = &H20E9E9C9: Te0(236) = &H49CECE87: Te0(237) = &HFF5555AA: Te0(238) = &H78282850: Te0(239) = &H7ADFDFA5
    Te0(240) = &H8F8C8C03: Te0(241) = &HF8A1A159: Te0(242) = &H80898909: Te0(243) = &H170D0D1A: Te0(244) = &HDABFBF65: Te0(245) = &H31E6E6D7: Te0(246) = &HC6424284: Te0(247) = &HB86868D0
    Te0(248) = &HC3414182: Te0(249) = &HB0999929: Te0(250) = &H772D2D5A: Te0(251) = &H110F0F1E: Te0(252) = &HCBB0B07B: Te0(253) = &HFC5454A8: Te0(254) = &HD6BBBB6D: Te0(255) = &H3A16162C

    Te1(0) = &H6363C6A5:   Te1(1) = &H7C7CF884:   Te1(2) = &H7777EE99:   Te1(3) = &H7B7BF68D:   Te1(4) = &HF2F2FF0D:   Te1(5) = &H6B6BD6BD:   Te1(6) = &H6F6FDEB1:   Te1(7) = &HC5C59154
    Te1(8) = &H30306050:   Te1(9) = &H1010203:    Te1(10) = &H6767CEA9:  Te1(11) = &H2B2B567D:  Te1(12) = &HFEFEE719:  Te1(13) = &HD7D7B562:  Te1(14) = &HABAB4DE6:  Te1(15) = &H7676EC9A
    Te1(16) = &HCACA8F45:  Te1(17) = &H82821F9D:  Te1(18) = &HC9C98940:  Te1(19) = &H7D7DFA87:  Te1(20) = &HFAFAEF15:  Te1(21) = &H5959B2EB:  Te1(22) = &H47478EC9:  Te1(23) = &HF0F0FB0B
    Te1(24) = &HADAD41EC:  Te1(25) = &HD4D4B367:  Te1(26) = &HA2A25FFD:  Te1(27) = &HAFAF45EA:  Te1(28) = &H9C9C23BF:  Te1(29) = &HA4A453F7:  Te1(30) = &H7272E496:  Te1(31) = &HC0C09B5B
    Te1(32) = &HB7B775C2:  Te1(33) = &HFDFDE11C:  Te1(34) = &H93933DAE:  Te1(35) = &H26264C6A:  Te1(36) = &H36366C5A:  Te1(37) = &H3F3F7E41:  Te1(38) = &HF7F7F502:  Te1(39) = &HCCCC834F
    Te1(40) = &H3434685C:  Te1(41) = &HA5A551F4:  Te1(42) = &HE5E5D134:  Te1(43) = &HF1F1F908:  Te1(44) = &H7171E293:  Te1(45) = &HD8D8AB73:  Te1(46) = &H31316253:  Te1(47) = &H15152A3F
    Te1(48) = &H404080C:   Te1(49) = &HC7C79552:  Te1(50) = &H23234665:  Te1(51) = &HC3C39D5E:  Te1(52) = &H18183028:  Te1(53) = &H969637A1:  Te1(54) = &H5050A0F:   Te1(55) = &H9A9A2FB5
    Te1(56) = &H7070E09:   Te1(57) = &H12122436:  Te1(58) = &H80801B9B:  Te1(59) = &HE2E2DF3D:  Te1(60) = &HEBEBCD26:  Te1(61) = &H27274E69:  Te1(62) = &HB2B27FCD:  Te1(63) = &H7575EA9F
    Te1(64) = &H909121B:   Te1(65) = &H83831D9E:  Te1(66) = &H2C2C5874:  Te1(67) = &H1A1A342E:  Te1(68) = &H1B1B362D:  Te1(69) = &H6E6EDCB2:  Te1(70) = &H5A5AB4EE:  Te1(71) = &HA0A05BFB
    Te1(72) = &H5252A4F6:  Te1(73) = &H3B3B764D:  Te1(74) = &HD6D6B761:  Te1(75) = &HB3B37DCE:  Te1(76) = &H2929527B:  Te1(77) = &HE3E3DD3E:  Te1(78) = &H2F2F5E71:  Te1(79) = &H84841397
    Te1(80) = &H5353A6F5:  Te1(81) = &HD1D1B968:  Te1(82) = &H0&:        Te1(83) = &HEDEDC12C:  Te1(84) = &H20204060:  Te1(85) = &HFCFCE31F:  Te1(86) = &HB1B179C8:  Te1(87) = &H5B5BB6ED
    Te1(88) = &H6A6AD4BE:  Te1(89) = &HCBCB8D46:  Te1(90) = &HBEBE67D9:  Te1(91) = &H3939724B:  Te1(92) = &H4A4A94DE:  Te1(93) = &H4C4C98D4:  Te1(94) = &H5858B0E8:  Te1(95) = &HCFCF854A
    Te1(96) = &HD0D0BB6B:  Te1(97) = &HEFEFC52A:  Te1(98) = &HAAAA4FE5:  Te1(99) = &HFBFBED16:  Te1(100) = &H434386C5: Te1(101) = &H4D4D9AD7: Te1(102) = &H33336655: Te1(103) = &H85851194
    Te1(104) = &H45458ACF: Te1(105) = &HF9F9E910: Te1(106) = &H2020406:  Te1(107) = &H7F7FFE81: Te1(108) = &H5050A0F0: Te1(109) = &H3C3C7844: Te1(110) = &H9F9F25BA: Te1(111) = &HA8A84BE3
    Te1(112) = &H5151A2F3: Te1(113) = &HA3A35DFE: Te1(114) = &H404080C0: Te1(115) = &H8F8F058A: Te1(116) = &H92923FAD: Te1(117) = &H9D9D21BC: Te1(118) = &H38387048: Te1(119) = &HF5F5F104
    Te1(120) = &HBCBC63DF: Te1(121) = &HB6B677C1: Te1(122) = &HDADAAF75: Te1(123) = &H21214263: Te1(124) = &H10102030: Te1(125) = &HFFFFE51A: Te1(126) = &HF3F3FD0E: Te1(127) = &HD2D2BF6D
    Te1(128) = &HCDCD814C: Te1(129) = &HC0C1814:  Te1(130) = &H13132635: Te1(131) = &HECECC32F: Te1(132) = &H5F5FBEE1: Te1(133) = &H979735A2: Te1(134) = &H444488CC: Te1(135) = &H17172E39
    Te1(136) = &HC4C49357: Te1(137) = &HA7A755F2: Te1(138) = &H7E7EFC82: Te1(139) = &H3D3D7A47: Te1(140) = &H6464C8AC: Te1(141) = &H5D5DBAE7: Te1(142) = &H1919322B: Te1(143) = &H7373E695
    Te1(144) = &H6060C0A0: Te1(145) = &H81811998: Te1(146) = &H4F4F9ED1: Te1(147) = &HDCDCA37F: Te1(148) = &H22224466: Te1(149) = &H2A2A547E: Te1(150) = &H90903BAB: Te1(151) = &H88880B83
    Te1(152) = &H46468CCA: Te1(153) = &HEEEEC729: Te1(154) = &HB8B86BD3: Te1(155) = &H1414283C: Te1(156) = &HDEDEA779: Te1(157) = &H5E5EBCE2: Te1(158) = &HB0B161D:  Te1(159) = &HDBDBAD76
    Te1(160) = &HE0E0DB3B: Te1(161) = &H32326456: Te1(162) = &H3A3A744E: Te1(163) = &HA0A141E:  Te1(164) = &H494992DB: Te1(165) = &H6060C0A:  Te1(166) = &H2424486C: Te1(167) = &H5C5CB8E4
    Te1(168) = &HC2C29F5D: Te1(169) = &HD3D3BD6E: Te1(170) = &HACAC43EF: Te1(171) = &H6262C4A6: Te1(172) = &H919139A8: Te1(173) = &H959531A4: Te1(174) = &HE4E4D337: Te1(175) = &H7979F28B
    Te1(176) = &HE7E7D532: Te1(177) = &HC8C88B43: Te1(178) = &H37376E59: Te1(179) = &H6D6DDAB7: Te1(180) = &H8D8D018C: Te1(181) = &HD5D5B164: Te1(182) = &H4E4E9CD2: Te1(183) = &HA9A949E0
    Te1(184) = &H6C6CD8B4: Te1(185) = &H5656ACFA: Te1(186) = &HF4F4F307: Te1(187) = &HEAEACF25: Te1(188) = &H6565CAAF: Te1(189) = &H7A7AF48E: Te1(190) = &HAEAE47E9: Te1(191) = &H8081018
    Te1(192) = &HBABA6FD5: Te1(193) = &H7878F088: Te1(194) = &H25254A6F: Te1(195) = &H2E2E5C72: Te1(196) = &H1C1C3824: Te1(197) = &HA6A657F1: Te1(198) = &HB4B473C7: Te1(199) = &HC6C69751
    Te1(200) = &HE8E8CB23: Te1(201) = &HDDDDA17C: Te1(202) = &H7474E89C: Te1(203) = &H1F1F3E21: Te1(204) = &H4B4B96DD: Te1(205) = &HBDBD61DC: Te1(206) = &H8B8B0D86: Te1(207) = &H8A8A0F85
    Te1(208) = &H7070E090: Te1(209) = &H3E3E7C42: Te1(210) = &HB5B571C4: Te1(211) = &H6666CCAA: Te1(212) = &H484890D8: Te1(213) = &H3030605:  Te1(214) = &HF6F6F701: Te1(215) = &HE0E1C12
    Te1(216) = &H6161C2A3: Te1(217) = &H35356A5F: Te1(218) = &H5757AEF9: Te1(219) = &HB9B969D0: Te1(220) = &H86861791: Te1(221) = &HC1C19958: Te1(222) = &H1D1D3A27: Te1(223) = &H9E9E27B9
    Te1(224) = &HE1E1D938: Te1(225) = &HF8F8EB13: Te1(226) = &H98982BB3: Te1(227) = &H11112233: Te1(228) = &H6969D2BB: Te1(229) = &HD9D9A970: Te1(230) = &H8E8E0789: Te1(231) = &H949433A7
    Te1(232) = &H9B9B2DB6: Te1(233) = &H1E1E3C22: Te1(234) = &H87871592: Te1(235) = &HE9E9C920: Te1(236) = &HCECE8749: Te1(237) = &H5555AAFF: Te1(238) = &H28285078: Te1(239) = &HDFDFA57A
    Te1(240) = &H8C8C038F: Te1(241) = &HA1A159F8: Te1(242) = &H89890980: Te1(243) = &HD0D1A17:  Te1(244) = &HBFBF65DA: Te1(245) = &HE6E6D731: Te1(246) = &H424284C6: Te1(247) = &H6868D0B8
    Te1(248) = &H414182C3: Te1(249) = &H999929B0: Te1(250) = &H2D2D5A77: Te1(251) = &HF0F1E11:  Te1(252) = &HB0B07BCB: Te1(253) = &H5454A8FC: Te1(254) = &HBBBB6DD6: Te1(255) = &H16162C3A

    Te2(0) = &H63C6A563:   Te2(1) = &H7CF8847C:   Te2(2) = &H77EE9977:   Te2(3) = &H7BF68D7B:   Te2(4) = &HF2FF0DF2:   Te2(5) = &H6BD6BD6B:   Te2(6) = &H6FDEB16F:   Te2(7) = &HC59154C5
    Te2(8) = &H30605030:   Te2(9) = &H1020301:    Te2(10) = &H67CEA967:  Te2(11) = &H2B567D2B:  Te2(12) = &HFEE719FE:  Te2(13) = &HD7B562D7:  Te2(14) = &HAB4DE6AB:  Te2(15) = &H76EC9A76
    Te2(16) = &HCA8F45CA:  Te2(17) = &H821F9D82:  Te2(18) = &HC98940C9:  Te2(19) = &H7DFA877D:  Te2(20) = &HFAEF15FA:  Te2(21) = &H59B2EB59:  Te2(22) = &H478EC947:  Te2(23) = &HF0FB0BF0
    Te2(24) = &HAD41ECAD:  Te2(25) = &HD4B367D4:  Te2(26) = &HA25FFDA2:  Te2(27) = &HAF45EAAF:  Te2(28) = &H9C23BF9C:  Te2(29) = &HA453F7A4:  Te2(30) = &H72E49672:  Te2(31) = &HC09B5BC0
    Te2(32) = &HB775C2B7:  Te2(33) = &HFDE11CFD:  Te2(34) = &H933DAE93:  Te2(35) = &H264C6A26:  Te2(36) = &H366C5A36:  Te2(37) = &H3F7E413F:  Te2(38) = &HF7F502F7:  Te2(39) = &HCC834FCC
    Te2(40) = &H34685C34:  Te2(41) = &HA551F4A5:  Te2(42) = &HE5D134E5:  Te2(43) = &HF1F908F1:  Te2(44) = &H71E29371:  Te2(45) = &HD8AB73D8:  Te2(46) = &H31625331:  Te2(47) = &H152A3F15
    Te2(48) = &H4080C04:   Te2(49) = &HC79552C7:  Te2(50) = &H23466523:  Te2(51) = &HC39D5EC3:  Te2(52) = &H18302818:  Te2(53) = &H9637A196:  Te2(54) = &H50A0F05:   Te2(55) = &H9A2FB59A
    Te2(56) = &H70E0907:   Te2(57) = &H12243612:  Te2(58) = &H801B9B80:  Te2(59) = &HE2DF3DE2:  Te2(60) = &HEBCD26EB:  Te2(61) = &H274E6927:  Te2(62) = &HB27FCDB2:  Te2(63) = &H75EA9F75
    Te2(64) = &H9121B09:   Te2(65) = &H831D9E83:  Te2(66) = &H2C58742C:  Te2(67) = &H1A342E1A:  Te2(68) = &H1B362D1B:  Te2(69) = &H6EDCB26E:  Te2(70) = &H5AB4EE5A:  Te2(71) = &HA05BFBA0
    Te2(72) = &H52A4F652:  Te2(73) = &H3B764D3B:  Te2(74) = &HD6B761D6:  Te2(75) = &HB37DCEB3:  Te2(76) = &H29527B29:  Te2(77) = &HE3DD3EE3:  Te2(78) = &H2F5E712F:  Te2(79) = &H84139784
    Te2(80) = &H53A6F553:  Te2(81) = &HD1B968D1:  Te2(82) = &H0&:        Te2(83) = &HEDC12CED:  Te2(84) = &H20406020:  Te2(85) = &HFCE31FFC:  Te2(86) = &HB179C8B1:  Te2(87) = &H5BB6ED5B
    Te2(88) = &H6AD4BE6A:  Te2(89) = &HCB8D46CB:  Te2(90) = &HBE67D9BE:  Te2(91) = &H39724B39:  Te2(92) = &H4A94DE4A:  Te2(93) = &H4C98D44C:  Te2(94) = &H58B0E858:  Te2(95) = &HCF854ACF
    Te2(96) = &HD0BB6BD0:  Te2(97) = &HEFC52AEF:  Te2(98) = &HAA4FE5AA:  Te2(99) = &HFBED16FB:  Te2(100) = &H4386C543: Te2(101) = &H4D9AD74D: Te2(102) = &H33665533: Te2(103) = &H85119485
    Te2(104) = &H458ACF45: Te2(105) = &HF9E910F9: Te2(106) = &H2040602:  Te2(107) = &H7FFE817F: Te2(108) = &H50A0F050: Te2(109) = &H3C78443C: Te2(110) = &H9F25BA9F: Te2(111) = &HA84BE3A8
    Te2(112) = &H51A2F351: Te2(113) = &HA35DFEA3: Te2(114) = &H4080C040: Te2(115) = &H8F058A8F: Te2(116) = &H923FAD92: Te2(117) = &H9D21BC9D: Te2(118) = &H38704838: Te2(119) = &HF5F104F5
    Te2(120) = &HBC63DFBC: Te2(121) = &HB677C1B6: Te2(122) = &HDAAF75DA: Te2(123) = &H21426321: Te2(124) = &H10203010: Te2(125) = &HFFE51AFF: Te2(126) = &HF3FD0EF3: Te2(127) = &HD2BF6DD2
    Te2(128) = &HCD814CCD: Te2(129) = &HC18140C:  Te2(130) = &H13263513: Te2(131) = &HECC32FEC: Te2(132) = &H5FBEE15F: Te2(133) = &H9735A297: Te2(134) = &H4488CC44: Te2(135) = &H172E3917
    Te2(136) = &HC49357C4: Te2(137) = &HA755F2A7: Te2(138) = &H7EFC827E: Te2(139) = &H3D7A473D: Te2(140) = &H64C8AC64: Te2(141) = &H5DBAE75D: Te2(142) = &H19322B19: Te2(143) = &H73E69573
    Te2(144) = &H60C0A060: Te2(145) = &H81199881: Te2(146) = &H4F9ED14F: Te2(147) = &HDCA37FDC: Te2(148) = &H22446622: Te2(149) = &H2A547E2A: Te2(150) = &H903BAB90: Te2(151) = &H880B8388
    Te2(152) = &H468CCA46: Te2(153) = &HEEC729EE: Te2(154) = &HB86BD3B8: Te2(155) = &H14283C14: Te2(156) = &HDEA779DE: Te2(157) = &H5EBCE25E: Te2(158) = &HB161D0B:  Te2(159) = &HDBAD76DB
    Te2(160) = &HE0DB3BE0: Te2(161) = &H32645632: Te2(162) = &H3A744E3A: Te2(163) = &HA141E0A:  Te2(164) = &H4992DB49: Te2(165) = &H60C0A06:  Te2(166) = &H24486C24: Te2(167) = &H5CB8E45C
    Te2(168) = &HC29F5DC2: Te2(169) = &HD3BD6ED3: Te2(170) = &HAC43EFAC: Te2(171) = &H62C4A662: Te2(172) = &H9139A891: Te2(173) = &H9531A495: Te2(174) = &HE4D337E4: Te2(175) = &H79F28B79
    Te2(176) = &HE7D532E7: Te2(177) = &HC88B43C8: Te2(178) = &H376E5937: Te2(179) = &H6DDAB76D: Te2(180) = &H8D018C8D: Te2(181) = &HD5B164D5: Te2(182) = &H4E9CD24E: Te2(183) = &HA949E0A9
    Te2(184) = &H6CD8B46C: Te2(185) = &H56ACFA56: Te2(186) = &HF4F307F4: Te2(187) = &HEACF25EA: Te2(188) = &H65CAAF65: Te2(189) = &H7AF48E7A: Te2(190) = &HAE47E9AE: Te2(191) = &H8101808
    Te2(192) = &HBA6FD5BA: Te2(193) = &H78F08878: Te2(194) = &H254A6F25: Te2(195) = &H2E5C722E: Te2(196) = &H1C38241C: Te2(197) = &HA657F1A6: Te2(198) = &HB473C7B4: Te2(199) = &HC69751C6
    Te2(200) = &HE8CB23E8: Te2(201) = &HDDA17CDD: Te2(202) = &H74E89C74: Te2(203) = &H1F3E211F: Te2(204) = &H4B96DD4B: Te2(205) = &HBD61DCBD: Te2(206) = &H8B0D868B: Te2(207) = &H8A0F858A
    Te2(208) = &H70E09070: Te2(209) = &H3E7C423E: Te2(210) = &HB571C4B5: Te2(211) = &H66CCAA66: Te2(212) = &H4890D848: Te2(213) = &H3060503:  Te2(214) = &HF6F701F6: Te2(215) = &HE1C120E
    Te2(216) = &H61C2A361: Te2(217) = &H356A5F35: Te2(218) = &H57AEF957: Te2(219) = &HB969D0B9: Te2(220) = &H86179186: Te2(221) = &HC19958C1: Te2(222) = &H1D3A271D: Te2(223) = &H9E27B99E
    Te2(224) = &HE1D938E1: Te2(225) = &HF8EB13F8: Te2(226) = &H982BB398: Te2(227) = &H11223311: Te2(228) = &H69D2BB69: Te2(229) = &HD9A970D9: Te2(230) = &H8E07898E: Te2(231) = &H9433A794
    Te2(232) = &H9B2DB69B: Te2(233) = &H1E3C221E: Te2(234) = &H87159287: Te2(235) = &HE9C920E9: Te2(236) = &HCE8749CE: Te2(237) = &H55AAFF55: Te2(238) = &H28507828: Te2(239) = &HDFA57ADF
    Te2(240) = &H8C038F8C: Te2(241) = &HA159F8A1: Te2(242) = &H89098089: Te2(243) = &HD1A170D:  Te2(244) = &HBF65DABF: Te2(245) = &HE6D731E6: Te2(246) = &H4284C642: Te2(247) = &H68D0B868
    Te2(248) = &H4182C341: Te2(249) = &H9929B099: Te2(250) = &H2D5A772D: Te2(251) = &HF1E110F:  Te2(252) = &HB07BCBB0: Te2(253) = &H54A8FC54: Te2(254) = &HBB6DD6BB: Te2(255) = &H162C3A16

    Te3(0) = &HC6A56363:   Te3(1) = &HF8847C7C:   Te3(2) = &HEE997777:   Te3(3) = &HF68D7B7B:   Te3(4) = &HFF0DF2F2:   Te3(5) = &HD6BD6B6B:   Te3(6) = &HDEB16F6F:   Te3(7) = &H9154C5C5
    Te3(8) = &H60503030:   Te3(9) = &H2030101:    Te3(10) = &HCEA96767:  Te3(11) = &H567D2B2B:  Te3(12) = &HE719FEFE:  Te3(13) = &HB562D7D7:  Te3(14) = &H4DE6ABAB:  Te3(15) = &HEC9A7676
    Te3(16) = &H8F45CACA:  Te3(17) = &H1F9D8282:  Te3(18) = &H8940C9C9:  Te3(19) = &HFA877D7D:  Te3(20) = &HEF15FAFA:  Te3(21) = &HB2EB5959:  Te3(22) = &H8EC94747:  Te3(23) = &HFB0BF0F0
    Te3(24) = &H41ECADAD:  Te3(25) = &HB367D4D4:  Te3(26) = &H5FFDA2A2:  Te3(27) = &H45EAAFAF:  Te3(28) = &H23BF9C9C:  Te3(29) = &H53F7A4A4:  Te3(30) = &HE4967272:  Te3(31) = &H9B5BC0C0
    Te3(32) = &H75C2B7B7:  Te3(33) = &HE11CFDFD:  Te3(34) = &H3DAE9393:  Te3(35) = &H4C6A2626:  Te3(36) = &H6C5A3636:  Te3(37) = &H7E413F3F:  Te3(38) = &HF502F7F7:  Te3(39) = &H834FCCCC
    Te3(40) = &H685C3434:  Te3(41) = &H51F4A5A5:  Te3(42) = &HD134E5E5:  Te3(43) = &HF908F1F1:  Te3(44) = &HE2937171:  Te3(45) = &HAB73D8D8:  Te3(46) = &H62533131:  Te3(47) = &H2A3F1515
    Te3(48) = &H80C0404:   Te3(49) = &H9552C7C7:  Te3(50) = &H46652323:  Te3(51) = &H9D5EC3C3:  Te3(52) = &H30281818:  Te3(53) = &H37A19696:  Te3(54) = &HA0F0505:   Te3(55) = &H2FB59A9A
    Te3(56) = &HE090707:   Te3(57) = &H24361212:  Te3(58) = &H1B9B8080:  Te3(59) = &HDF3DE2E2:  Te3(60) = &HCD26EBEB:  Te3(61) = &H4E692727:  Te3(62) = &H7FCDB2B2:  Te3(63) = &HEA9F7575
    Te3(64) = &H121B0909:  Te3(65) = &H1D9E8383:  Te3(66) = &H58742C2C:  Te3(67) = &H342E1A1A:  Te3(68) = &H362D1B1B:  Te3(69) = &HDCB26E6E:  Te3(70) = &HB4EE5A5A:  Te3(71) = &H5BFBA0A0
    Te3(72) = &HA4F65252:  Te3(73) = &H764D3B3B:  Te3(74) = &HB761D6D6:  Te3(75) = &H7DCEB3B3:  Te3(76) = &H527B2929:  Te3(77) = &HDD3EE3E3:  Te3(78) = &H5E712F2F:  Te3(79) = &H13978484
    Te3(80) = &HA6F55353:  Te3(81) = &HB968D1D1:  Te3(82) = &H0&:        Te3(83) = &HC12CEDED:  Te3(84) = &H40602020:  Te3(85) = &HE31FFCFC:  Te3(86) = &H79C8B1B1:  Te3(87) = &HB6ED5B5B
    Te3(88) = &HD4BE6A6A:  Te3(89) = &H8D46CBCB:  Te3(90) = &H67D9BEBE:  Te3(91) = &H724B3939:  Te3(92) = &H94DE4A4A:  Te3(93) = &H98D44C4C:  Te3(94) = &HB0E85858:  Te3(95) = &H854ACFCF
    Te3(96) = &HBB6BD0D0:  Te3(97) = &HC52AEFEF:  Te3(98) = &H4FE5AAAA:  Te3(99) = &HED16FBFB:  Te3(100) = &H86C54343: Te3(101) = &H9AD74D4D: Te3(102) = &H66553333: Te3(103) = &H11948585
    Te3(104) = &H8ACF4545: Te3(105) = &HE910F9F9: Te3(106) = &H4060202:  Te3(107) = &HFE817F7F: Te3(108) = &HA0F05050: Te3(109) = &H78443C3C: Te3(110) = &H25BA9F9F: Te3(111) = &H4BE3A8A8
    Te3(112) = &HA2F35151: Te3(113) = &H5DFEA3A3: Te3(114) = &H80C04040: Te3(115) = &H58A8F8F:  Te3(116) = &H3FAD9292: Te3(117) = &H21BC9D9D: Te3(118) = &H70483838: Te3(119) = &HF104F5F5
    Te3(120) = &H63DFBCBC: Te3(121) = &H77C1B6B6: Te3(122) = &HAF75DADA: Te3(123) = &H42632121: Te3(124) = &H20301010: Te3(125) = &HE51AFFFF: Te3(126) = &HFD0EF3F3: Te3(127) = &HBF6DD2D2
    Te3(128) = &H814CCDCD: Te3(129) = &H18140C0C: Te3(130) = &H26351313: Te3(131) = &HC32FECEC: Te3(132) = &HBEE15F5F: Te3(133) = &H35A29797: Te3(134) = &H88CC4444: Te3(135) = &H2E391717
    Te3(136) = &H9357C4C4: Te3(137) = &H55F2A7A7: Te3(138) = &HFC827E7E: Te3(139) = &H7A473D3D: Te3(140) = &HC8AC6464: Te3(141) = &HBAE75D5D: Te3(142) = &H322B1919: Te3(143) = &HE6957373
    Te3(144) = &HC0A06060: Te3(145) = &H19988181: Te3(146) = &H9ED14F4F: Te3(147) = &HA37FDCDC: Te3(148) = &H44662222: Te3(149) = &H547E2A2A: Te3(150) = &H3BAB9090: Te3(151) = &HB838888
    Te3(152) = &H8CCA4646: Te3(153) = &HC729EEEE: Te3(154) = &H6BD3B8B8: Te3(155) = &H283C1414: Te3(156) = &HA779DEDE: Te3(157) = &HBCE25E5E: Te3(158) = &H161D0B0B: Te3(159) = &HAD76DBDB
    Te3(160) = &HDB3BE0E0: Te3(161) = &H64563232: Te3(162) = &H744E3A3A: Te3(163) = &H141E0A0A: Te3(164) = &H92DB4949: Te3(165) = &HC0A0606:  Te3(166) = &H486C2424: Te3(167) = &HB8E45C5C
    Te3(168) = &H9F5DC2C2: Te3(169) = &HBD6ED3D3: Te3(170) = &H43EFACAC: Te3(171) = &HC4A66262: Te3(172) = &H39A89191: Te3(173) = &H31A49595: Te3(174) = &HD337E4E4: Te3(175) = &HF28B7979
    Te3(176) = &HD532E7E7: Te3(177) = &H8B43C8C8: Te3(178) = &H6E593737: Te3(179) = &HDAB76D6D: Te3(180) = &H18C8D8D:  Te3(181) = &HB164D5D5: Te3(182) = &H9CD24E4E: Te3(183) = &H49E0A9A9
    Te3(184) = &HD8B46C6C: Te3(185) = &HACFA5656: Te3(186) = &HF307F4F4: Te3(187) = &HCF25EAEA: Te3(188) = &HCAAF6565: Te3(189) = &HF48E7A7A: Te3(190) = &H47E9AEAE: Te3(191) = &H10180808
    Te3(192) = &H6FD5BABA: Te3(193) = &HF0887878: Te3(194) = &H4A6F2525: Te3(195) = &H5C722E2E: Te3(196) = &H38241C1C: Te3(197) = &H57F1A6A6: Te3(198) = &H73C7B4B4: Te3(199) = &H9751C6C6
    Te3(200) = &HCB23E8E8: Te3(201) = &HA17CDDDD: Te3(202) = &HE89C7474: Te3(203) = &H3E211F1F: Te3(204) = &H96DD4B4B: Te3(205) = &H61DCBDBD: Te3(206) = &HD868B8B:  Te3(207) = &HF858A8A
    Te3(208) = &HE0907070: Te3(209) = &H7C423E3E: Te3(210) = &H71C4B5B5: Te3(211) = &HCCAA6666: Te3(212) = &H90D84848: Te3(213) = &H6050303:  Te3(214) = &HF701F6F6: Te3(215) = &H1C120E0E
    Te3(216) = &HC2A36161: Te3(217) = &H6A5F3535: Te3(218) = &HAEF95757: Te3(219) = &H69D0B9B9: Te3(220) = &H17918686: Te3(221) = &H9958C1C1: Te3(222) = &H3A271D1D: Te3(223) = &H27B99E9E
    Te3(224) = &HD938E1E1: Te3(225) = &HEB13F8F8: Te3(226) = &H2BB39898: Te3(227) = &H22331111: Te3(228) = &HD2BB6969: Te3(229) = &HA970D9D9: Te3(230) = &H7898E8E:  Te3(231) = &H33A79494
    Te3(232) = &H2DB69B9B: Te3(233) = &H3C221E1E: Te3(234) = &H15928787: Te3(235) = &HC920E9E9: Te3(236) = &H8749CECE: Te3(237) = &HAAFF5555: Te3(238) = &H50782828: Te3(239) = &HA57ADFDF
    Te3(240) = &H38F8C8C:  Te3(241) = &H59F8A1A1: Te3(242) = &H9808989:  Te3(243) = &H1A170D0D: Te3(244) = &H65DABFBF: Te3(245) = &HD731E6E6: Te3(246) = &H84C64242: Te3(247) = &HD0B86868
    Te3(248) = &H82C34141: Te3(249) = &H29B09999: Te3(250) = &H5A772D2D: Te3(251) = &H1E110F0F: Te3(252) = &H7BCBB0B0: Te3(253) = &HA8FC5454: Te3(254) = &H6DD6BBBB: Te3(255) = &H2C3A1616

    Te4(0) = &H63636363:   Te4(1) = &H7C7C7C7C:   Te4(2) = &H77777777:   Te4(3) = &H7B7B7B7B:   Te4(4) = &HF2F2F2F2:   Te4(5) = &H6B6B6B6B:   Te4(6) = &H6F6F6F6F:   Te4(7) = &HC5C5C5C5
    Te4(8) = &H30303030:   Te4(9) = &H1010101:    Te4(10) = &H67676767:  Te4(11) = &H2B2B2B2B:  Te4(12) = &HFEFEFEFE:  Te4(13) = &HD7D7D7D7:  Te4(14) = &HABABABAB:  Te4(15) = &H76767676
    Te4(16) = &HCACACACA:  Te4(17) = &H82828282:  Te4(18) = &HC9C9C9C9:  Te4(19) = &H7D7D7D7D:  Te4(20) = &HFAFAFAFA:  Te4(21) = &H59595959:  Te4(22) = &H47474747:  Te4(23) = &HF0F0F0F0
    Te4(24) = &HADADADAD:  Te4(25) = &HD4D4D4D4:  Te4(26) = &HA2A2A2A2:  Te4(27) = &HAFAFAFAF:  Te4(28) = &H9C9C9C9C:  Te4(29) = &HA4A4A4A4:  Te4(30) = &H72727272:  Te4(31) = &HC0C0C0C0
    Te4(32) = &HB7B7B7B7:  Te4(33) = &HFDFDFDFD:  Te4(34) = &H93939393:  Te4(35) = &H26262626:  Te4(36) = &H36363636:  Te4(37) = &H3F3F3F3F:  Te4(38) = &HF7F7F7F7:  Te4(39) = &HCCCCCCCC
    Te4(40) = &H34343434:  Te4(41) = &HA5A5A5A5:  Te4(42) = &HE5E5E5E5:  Te4(43) = &HF1F1F1F1:  Te4(44) = &H71717171:  Te4(45) = &HD8D8D8D8:  Te4(46) = &H31313131:  Te4(47) = &H15151515
    Te4(48) = &H4040404:   Te4(49) = &HC7C7C7C7:  Te4(50) = &H23232323:  Te4(51) = &HC3C3C3C3:  Te4(52) = &H18181818:  Te4(53) = &H96969696:  Te4(54) = &H5050505:   Te4(55) = &H9A9A9A9A
    Te4(56) = &H7070707:   Te4(57) = &H12121212:  Te4(58) = &H80808080:  Te4(59) = &HE2E2E2E2:  Te4(60) = &HEBEBEBEB:  Te4(61) = &H27272727:  Te4(62) = &HB2B2B2B2:  Te4(63) = &H75757575
    Te4(64) = &H9090909:   Te4(65) = &H83838383:  Te4(66) = &H2C2C2C2C:  Te4(67) = &H1A1A1A1A:  Te4(68) = &H1B1B1B1B:  Te4(69) = &H6E6E6E6E:  Te4(70) = &H5A5A5A5A:  Te4(71) = &HA0A0A0A0
    Te4(72) = &H52525252:  Te4(73) = &H3B3B3B3B:  Te4(74) = &HD6D6D6D6:  Te4(75) = &HB3B3B3B3:  Te4(76) = &H29292929:  Te4(77) = &HE3E3E3E3:  Te4(78) = &H2F2F2F2F:  Te4(79) = &H84848484
    Te4(80) = &H53535353:  Te4(81) = &HD1D1D1D1:  Te4(82) = &H0&:        Te4(83) = &HEDEDEDED:  Te4(84) = &H20202020:  Te4(85) = &HFCFCFCFC:  Te4(86) = &HB1B1B1B1:  Te4(87) = &H5B5B5B5B
    Te4(88) = &H6A6A6A6A:  Te4(89) = &HCBCBCBCB:  Te4(90) = &HBEBEBEBE:  Te4(91) = &H39393939:  Te4(92) = &H4A4A4A4A:  Te4(93) = &H4C4C4C4C:  Te4(94) = &H58585858:  Te4(95) = &HCFCFCFCF
    Te4(96) = &HD0D0D0D0:  Te4(97) = &HEFEFEFEF:  Te4(98) = &HAAAAAAAA:  Te4(99) = &HFBFBFBFB:  Te4(100) = &H43434343: Te4(101) = &H4D4D4D4D: Te4(102) = &H33333333: Te4(103) = &H85858585
    Te4(104) = &H45454545: Te4(105) = &HF9F9F9F9: Te4(106) = &H2020202:  Te4(107) = &H7F7F7F7F: Te4(108) = &H50505050: Te4(109) = &H3C3C3C3C: Te4(110) = &H9F9F9F9F: Te4(111) = &HA8A8A8A8
    Te4(112) = &H51515151: Te4(113) = &HA3A3A3A3: Te4(114) = &H40404040: Te4(115) = &H8F8F8F8F: Te4(116) = &H92929292: Te4(117) = &H9D9D9D9D: Te4(118) = &H38383838: Te4(119) = &HF5F5F5F5
    Te4(120) = &HBCBCBCBC: Te4(121) = &HB6B6B6B6: Te4(122) = &HDADADADA: Te4(123) = &H21212121: Te4(124) = &H10101010: Te4(125) = &HFFFFFFFF: Te4(126) = &HF3F3F3F3: Te4(127) = &HD2D2D2D2
    Te4(128) = &HCDCDCDCD: Te4(129) = &HC0C0C0C:  Te4(130) = &H13131313: Te4(131) = &HECECECEC: Te4(132) = &H5F5F5F5F: Te4(133) = &H97979797: Te4(134) = &H44444444: Te4(135) = &H17171717
    Te4(136) = &HC4C4C4C4: Te4(137) = &HA7A7A7A7: Te4(138) = &H7E7E7E7E: Te4(139) = &H3D3D3D3D: Te4(140) = &H64646464: Te4(141) = &H5D5D5D5D: Te4(142) = &H19191919: Te4(143) = &H73737373
    Te4(144) = &H60606060: Te4(145) = &H81818181: Te4(146) = &H4F4F4F4F: Te4(147) = &HDCDCDCDC: Te4(148) = &H22222222: Te4(149) = &H2A2A2A2A: Te4(150) = &H90909090: Te4(151) = &H88888888
    Te4(152) = &H46464646: Te4(153) = &HEEEEEEEE: Te4(154) = &HB8B8B8B8: Te4(155) = &H14141414: Te4(156) = &HDEDEDEDE: Te4(157) = &H5E5E5E5E: Te4(158) = &HB0B0B0B:  Te4(159) = &HDBDBDBDB
    Te4(160) = &HE0E0E0E0: Te4(161) = &H32323232: Te4(162) = &H3A3A3A3A: Te4(163) = &HA0A0A0A:  Te4(164) = &H49494949: Te4(165) = &H6060606:  Te4(166) = &H24242424: Te4(167) = &H5C5C5C5C
    Te4(168) = &HC2C2C2C2: Te4(169) = &HD3D3D3D3: Te4(170) = &HACACACAC: Te4(171) = &H62626262: Te4(172) = &H91919191: Te4(173) = &H95959595: Te4(174) = &HE4E4E4E4: Te4(175) = &H79797979
    Te4(176) = &HE7E7E7E7: Te4(177) = &HC8C8C8C8: Te4(178) = &H37373737: Te4(179) = &H6D6D6D6D: Te4(180) = &H8D8D8D8D: Te4(181) = &HD5D5D5D5: Te4(182) = &H4E4E4E4E: Te4(183) = &HA9A9A9A9
    Te4(184) = &H6C6C6C6C: Te4(185) = &H56565656: Te4(186) = &HF4F4F4F4: Te4(187) = &HEAEAEAEA: Te4(188) = &H65656565: Te4(189) = &H7A7A7A7A: Te4(190) = &HAEAEAEAE: Te4(191) = &H8080808
    Te4(192) = &HBABABABA: Te4(193) = &H78787878: Te4(194) = &H25252525: Te4(195) = &H2E2E2E2E: Te4(196) = &H1C1C1C1C: Te4(197) = &HA6A6A6A6: Te4(198) = &HB4B4B4B4: Te4(199) = &HC6C6C6C6
    Te4(200) = &HE8E8E8E8: Te4(201) = &HDDDDDDDD: Te4(202) = &H74747474: Te4(203) = &H1F1F1F1F: Te4(204) = &H4B4B4B4B: Te4(205) = &HBDBDBDBD: Te4(206) = &H8B8B8B8B: Te4(207) = &H8A8A8A8A
    Te4(208) = &H70707070: Te4(209) = &H3E3E3E3E: Te4(210) = &HB5B5B5B5: Te4(211) = &H66666666: Te4(212) = &H48484848: Te4(213) = &H3030303:  Te4(214) = &HF6F6F6F6: Te4(215) = &HE0E0E0E
    Te4(216) = &H61616161: Te4(217) = &H35353535: Te4(218) = &H57575757: Te4(219) = &HB9B9B9B9: Te4(220) = &H86868686: Te4(221) = &HC1C1C1C1: Te4(222) = &H1D1D1D1D: Te4(223) = &H9E9E9E9E
    Te4(224) = &HE1E1E1E1: Te4(225) = &HF8F8F8F8: Te4(226) = &H98989898: Te4(227) = &H11111111: Te4(228) = &H69696969: Te4(229) = &HD9D9D9D9: Te4(230) = &H8E8E8E8E: Te4(231) = &H94949494
    Te4(232) = &H9B9B9B9B: Te4(233) = &H1E1E1E1E: Te4(234) = &H87878787: Te4(235) = &HE9E9E9E9: Te4(236) = &HCECECECE: Te4(237) = &H55555555: Te4(238) = &H28282828: Te4(239) = &HDFDFDFDF
    Te4(240) = &H8C8C8C8C: Te4(241) = &HA1A1A1A1: Te4(242) = &H89898989: Te4(243) = &HD0D0D0D:  Te4(244) = &HBFBFBFBF: Te4(245) = &HE6E6E6E6: Te4(246) = &H42424242: Te4(247) = &H68686868
    Te4(248) = &H41414141: Te4(249) = &H99999999: Te4(250) = &H2D2D2D2D: Te4(251) = &HF0F0F0F:  Te4(252) = &HB0B0B0B0: Te4(253) = &H54545454: Te4(254) = &HBBBBBBBB: Te4(255) = &H16161616

    Td0(0) = &H50A7F451:   Td0(1) = &H5365417E:   Td0(2) = &HC3A4171A:   Td0(3) = &H965E273A:   Td0(4) = &HCB6BAB3B:   Td0(5) = &HF1459D1F:   Td0(6) = &HAB58FAAC:   Td0(7) = &H9303E34B
    Td0(8) = &H55FA3020:   Td0(9) = &HF66D76AD:   Td0(10) = &H9176CC88:  Td0(11) = &H254C02F5:  Td0(12) = &HFCD7E54F:  Td0(13) = &HD7CB2AC5:  Td0(14) = &H80443526:  Td0(15) = &H8FA362B5
    Td0(16) = &H495AB1DE:  Td0(17) = &H671BBA25:  Td0(18) = &H980EEA45:  Td0(19) = &HE1C0FE5D:  Td0(20) = &H2752FC3:   Td0(21) = &H12F04C81:  Td0(22) = &HA397468D:  Td0(23) = &HC6F9D36B
    Td0(24) = &HE75F8F03:  Td0(25) = &H959C9215:  Td0(26) = &HEB7A6DBF:  Td0(27) = &HDA595295:  Td0(28) = &H2D83BED4:  Td0(29) = &HD3217458:  Td0(30) = &H2969E049:  Td0(31) = &H44C8C98E
    Td0(32) = &H6A89C275:  Td0(33) = &H78798EF4:  Td0(34) = &H6B3E5899:  Td0(35) = &HDD71B927:  Td0(36) = &HB64FE1BE:  Td0(37) = &H17AD88F0:  Td0(38) = &H66AC20C9:  Td0(39) = &HB43ACE7D
    Td0(40) = &H184ADF63:  Td0(41) = &H82311AE5:  Td0(42) = &H60335197:  Td0(43) = &H457F5362:  Td0(44) = &HE07764B1:  Td0(45) = &H84AE6BBB:  Td0(46) = &H1CA081FE:  Td0(47) = &H942B08F9
    Td0(48) = &H58684870:  Td0(49) = &H19FD458F:  Td0(50) = &H876CDE94:  Td0(51) = &HB7F87B52:  Td0(52) = &H23D373AB:  Td0(53) = &HE2024B72:  Td0(54) = &H578F1FE3:  Td0(55) = &H2AAB5566
    Td0(56) = &H728EBB2:   Td0(57) = &H3C2B52F:   Td0(58) = &H9A7BC586:  Td0(59) = &HA50837D3:  Td0(60) = &HF2872830:  Td0(61) = &HB2A5BF23:  Td0(62) = &HBA6A0302:  Td0(63) = &H5C8216ED
    Td0(64) = &H2B1CCF8A:  Td0(65) = &H92B479A7:  Td0(66) = &HF0F207F3:  Td0(67) = &HA1E2694E:  Td0(68) = &HCDF4DA65:  Td0(69) = &HD5BE0506:  Td0(70) = &H1F6234D1:  Td0(71) = &H8AFEA6C4
    Td0(72) = &H9D532E34:  Td0(73) = &HA055F3A2:  Td0(74) = &H32E18A05:  Td0(75) = &H75EBF6A4:  Td0(76) = &H39EC830B:  Td0(77) = &HAAEF6040:  Td0(78) = &H69F715E:   Td0(79) = &H51106EBD
    Td0(80) = &HF98A213E:  Td0(81) = &H3D06DD96:  Td0(82) = &HAE053EDD:  Td0(83) = &H46BDE64D:  Td0(84) = &HB58D5491:  Td0(85) = &H55DC471:   Td0(86) = &H6FD40604:  Td0(87) = &HFF155060
    Td0(88) = &H24FB9819:  Td0(89) = &H97E9BDD6:  Td0(90) = &HCC434089:  Td0(91) = &H779ED967:  Td0(92) = &HBD42E8B0:  Td0(93) = &H888B8907:  Td0(94) = &H385B19E7:  Td0(95) = &HDBEEC879
    Td0(96) = &H470A7CA1:  Td0(97) = &HE90F427C:  Td0(98) = &HC91E84F8:  Td0(99) = &H0&:        Td0(100) = &H83868009: Td0(101) = &H48ED2B32: Td0(102) = &HAC70111E: Td0(103) = &H4E725A6C
    Td0(104) = &HFBFF0EFD: Td0(105) = &H5638850F: Td0(106) = &H1ED5AE3D: Td0(107) = &H27392D36: Td0(108) = &H64D90F0A: Td0(109) = &H21A65C68: Td0(110) = &HD1545B9B: Td0(111) = &H3A2E3624
    Td0(112) = &HB1670A0C: Td0(113) = &HFE75793:  Td0(114) = &HD296EEB4: Td0(115) = &H9E919B1B: Td0(116) = &H4FC5C080: Td0(117) = &HA220DC61: Td0(118) = &H694B775A: Td0(119) = &H161A121C
    Td0(120) = &HABA93E2:  Td0(121) = &HE52AA0C0: Td0(122) = &H43E0223C: Td0(123) = &H1D171B12: Td0(124) = &HB0D090E:  Td0(125) = &HADC78BF2: Td0(126) = &HB9A8B62D: Td0(127) = &HC8A91E14
    Td0(128) = &H8519F157: Td0(129) = &H4C0775AF: Td0(130) = &HBBDD99EE: Td0(131) = &HFD607FA3: Td0(132) = &H9F2601F7: Td0(133) = &HBCF5725C: Td0(134) = &HC53B6644: Td0(135) = &H347EFB5B
    Td0(136) = &H7629438B: Td0(137) = &HDCC623CB: Td0(138) = &H68FCEDB6: Td0(139) = &H63F1E4B8: Td0(140) = &HCADC31D7: Td0(141) = &H10856342: Td0(142) = &H40229713: Td0(143) = &H2011C684
    Td0(144) = &H7D244A85: Td0(145) = &HF83DBBD2: Td0(146) = &H1132F9AE: Td0(147) = &H6DA129C7: Td0(148) = &H4B2F9E1D: Td0(149) = &HF330B2DC: Td0(150) = &HEC52860D: Td0(151) = &HD0E3C177
    Td0(152) = &H6C16B32B: Td0(153) = &H99B970A9: Td0(154) = &HFA489411: Td0(155) = &H2264E947: Td0(156) = &HC48CFCA8: Td0(157) = &H1A3FF0A0: Td0(158) = &HD82C7D56: Td0(159) = &HEF903322
    Td0(160) = &HC74E4987: Td0(161) = &HC1D138D9: Td0(162) = &HFEA2CA8C: Td0(163) = &H360BD498: Td0(164) = &HCF81F5A6: Td0(165) = &H28DE7AA5: Td0(166) = &H268EB7DA: Td0(167) = &HA4BFAD3F
    Td0(168) = &HE49D3A2C: Td0(169) = &HD927850:  Td0(170) = &H9BCC5F6A: Td0(171) = &H62467E54: Td0(172) = &HC2138DF6: Td0(173) = &HE8B8D890: Td0(174) = &H5EF7392E: Td0(175) = &HF5AFC382
    Td0(176) = &HBE805D9F: Td0(177) = &H7C93D069: Td0(178) = &HA92DD56F: Td0(179) = &HB31225CF: Td0(180) = &H3B99ACC8: Td0(181) = &HA77D1810: Td0(182) = &H6E639CE8: Td0(183) = &H7BBB3BDB
    Td0(184) = &H97826CD:  Td0(185) = &HF418596E: Td0(186) = &H1B79AEC:  Td0(187) = &HA89A4F83: Td0(188) = &H656E95E6: Td0(189) = &H7EE6FFAA: Td0(190) = &H8CFBC21:  Td0(191) = &HE6E815EF
    Td0(192) = &HD99BE7BA: Td0(193) = &HCE366F4A: Td0(194) = &HD4099FEA: Td0(195) = &HD67CB029: Td0(196) = &HAFB2A431: Td0(197) = &H31233F2A: Td0(198) = &H3094A5C6: Td0(199) = &HC066A235
    Td0(200) = &H37BC4E74: Td0(201) = &HA6CA82FC: Td0(202) = &HB0D090E0: Td0(203) = &H15D8A733: Td0(204) = &H4A9804F1: Td0(205) = &HF7DAEC41: Td0(206) = &HE50CD7F:  Td0(207) = &H2FF69117
    Td0(208) = &H8DD64D76: Td0(209) = &H4DB0EF43: Td0(210) = &H544DAACC: Td0(211) = &HDF0496E4: Td0(212) = &HE3B5D19E: Td0(213) = &H1B886A4C: Td0(214) = &HB81F2CC1: Td0(215) = &H7F516546
    Td0(216) = &H4EA5E9D:  Td0(217) = &H5D358C01: Td0(218) = &H737487FA: Td0(219) = &H2E410BFB: Td0(220) = &H5A1D67B3: Td0(221) = &H52D2DB92: Td0(222) = &H335610E9: Td0(223) = &H1347D66D
    Td0(224) = &H8C61D79A: Td0(225) = &H7A0CA137: Td0(226) = &H8E14F859: Td0(227) = &H893C13EB: Td0(228) = &HEE27A9CE: Td0(229) = &H35C961B7: Td0(230) = &HEDE51CE1: Td0(231) = &H3CB1477A
    Td0(232) = &H59DFD29C: Td0(233) = &H3F73F255: Td0(234) = &H79CE1418: Td0(235) = &HBF37C773: Td0(236) = &HEACDF753: Td0(237) = &H5BAAFD5F: Td0(238) = &H146F3DDF: Td0(239) = &H86DB4478
    Td0(240) = &H81F3AFCA: Td0(241) = &H3EC468B9: Td0(242) = &H2C342438: Td0(243) = &H5F40A3C2: Td0(244) = &H72C31D16: Td0(245) = &HC25E2BC:  Td0(246) = &H8B493C28: Td0(247) = &H41950DFF
    Td0(248) = &H7101A839: Td0(249) = &HDEB30C08: Td0(250) = &H9CE4B4D8: Td0(251) = &H90C15664: Td0(252) = &H6184CB7B: Td0(253) = &H70B632D5: Td0(254) = &H745C6C48: Td0(255) = &H4257B8D0

    Td1(0) = &HA7F45150:   Td1(1) = &H65417E53:   Td1(2) = &HA4171AC3:   Td1(3) = &H5E273A96:   Td1(4) = &H6BAB3BCB:   Td1(5) = &H459D1FF1:   Td1(6) = &H58FAACAB:   Td1(7) = &H3E34B93
    Td1(8) = &HFA302055:   Td1(9) = &H6D76ADF6:   Td1(10) = &H76CC8891:  Td1(11) = &H4C02F525:  Td1(12) = &HD7E54FFC:  Td1(13) = &HCB2AC5D7:  Td1(14) = &H44352680:  Td1(15) = &HA362B58F
    Td1(16) = &H5AB1DE49:  Td1(17) = &H1BBA2567:  Td1(18) = &HEEA4598:   Td1(19) = &HC0FE5DE1:  Td1(20) = &H752FC302:  Td1(21) = &HF04C8112:  Td1(22) = &H97468DA3:  Td1(23) = &HF9D36BC6
    Td1(24) = &H5F8F03E7:  Td1(25) = &H9C921595:  Td1(26) = &H7A6DBFEB:  Td1(27) = &H595295DA:  Td1(28) = &H83BED42D:  Td1(29) = &H217458D3:  Td1(30) = &H69E04929:  Td1(31) = &HC8C98E44
    Td1(32) = &H89C2756A:  Td1(33) = &H798EF478:  Td1(34) = &H3E58996B:  Td1(35) = &H71B927DD:  Td1(36) = &H4FE1BEB6:  Td1(37) = &HAD88F017:  Td1(38) = &HAC20C966:  Td1(39) = &H3ACE7DB4
    Td1(40) = &H4ADF6318:  Td1(41) = &H311AE582:  Td1(42) = &H33519760:  Td1(43) = &H7F536245:  Td1(44) = &H7764B1E0:  Td1(45) = &HAE6BBB84:  Td1(46) = &HA081FE1C:  Td1(47) = &H2B08F994
    Td1(48) = &H68487058:  Td1(49) = &HFD458F19:  Td1(50) = &H6CDE9487:  Td1(51) = &HF87B52B7:  Td1(52) = &HD373AB23:  Td1(53) = &H24B72E2:   Td1(54) = &H8F1FE357:  Td1(55) = &HAB55662A
    Td1(56) = &H28EBB207:  Td1(57) = &HC2B52F03:  Td1(58) = &H7BC5869A:  Td1(59) = &H837D3A5:   Td1(60) = &H872830F2:  Td1(61) = &HA5BF23B2:  Td1(62) = &H6A0302BA:  Td1(63) = &H8216ED5C
    Td1(64) = &H1CCF8A2B:  Td1(65) = &HB479A792:  Td1(66) = &HF207F3F0:  Td1(67) = &HE2694EA1:  Td1(68) = &HF4DA65CD:  Td1(69) = &HBE0506D5:  Td1(70) = &H6234D11F:  Td1(71) = &HFEA6C48A
    Td1(72) = &H532E349D:  Td1(73) = &H55F3A2A0:  Td1(74) = &HE18A0532:  Td1(75) = &HEBF6A475:  Td1(76) = &HEC830B39:  Td1(77) = &HEF6040AA:  Td1(78) = &H9F715E06:  Td1(79) = &H106EBD51
    Td1(80) = &H8A213EF9:  Td1(81) = &H6DD963D:   Td1(82) = &H53EDDAE:   Td1(83) = &HBDE64D46:  Td1(84) = &H8D5491B5:  Td1(85) = &H5DC47105:  Td1(86) = &HD406046F:  Td1(87) = &H155060FF
    Td1(88) = &HFB981924:  Td1(89) = &HE9BDD697:  Td1(90) = &H434089CC:  Td1(91) = &H9ED96777:  Td1(92) = &H42E8B0BD:  Td1(93) = &H8B890788:  Td1(94) = &H5B19E738:  Td1(95) = &HEEC879DB
    Td1(96) = &HA7CA147:   Td1(97) = &HF427CE9:   Td1(98) = &H1E84F8C9:  Td1(99) = &H0&:        Td1(100) = &H86800983: Td1(101) = &HED2B3248: Td1(102) = &H70111EAC: Td1(103) = &H725A6C4E
    Td1(104) = &HFF0EFDFB: Td1(105) = &H38850F56: Td1(106) = &HD5AE3D1E: Td1(107) = &H392D3627: Td1(108) = &HD90F0A64: Td1(109) = &HA65C6821: Td1(110) = &H545B9BD1: Td1(111) = &H2E36243A
    Td1(112) = &H670A0CB1: Td1(113) = &HE757930F: Td1(114) = &H96EEB4D2: Td1(115) = &H919B1B9E: Td1(116) = &HC5C0804F: Td1(117) = &H20DC61A2: Td1(118) = &H4B775A69: Td1(119) = &H1A121C16
    Td1(120) = &HBA93E20A: Td1(121) = &H2AA0C0E5: Td1(122) = &HE0223C43: Td1(123) = &H171B121D: Td1(124) = &HD090E0B:  Td1(125) = &HC78BF2AD: Td1(126) = &HA8B62DB9: Td1(127) = &HA91E14C8
    Td1(128) = &H19F15785: Td1(129) = &H775AF4C:  Td1(130) = &HDD99EEBB: Td1(131) = &H607FA3FD: Td1(132) = &H2601F79F: Td1(133) = &HF5725CBC: Td1(134) = &H3B6644C5: Td1(135) = &H7EFB5B34
    Td1(136) = &H29438B76: Td1(137) = &HC623CBDC: Td1(138) = &HFCEDB668: Td1(139) = &HF1E4B863: Td1(140) = &HDC31D7CA: Td1(141) = &H85634210: Td1(142) = &H22971340: Td1(143) = &H11C68420
    Td1(144) = &H244A857D: Td1(145) = &H3DBBD2F8: Td1(146) = &H32F9AE11: Td1(147) = &HA129C76D: Td1(148) = &H2F9E1D4B: Td1(149) = &H30B2DCF3: Td1(150) = &H52860DEC: Td1(151) = &HE3C177D0
    Td1(152) = &H16B32B6C: Td1(153) = &HB970A999: Td1(154) = &H489411FA: Td1(155) = &H64E94722: Td1(156) = &H8CFCA8C4: Td1(157) = &H3FF0A01A: Td1(158) = &H2C7D56D8: Td1(159) = &H903322EF
    Td1(160) = &H4E4987C7: Td1(161) = &HD138D9C1: Td1(162) = &HA2CA8CFE: Td1(163) = &HBD49836:  Td1(164) = &H81F5A6CF: Td1(165) = &HDE7AA528: Td1(166) = &H8EB7DA26: Td1(167) = &HBFAD3FA4
    Td1(168) = &H9D3A2CE4: Td1(169) = &H9278500D: Td1(170) = &HCC5F6A9B: Td1(171) = &H467E5462: Td1(172) = &H138DF6C2: Td1(173) = &HB8D890E8: Td1(174) = &HF7392E5E: Td1(175) = &HAFC382F5
    Td1(176) = &H805D9FBE: Td1(177) = &H93D0697C: Td1(178) = &H2DD56FA9: Td1(179) = &H1225CFB3: Td1(180) = &H99ACC83B: Td1(181) = &H7D1810A7: Td1(182) = &H639CE86E: Td1(183) = &HBB3BDB7B
    Td1(184) = &H7826CD09: Td1(185) = &H18596EF4: Td1(186) = &HB79AEC01: Td1(187) = &H9A4F83A8: Td1(188) = &H6E95E665: Td1(189) = &HE6FFAA7E: Td1(190) = &HCFBC2108: Td1(191) = &HE815EFE6
    Td1(192) = &H9BE7BAD9: Td1(193) = &H366F4ACE: Td1(194) = &H99FEAD4:  Td1(195) = &H7CB029D6: Td1(196) = &HB2A431AF: Td1(197) = &H233F2A31: Td1(198) = &H94A5C630: Td1(199) = &H66A235C0
    Td1(200) = &HBC4E7437: Td1(201) = &HCA82FCA6: Td1(202) = &HD090E0B0: Td1(203) = &HD8A73315: Td1(204) = &H9804F14A: Td1(205) = &HDAEC41F7: Td1(206) = &H50CD7F0E: Td1(207) = &HF691172F
    Td1(208) = &HD64D768D: Td1(209) = &HB0EF434D: Td1(210) = &H4DAACC54: Td1(211) = &H496E4DF:  Td1(212) = &HB5D19EE3: Td1(213) = &H886A4C1B: Td1(214) = &H1F2CC1B8: Td1(215) = &H5165467F
    Td1(216) = &HEA5E9D04: Td1(217) = &H358C015D: Td1(218) = &H7487FA73: Td1(219) = &H410BFB2E: Td1(220) = &H1D67B35A: Td1(221) = &HD2DB9252: Td1(222) = &H5610E933: Td1(223) = &H47D66D13
    Td1(224) = &H61D79A8C: Td1(225) = &HCA1377A:  Td1(226) = &H14F8598E: Td1(227) = &H3C13EB89: Td1(228) = &H27A9CEEE: Td1(229) = &HC961B735: Td1(230) = &HE51CE1ED: Td1(231) = &HB1477A3C
    Td1(232) = &HDFD29C59: Td1(233) = &H73F2553F: Td1(234) = &HCE141879: Td1(235) = &H37C773BF: Td1(236) = &HCDF753EA: Td1(237) = &HAAFD5F5B: Td1(238) = &H6F3DDF14: Td1(239) = &HDB447886
    Td1(240) = &HF3AFCA81: Td1(241) = &HC468B93E: Td1(242) = &H3424382C: Td1(243) = &H40A3C25F: Td1(244) = &HC31D1672: Td1(245) = &H25E2BC0C: Td1(246) = &H493C288B: Td1(247) = &H950DFF41
    Td1(248) = &H1A83971:  Td1(249) = &HB30C08DE: Td1(250) = &HE4B4D89C: Td1(251) = &HC1566490: Td1(252) = &H84CB7B61: Td1(253) = &HB632D570: Td1(254) = &H5C6C4874: Td1(255) = &H57B8D042

    Td2(0) = &HF45150A7:   Td2(1) = &H417E5365:   Td2(2) = &H171AC3A4:   Td2(3) = &H273A965E:   Td2(4) = &HAB3BCB6B:   Td2(5) = &H9D1FF145:   Td2(6) = &HFAACAB58:   Td2(7) = &HE34B9303
    Td2(8) = &H302055FA:   Td2(9) = &H76ADF66D:   Td2(10) = &HCC889176:  Td2(11) = &H2F5254C:   Td2(12) = &HE54FFCD7:  Td2(13) = &H2AC5D7CB:  Td2(14) = &H35268044:  Td2(15) = &H62B58FA3
    Td2(16) = &HB1DE495A:  Td2(17) = &HBA25671B:  Td2(18) = &HEA45980E:  Td2(19) = &HFE5DE1C0:  Td2(20) = &H2FC30275:  Td2(21) = &H4C8112F0:  Td2(22) = &H468DA397:  Td2(23) = &HD36BC6F9
    Td2(24) = &H8F03E75F:  Td2(25) = &H9215959C:  Td2(26) = &H6DBFEB7A:  Td2(27) = &H5295DA59:  Td2(28) = &HBED42D83:  Td2(29) = &H7458D321:  Td2(30) = &HE0492969:  Td2(31) = &HC98E44C8
    Td2(32) = &HC2756A89:  Td2(33) = &H8EF47879:  Td2(34) = &H58996B3E:  Td2(35) = &HB927DD71:  Td2(36) = &HE1BEB64F:  Td2(37) = &H88F017AD:  Td2(38) = &H20C966AC:  Td2(39) = &HCE7DB43A
    Td2(40) = &HDF63184A:  Td2(41) = &H1AE58231:  Td2(42) = &H51976033:  Td2(43) = &H5362457F:  Td2(44) = &H64B1E077:  Td2(45) = &H6BBB84AE:  Td2(46) = &H81FE1CA0:  Td2(47) = &H8F9942B
    Td2(48) = &H48705868:  Td2(49) = &H458F19FD:  Td2(50) = &HDE94876C:  Td2(51) = &H7B52B7F8:  Td2(52) = &H73AB23D3:  Td2(53) = &H4B72E202:  Td2(54) = &H1FE3578F:  Td2(55) = &H55662AAB
    Td2(56) = &HEBB20728:  Td2(57) = &HB52F03C2:  Td2(58) = &HC5869A7B:  Td2(59) = &H37D3A508:  Td2(60) = &H2830F287:  Td2(61) = &HBF23B2A5:  Td2(62) = &H302BA6A:   Td2(63) = &H16ED5C82
    Td2(64) = &HCF8A2B1C:  Td2(65) = &H79A792B4:  Td2(66) = &H7F3F0F2:   Td2(67) = &H694EA1E2:  Td2(68) = &HDA65CDF4:  Td2(69) = &H506D5BE:   Td2(70) = &H34D11F62:  Td2(71) = &HA6C48AFE
    Td2(72) = &H2E349D53:  Td2(73) = &HF3A2A055:  Td2(74) = &H8A0532E1:  Td2(75) = &HF6A475EB:  Td2(76) = &H830B39EC:  Td2(77) = &H6040AAEF:  Td2(78) = &H715E069F:  Td2(79) = &H6EBD5110
    Td2(80) = &H213EF98A:  Td2(81) = &HDD963D06:  Td2(82) = &H3EDDAE05:  Td2(83) = &HE64D46BD:  Td2(84) = &H5491B58D:  Td2(85) = &HC471055D:  Td2(86) = &H6046FD4:   Td2(87) = &H5060FF15
    Td2(88) = &H981924FB:  Td2(89) = &HBDD697E9:  Td2(90) = &H4089CC43:  Td2(91) = &HD967779E:  Td2(92) = &HE8B0BD42:  Td2(93) = &H8907888B:  Td2(94) = &H19E7385B:  Td2(95) = &HC879DBEE
    Td2(96) = &H7CA1470A:  Td2(97) = &H427CE90F:  Td2(98) = &H84F8C91E:  Td2(99) = &H0&:        Td2(100) = &H80098386: Td2(101) = &H2B3248ED: Td2(102) = &H111EAC70: Td2(103) = &H5A6C4E72
    Td2(104) = &HEFDFBFF:  Td2(105) = &H850F5638: Td2(106) = &HAE3D1ED5: Td2(107) = &H2D362739: Td2(108) = &HF0A64D9:  Td2(109) = &H5C6821A6: Td2(110) = &H5B9BD154: Td2(111) = &H36243A2E
    Td2(112) = &HA0CB167:  Td2(113) = &H57930FE7: Td2(114) = &HEEB4D296: Td2(115) = &H9B1B9E91: Td2(116) = &HC0804FC5: Td2(117) = &HDC61A220: Td2(118) = &H775A694B: Td2(119) = &H121C161A
    Td2(120) = &H93E20ABA: Td2(121) = &HA0C0E52A: Td2(122) = &H223C43E0: Td2(123) = &H1B121D17: Td2(124) = &H90E0B0D:  Td2(125) = &H8BF2ADC7: Td2(126) = &HB62DB9A8: Td2(127) = &H1E14C8A9
    Td2(128) = &HF1578519: Td2(129) = &H75AF4C07: Td2(130) = &H99EEBBDD: Td2(131) = &H7FA3FD60: Td2(132) = &H1F79F26:  Td2(133) = &H725CBCF5: Td2(134) = &H6644C53B: Td2(135) = &HFB5B347E
    Td2(136) = &H438B7629: Td2(137) = &H23CBDCC6: Td2(138) = &HEDB668FC: Td2(139) = &HE4B863F1: Td2(140) = &H31D7CADC: Td2(141) = &H63421085: Td2(142) = &H97134022: Td2(143) = &HC6842011
    Td2(144) = &H4A857D24: Td2(145) = &HBBD2F83D: Td2(146) = &HF9AE1132: Td2(147) = &H29C76DA1: Td2(148) = &H9E1D4B2F: Td2(149) = &HB2DCF330: Td2(150) = &H860DEC52: Td2(151) = &HC177D0E3
    Td2(152) = &HB32B6C16: Td2(153) = &H70A999B9: Td2(154) = &H9411FA48: Td2(155) = &HE9472264: Td2(156) = &HFCA8C48C: Td2(157) = &HF0A01A3F: Td2(158) = &H7D56D82C: Td2(159) = &H3322EF90
    Td2(160) = &H4987C74E: Td2(161) = &H38D9C1D1: Td2(162) = &HCA8CFEA2: Td2(163) = &HD498360B: Td2(164) = &HF5A6CF81: Td2(165) = &H7AA528DE: Td2(166) = &HB7DA268E: Td2(167) = &HAD3FA4BF
    Td2(168) = &H3A2CE49D: Td2(169) = &H78500D92: Td2(170) = &H5F6A9BCC: Td2(171) = &H7E546246: Td2(172) = &H8DF6C213: Td2(173) = &HD890E8B8: Td2(174) = &H392E5EF7: Td2(175) = &HC382F5AF
    Td2(176) = &H5D9FBE80: Td2(177) = &HD0697C93: Td2(178) = &HD56FA92D: Td2(179) = &H25CFB312: Td2(180) = &HACC83B99: Td2(181) = &H1810A77D: Td2(182) = &H9CE86E63: Td2(183) = &H3BDB7BBB
    Td2(184) = &H26CD0978: Td2(185) = &H596EF418: Td2(186) = &H9AEC01B7: Td2(187) = &H4F83A89A: Td2(188) = &H95E6656E: Td2(189) = &HFFAA7EE6: Td2(190) = &HBC2108CF: Td2(191) = &H15EFE6E8
    Td2(192) = &HE7BAD99B: Td2(193) = &H6F4ACE36: Td2(194) = &H9FEAD409: Td2(195) = &HB029D67C: Td2(196) = &HA431AFB2: Td2(197) = &H3F2A3123: Td2(198) = &HA5C63094: Td2(199) = &HA235C066
    Td2(200) = &H4E7437BC: Td2(201) = &H82FCA6CA: Td2(202) = &H90E0B0D0: Td2(203) = &HA73315D8: Td2(204) = &H4F14A98:  Td2(205) = &HEC41F7DA: Td2(206) = &HCD7F0E50: Td2(207) = &H91172FF6
    Td2(208) = &H4D768DD6: Td2(209) = &HEF434DB0: Td2(210) = &HAACC544D: Td2(211) = &H96E4DF04: Td2(212) = &HD19EE3B5: Td2(213) = &H6A4C1B88: Td2(214) = &H2CC1B81F: Td2(215) = &H65467F51
    Td2(216) = &H5E9D04EA: Td2(217) = &H8C015D35: Td2(218) = &H87FA7374: Td2(219) = &HBFB2E41:  Td2(220) = &H67B35A1D: Td2(221) = &HDB9252D2: Td2(222) = &H10E93356: Td2(223) = &HD66D1347
    Td2(224) = &HD79A8C61: Td2(225) = &HA1377A0C: Td2(226) = &HF8598E14: Td2(227) = &H13EB893C: Td2(228) = &HA9CEEE27: Td2(229) = &H61B735C9: Td2(230) = &H1CE1EDE5: Td2(231) = &H477A3CB1
    Td2(232) = &HD29C59DF: Td2(233) = &HF2553F73: Td2(234) = &H141879CE: Td2(235) = &HC773BF37: Td2(236) = &HF753EACD: Td2(237) = &HFD5F5BAA: Td2(238) = &H3DDF146F: Td2(239) = &H447886DB
    Td2(240) = &HAFCA81F3: Td2(241) = &H68B93EC4: Td2(242) = &H24382C34: Td2(243) = &HA3C25F40: Td2(244) = &H1D1672C3: Td2(245) = &HE2BC0C25: Td2(246) = &H3C288B49: Td2(247) = &HDFF4195
    Td2(248) = &HA8397101: Td2(249) = &HC08DEB3:  Td2(250) = &HB4D89CE4: Td2(251) = &H566490C1: Td2(252) = &HCB7B6184: Td2(253) = &H32D570B6: Td2(254) = &H6C48745C: Td2(255) = &HB8D04257

    Td3(0) = &H5150A7F4:   Td3(1) = &H7E536541:   Td3(2) = &H1AC3A417:   Td3(3) = &H3A965E27:   Td3(4) = &H3BCB6BAB:   Td3(5) = &H1FF1459D:   Td3(6) = &HACAB58FA:   Td3(7) = &H4B9303E3
    Td3(8) = &H2055FA30:   Td3(9) = &HADF66D76:   Td3(10) = &H889176CC:  Td3(11) = &HF5254C02:  Td3(12) = &H4FFCD7E5:  Td3(13) = &HC5D7CB2A:  Td3(14) = &H26804435:  Td3(15) = &HB58FA362
    Td3(16) = &HDE495AB1:  Td3(17) = &H25671BBA:  Td3(18) = &H45980EEA:  Td3(19) = &H5DE1C0FE:  Td3(20) = &HC302752F:  Td3(21) = &H8112F04C:  Td3(22) = &H8DA39746:  Td3(23) = &H6BC6F9D3
    Td3(24) = &H3E75F8F:   Td3(25) = &H15959C92:  Td3(26) = &HBFEB7A6D:  Td3(27) = &H95DA5952:  Td3(28) = &HD42D83BE:  Td3(29) = &H58D32174:  Td3(30) = &H492969E0:  Td3(31) = &H8E44C8C9
    Td3(32) = &H756A89C2:  Td3(33) = &HF478798E:  Td3(34) = &H996B3E58:  Td3(35) = &H27DD71B9:  Td3(36) = &HBEB64FE1:  Td3(37) = &HF017AD88:  Td3(38) = &HC966AC20:  Td3(39) = &H7DB43ACE
    Td3(40) = &H63184ADF:  Td3(41) = &HE582311A:  Td3(42) = &H97603351:  Td3(43) = &H62457F53:  Td3(44) = &HB1E07764:  Td3(45) = &HBB84AE6B:  Td3(46) = &HFE1CA081:  Td3(47) = &HF9942B08
    Td3(48) = &H70586848:  Td3(49) = &H8F19FD45:  Td3(50) = &H94876CDE:  Td3(51) = &H52B7F87B:  Td3(52) = &HAB23D373:  Td3(53) = &H72E2024B:  Td3(54) = &HE3578F1F:  Td3(55) = &H662AAB55
    Td3(56) = &HB20728EB:  Td3(57) = &H2F03C2B5:  Td3(58) = &H869A7BC5:  Td3(59) = &HD3A50837:  Td3(60) = &H30F28728:  Td3(61) = &H23B2A5BF:  Td3(62) = &H2BA6A03:   Td3(63) = &HED5C8216
    Td3(64) = &H8A2B1CCF:  Td3(65) = &HA792B479:  Td3(66) = &HF3F0F207:  Td3(67) = &H4EA1E269:  Td3(68) = &H65CDF4DA:  Td3(69) = &H6D5BE05:   Td3(70) = &HD11F6234:  Td3(71) = &HC48AFEA6
    Td3(72) = &H349D532E:  Td3(73) = &HA2A055F3:  Td3(74) = &H532E18A:   Td3(75) = &HA475EBF6:  Td3(76) = &HB39EC83:   Td3(77) = &H40AAEF60:  Td3(78) = &H5E069F71:  Td3(79) = &HBD51106E
    Td3(80) = &H3EF98A21:  Td3(81) = &H963D06DD:  Td3(82) = &HDDAE053E:  Td3(83) = &H4D46BDE6:  Td3(84) = &H91B58D54:  Td3(85) = &H71055DC4:  Td3(86) = &H46FD406:   Td3(87) = &H60FF1550
    Td3(88) = &H1924FB98:  Td3(89) = &HD697E9BD:  Td3(90) = &H89CC4340:  Td3(91) = &H67779ED9:  Td3(92) = &HB0BD42E8:  Td3(93) = &H7888B89:   Td3(94) = &HE7385B19:  Td3(95) = &H79DBEEC8
    Td3(96) = &HA1470A7C:  Td3(97) = &H7CE90F42:  Td3(98) = &HF8C91E84:  Td3(99) = &H0&:        Td3(100) = &H9838680:  Td3(101) = &H3248ED2B: Td3(102) = &H1EAC7011: Td3(103) = &H6C4E725A
    Td3(104) = &HFDFBFF0E: Td3(105) = &HF563885:  Td3(106) = &H3D1ED5AE: Td3(107) = &H3627392D: Td3(108) = &HA64D90F:  Td3(109) = &H6821A65C: Td3(110) = &H9BD1545B: Td3(111) = &H243A2E36
    Td3(112) = &HCB1670A:  Td3(113) = &H930FE757: Td3(114) = &HB4D296EE: Td3(115) = &H1B9E919B: Td3(116) = &H804FC5C0: Td3(117) = &H61A220DC: Td3(118) = &H5A694B77: Td3(119) = &H1C161A12
    Td3(120) = &HE20ABA93: Td3(121) = &HC0E52AA0: Td3(122) = &H3C43E022: Td3(123) = &H121D171B: Td3(124) = &HE0B0D09:  Td3(125) = &HF2ADC78B: Td3(126) = &H2DB9A8B6: Td3(127) = &H14C8A91E
    Td3(128) = &H578519F1: Td3(129) = &HAF4C0775: Td3(130) = &HEEBBDD99: Td3(131) = &HA3FD607F: Td3(132) = &HF79F2601: Td3(133) = &H5CBCF572: Td3(134) = &H44C53B66: Td3(135) = &H5B347EFB
    Td3(136) = &H8B762943: Td3(137) = &HCBDCC623: Td3(138) = &HB668FCED: Td3(139) = &HB863F1E4: Td3(140) = &HD7CADC31: Td3(141) = &H42108563: Td3(142) = &H13402297: Td3(143) = &H842011C6
    Td3(144) = &H857D244A: Td3(145) = &HD2F83DBB: Td3(146) = &HAE1132F9: Td3(147) = &HC76DA129: Td3(148) = &H1D4B2F9E: Td3(149) = &HDCF330B2: Td3(150) = &HDEC5286:  Td3(151) = &H77D0E3C1
    Td3(152) = &H2B6C16B3: Td3(153) = &HA999B970: Td3(154) = &H11FA4894: Td3(155) = &H472264E9: Td3(156) = &HA8C48CFC: Td3(157) = &HA01A3FF0: Td3(158) = &H56D82C7D: Td3(159) = &H22EF9033
    Td3(160) = &H87C74E49: Td3(161) = &HD9C1D138: Td3(162) = &H8CFEA2CA: Td3(163) = &H98360BD4: Td3(164) = &HA6CF81F5: Td3(165) = &HA528DE7A: Td3(166) = &HDA268EB7: Td3(167) = &H3FA4BFAD
    Td3(168) = &H2CE49D3A: Td3(169) = &H500D9278: Td3(170) = &H6A9BCC5F: Td3(171) = &H5462467E: Td3(172) = &HF6C2138D: Td3(173) = &H90E8B8D8: Td3(174) = &H2E5EF739: Td3(175) = &H82F5AFC3
    Td3(176) = &H9FBE805D: Td3(177) = &H697C93D0: Td3(178) = &H6FA92DD5: Td3(179) = &HCFB31225: Td3(180) = &HC83B99AC: Td3(181) = &H10A77D18: Td3(182) = &HE86E639C: Td3(183) = &HDB7BBB3B
    Td3(184) = &HCD097826: Td3(185) = &H6EF41859: Td3(186) = &HEC01B79A: Td3(187) = &H83A89A4F: Td3(188) = &HE6656E95: Td3(189) = &HAA7EE6FF: Td3(190) = &H2108CFBC: Td3(191) = &HEFE6E815
    Td3(192) = &HBAD99BE7: Td3(193) = &H4ACE366F: Td3(194) = &HEAD4099F: Td3(195) = &H29D67CB0: Td3(196) = &H31AFB2A4: Td3(197) = &H2A31233F: Td3(198) = &HC63094A5: Td3(199) = &H35C066A2
    Td3(200) = &H7437BC4E: Td3(201) = &HFCA6CA82: Td3(202) = &HE0B0D090: Td3(203) = &H3315D8A7: Td3(204) = &HF14A9804: Td3(205) = &H41F7DAEC: Td3(206) = &H7F0E50CD: Td3(207) = &H172FF691
    Td3(208) = &H768DD64D: Td3(209) = &H434DB0EF: Td3(210) = &HCC544DAA: Td3(211) = &HE4DF0496: Td3(212) = &H9EE3B5D1: Td3(213) = &H4C1B886A: Td3(214) = &HC1B81F2C: Td3(215) = &H467F5165
    Td3(216) = &H9D04EA5E: Td3(217) = &H15D358C:  Td3(218) = &HFA737487: Td3(219) = &HFB2E410B: Td3(220) = &HB35A1D67: Td3(221) = &H9252D2DB: Td3(222) = &HE9335610: Td3(223) = &H6D1347D6
    Td3(224) = &H9A8C61D7: Td3(225) = &H377A0CA1: Td3(226) = &H598E14F8: Td3(227) = &HEB893C13: Td3(228) = &HCEEE27A9: Td3(229) = &HB735C961: Td3(230) = &HE1EDE51C: Td3(231) = &H7A3CB147
    Td3(232) = &H9C59DFD2: Td3(233) = &H553F73F2: Td3(234) = &H1879CE14: Td3(235) = &H73BF37C7: Td3(236) = &H53EACDF7: Td3(237) = &H5F5BAAFD: Td3(238) = &HDF146F3D: Td3(239) = &H7886DB44
    Td3(240) = &HCA81F3AF: Td3(241) = &HB93EC468: Td3(242) = &H382C3424: Td3(243) = &HC25F40A3: Td3(244) = &H1672C31D: Td3(245) = &HBC0C25E2: Td3(246) = &H288B493C: Td3(247) = &HFF41950D
    Td3(248) = &H397101A8: Td3(249) = &H8DEB30C:  Td3(250) = &HD89CE4B4: Td3(251) = &H6490C156: Td3(252) = &H7B6184CB: Td3(253) = &HD570B632: Td3(254) = &H48745C6C: Td3(255) = &HD04257B8

    Td4(0) = &H52525252:   Td4(1) = &H9090909:    Td4(2) = &H6A6A6A6A:   Td4(3) = &HD5D5D5D5:   Td4(4) = &H30303030:   Td4(5) = &H36363636:   Td4(6) = &HA5A5A5A5:   Td4(7) = &H38383838
    Td4(8) = &HBFBFBFBF:   Td4(9) = &H40404040:   Td4(10) = &HA3A3A3A3:  Td4(11) = &H9E9E9E9E:  Td4(12) = &H81818181:  Td4(13) = &HF3F3F3F3:  Td4(14) = &HD7D7D7D7:  Td4(15) = &HFBFBFBFB
    Td4(16) = &H7C7C7C7C:  Td4(17) = &HE3E3E3E3:  Td4(18) = &H39393939:  Td4(19) = &H82828282:  Td4(20) = &H9B9B9B9B:  Td4(21) = &H2F2F2F2F:  Td4(22) = &HFFFFFFFF:  Td4(23) = &H87878787
    Td4(24) = &H34343434:  Td4(25) = &H8E8E8E8E:  Td4(26) = &H43434343:  Td4(27) = &H44444444:  Td4(28) = &HC4C4C4C4:  Td4(29) = &HDEDEDEDE:  Td4(30) = &HE9E9E9E9:  Td4(31) = &HCBCBCBCB
    Td4(32) = &H54545454:  Td4(33) = &H7B7B7B7B:  Td4(34) = &H94949494:  Td4(35) = &H32323232:  Td4(36) = &HA6A6A6A6:  Td4(37) = &HC2C2C2C2:  Td4(38) = &H23232323:  Td4(39) = &H3D3D3D3D
    Td4(40) = &HEEEEEEEE:  Td4(41) = &H4C4C4C4C:  Td4(42) = &H95959595:  Td4(43) = &HB0B0B0B:   Td4(44) = &H42424242:  Td4(45) = &HFAFAFAFA:  Td4(46) = &HC3C3C3C3:  Td4(47) = &H4E4E4E4E
    Td4(48) = &H8080808:   Td4(49) = &H2E2E2E2E:  Td4(50) = &HA1A1A1A1:  Td4(51) = &H66666666:  Td4(52) = &H28282828:  Td4(53) = &HD9D9D9D9:  Td4(54) = &H24242424:  Td4(55) = &HB2B2B2B2
    Td4(56) = &H76767676:  Td4(57) = &H5B5B5B5B:  Td4(58) = &HA2A2A2A2:  Td4(59) = &H49494949:  Td4(60) = &H6D6D6D6D:  Td4(61) = &H8B8B8B8B:  Td4(62) = &HD1D1D1D1:  Td4(63) = &H25252525
    Td4(64) = &H72727272:  Td4(65) = &HF8F8F8F8:  Td4(66) = &HF6F6F6F6:  Td4(67) = &H64646464:  Td4(68) = &H86868686:  Td4(69) = &H68686868:  Td4(70) = &H98989898:  Td4(71) = &H16161616
    Td4(72) = &HD4D4D4D4:  Td4(73) = &HA4A4A4A4:  Td4(74) = &H5C5C5C5C:  Td4(75) = &HCCCCCCCC:  Td4(76) = &H5D5D5D5D:  Td4(77) = &H65656565:  Td4(78) = &HB6B6B6B6:  Td4(79) = &H92929292
    Td4(80) = &H6C6C6C6C:  Td4(81) = &H70707070:  Td4(82) = &H48484848:  Td4(83) = &H50505050:  Td4(84) = &HFDFDFDFD:  Td4(85) = &HEDEDEDED:  Td4(86) = &HB9B9B9B9:  Td4(87) = &HDADADADA
    Td4(88) = &H5E5E5E5E:  Td4(89) = &H15151515:  Td4(90) = &H46464646:  Td4(91) = &H57575757:  Td4(92) = &HA7A7A7A7:  Td4(93) = &H8D8D8D8D:  Td4(94) = &H9D9D9D9D:  Td4(95) = &H84848484
    Td4(96) = &H90909090:  Td4(97) = &HD8D8D8D8:  Td4(98) = &HABABABAB:  Td4(99) = &H0&:        Td4(100) = &H8C8C8C8C: Td4(101) = &HBCBCBCBC: Td4(102) = &HD3D3D3D3: Td4(103) = &HA0A0A0A
    Td4(104) = &HF7F7F7F7: Td4(105) = &HE4E4E4E4: Td4(106) = &H58585858: Td4(107) = &H5050505:  Td4(108) = &HB8B8B8B8: Td4(109) = &HB3B3B3B3: Td4(110) = &H45454545: Td4(111) = &H6060606
    Td4(112) = &HD0D0D0D0: Td4(113) = &H2C2C2C2C: Td4(114) = &H1E1E1E1E: Td4(115) = &H8F8F8F8F: Td4(116) = &HCACACACA: Td4(117) = &H3F3F3F3F: Td4(118) = &HF0F0F0F:  Td4(119) = &H2020202
    Td4(120) = &HC1C1C1C1: Td4(121) = &HAFAFAFAF: Td4(122) = &HBDBDBDBD: Td4(123) = &H3030303:  Td4(124) = &H1010101:  Td4(125) = &H13131313: Td4(126) = &H8A8A8A8A: Td4(127) = &H6B6B6B6B
    Td4(128) = &H3A3A3A3A: Td4(129) = &H91919191: Td4(130) = &H11111111: Td4(131) = &H41414141: Td4(132) = &H4F4F4F4F: Td4(133) = &H67676767: Td4(134) = &HDCDCDCDC: Td4(135) = &HEAEAEAEA
    Td4(136) = &H97979797: Td4(137) = &HF2F2F2F2: Td4(138) = &HCFCFCFCF: Td4(139) = &HCECECECE: Td4(140) = &HF0F0F0F0: Td4(141) = &HB4B4B4B4: Td4(142) = &HE6E6E6E6: Td4(143) = &H73737373
    Td4(144) = &H96969696: Td4(145) = &HACACACAC: Td4(146) = &H74747474: Td4(147) = &H22222222: Td4(148) = &HE7E7E7E7: Td4(149) = &HADADADAD: Td4(150) = &H35353535: Td4(151) = &H85858585
    Td4(152) = &HE2E2E2E2: Td4(153) = &HF9F9F9F9: Td4(154) = &H37373737: Td4(155) = &HE8E8E8E8: Td4(156) = &H1C1C1C1C: Td4(157) = &H75757575: Td4(158) = &HDFDFDFDF: Td4(159) = &H6E6E6E6E
    Td4(160) = &H47474747: Td4(161) = &HF1F1F1F1: Td4(162) = &H1A1A1A1A: Td4(163) = &H71717171: Td4(164) = &H1D1D1D1D: Td4(165) = &H29292929: Td4(166) = &HC5C5C5C5: Td4(167) = &H89898989
    Td4(168) = &H6F6F6F6F: Td4(169) = &HB7B7B7B7: Td4(170) = &H62626262: Td4(171) = &HE0E0E0E:  Td4(172) = &HAAAAAAAA: Td4(173) = &H18181818: Td4(174) = &HBEBEBEBE: Td4(175) = &H1B1B1B1B
    Td4(176) = &HFCFCFCFC: Td4(177) = &H56565656: Td4(178) = &H3E3E3E3E: Td4(179) = &H4B4B4B4B: Td4(180) = &HC6C6C6C6: Td4(181) = &HD2D2D2D2: Td4(182) = &H79797979: Td4(183) = &H20202020
    Td4(184) = &H9A9A9A9A: Td4(185) = &HDBDBDBDB: Td4(186) = &HC0C0C0C0: Td4(187) = &HFEFEFEFE: Td4(188) = &H78787878: Td4(189) = &HCDCDCDCD: Td4(190) = &H5A5A5A5A: Td4(191) = &HF4F4F4F4
    Td4(192) = &H1F1F1F1F: Td4(193) = &HDDDDDDDD: Td4(194) = &HA8A8A8A8: Td4(195) = &H33333333: Td4(196) = &H88888888: Td4(197) = &H7070707:  Td4(198) = &HC7C7C7C7: Td4(199) = &H31313131
    Td4(200) = &HB1B1B1B1: Td4(201) = &H12121212: Td4(202) = &H10101010: Td4(203) = &H59595959: Td4(204) = &H27272727: Td4(205) = &H80808080: Td4(206) = &HECECECEC: Td4(207) = &H5F5F5F5F
    Td4(208) = &H60606060: Td4(209) = &H51515151: Td4(210) = &H7F7F7F7F: Td4(211) = &HA9A9A9A9: Td4(212) = &H19191919: Td4(213) = &HB5B5B5B5: Td4(214) = &H4A4A4A4A: Td4(215) = &HD0D0D0D
    Td4(216) = &H2D2D2D2D: Td4(217) = &HE5E5E5E5: Td4(218) = &H7A7A7A7A: Td4(219) = &H9F9F9F9F: Td4(220) = &H93939393: Td4(221) = &HC9C9C9C9: Td4(222) = &H9C9C9C9C: Td4(223) = &HEFEFEFEF
    Td4(224) = &HA0A0A0A0: Td4(225) = &HE0E0E0E0: Td4(226) = &H3B3B3B3B: Td4(227) = &H4D4D4D4D: Td4(228) = &HAEAEAEAE: Td4(229) = &H2A2A2A2A: Td4(230) = &HF5F5F5F5: Td4(231) = &HB0B0B0B0
    Td4(232) = &HC8C8C8C8: Td4(233) = &HEBEBEBEB: Td4(234) = &HBBBBBBBB: Td4(235) = &H3C3C3C3C: Td4(236) = &H83838383: Td4(237) = &H53535353: Td4(238) = &H99999999: Td4(239) = &H61616161
    Td4(240) = &H17171717: Td4(241) = &H2B2B2B2B: Td4(242) = &H4040404:  Td4(243) = &H7E7E7E7E: Td4(244) = &HBABABABA: Td4(245) = &H77777777: Td4(246) = &HD6D6D6D6: Td4(247) = &H26262626
    Td4(248) = &HE1E1E1E1: Td4(249) = &H69696969: Td4(250) = &H14141414: Td4(251) = &H63636363: Td4(252) = &H55555555: Td4(253) = &H21212121: Td4(254) = &HC0C0C0C:  Td4(255) = &H7D7D7D7D

    'for 128-bit blocks, Rijndael never uses more than 10 rcon values
    rco(0) = &H1&:    rco(1) = &H2&:    rco(2) = &H4&:    rco(3) = &H8&:    rco(4) = &H10&
    rco(5) = &H20&:   rco(6) = &H40&:   rco(7) = &H80&:   rco(8) = &H1B&:   rco(9) = &H36&
#If SUPPORT_LEVEL Then
    rco(10) = &H6C&:  rco(11) = &HD8&:  rco(12) = &HAB&:  rco(13) = &H4D&:  rco(14) = &H9A&
    rco(15) = &H2F&:  rco(16) = &H5E&:  rco(17) = &HBC&:  rco(18) = &H63&:  rco(19) = &HC6&
    rco(20) = &H97&:  rco(21) = &H35&:  rco(22) = &H6A&:  rco(23) = &HD4&:  rco(24) = &HB3&
    rco(25) = &H7D&:  rco(26) = &HFA&:  rco(27) = &HEF&:  rco(28) = &HC5&
#End If
#End If
End Sub

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝图

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值