signature=e55c5074cb656f0e3d5cfb5e611e9be0,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 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,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 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 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,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

'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,256 Keysize = 128,256

'SUPPORT_LEVEL = 2 [ All Sizes ] Blocksize = 128,160,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,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),4& * i

Do

CopyMemory s(0),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),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),4& * i

For j = 0 To 6

CopyMemory s(0),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),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),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),4& * i

For j = 0 To 13

CopyMemory s(0),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),4& * i

For j = 0 To 10

CopyMemory s(0),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),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),4& * i

For j = 0 To 8

CopyMemory s(0),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),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),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),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),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),4& * i

For j = 0 To 11

CopyMemory s(0),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),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),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),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),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),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),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),4& * i

For j = 0 To 12

CopyMemory s(0),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),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),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),4& * i

For j = 0 To 28

CopyMemory s(0),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),4& * i

For j = 0 To 22

CopyMemory s(0),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),4& * i

For j = 0 To 18

CopyMemory s(0),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),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),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),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),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,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,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),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),4&

CopyMemory ciphertext(q + 4),4&

CopyMemory ciphertext(q + 8),4&

CopyMemory ciphertext(q + 12),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(q + 0),ciphertext(q + 4),ciphertext(q + 8),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),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),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),4&

CopyMemory plaintext(p + 4),4&

CopyMemory plaintext(p + 8),4&

CopyMemory plaintext(p + 12),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,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,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),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),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),4&

CopyMemory ciphertext(q + 16),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(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),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),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),4&

CopyMemory plaintext(p + 16),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,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,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),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),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),4&

CopyMemory ciphertext(q + 20),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(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),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),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),4&

CopyMemory plaintext(p + 20),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,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,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),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),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),4&

CopyMemory ciphertext(q + 24),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(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),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),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),4&

CopyMemory plaintext(p + 24),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,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,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),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),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),4&

CopyMemory ciphertext(q + 28),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(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),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),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),4&

CopyMemory plaintext(p + 28),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,appendsize As Long,BlockBits As Long) As Long

#Else

Public Function ArrayEncrypt(plaintext() 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,i,i

Next i

#If SUPPORT_LEVEL Then

Case 192

For i = 0 To n - BlockSize Step BlockSize

Block192Encrypt plaintext,i

Next i

Case 256

For i = 0 To n - BlockSize Step BlockSize

Block256Encrypt plaintext,i

Next i

#If SUPPORT_LEVEL = 2 Then

Case 160

For i = 0 To n - BlockSize Step BlockSize

Block160Encrypt plaintext,i

Next i

Case 224

For i = 0 To n - BlockSize Step BlockSize

Block224Encrypt plaintext,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,i

#If SUPPORT_LEVEL Then

Case 192

If i <> m Then Block192Encrypt ciphertext,i

Case 256

If i <> m Then Block256Encrypt ciphertext,i

#If SUPPORT_LEVEL = 2 Then

Case 160

If i <> m Then Block160Encrypt ciphertext,i

Case 224

If i <> m Then Block224Encrypt ciphertext,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,BlockBits As Long) As Long

#Else

Public Function ArrayDecrypt(plaintext() As Byte,"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,i

Next i

#If SUPPORT_LEVEL Then

Case 192

For i = 0 To n - BlockSize Step BlockSize

Block192Decrypt plaintext,i

Next i

Case 256

For i = 0 To n - BlockSize Step BlockSize

Block256Decrypt plaintext,i

Next i

#If SUPPORT_LEVEL = 2 Then

Case 160

For i = 0 To n - BlockSize Step BlockSize

Block160Decrypt plaintext,i

Next i

Case 224

For i = 0 To n - BlockSize Step BlockSize

Block224Decrypt plaintext,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

Next i

#If SUPPORT_LEVEL Then

Case 192

For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize

Block192Encrypt data,i

Next i

Case 256

For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize

Block256Encrypt data,i

Next i

#If SUPPORT_LEVEL = 2 Then

Case 160

For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize

Block160Encrypt data,i

Next i

Case 224

For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize

Block224Encrypt data,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,i

Next i

#If SUPPORT_LEVEL Then

Case 192

For i = 0 To m - BlockSize Step BlockSize

Block192Encrypt data,i

Next i

Case 256

For i = 0 To m - BlockSize Step BlockSize

Block256Encrypt data,i

Next i

#If SUPPORT_LEVEL = 2 Then

Case 160

For i = 0 To m - BlockSize Step BlockSize

Block160Encrypt data,i

Next i

Case 224

For i = 0 To m - BlockSize Step BlockSize

Block224Encrypt data,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,BlockBits As Long) As Long

#Else

Public Function FileDecrypt(PlaintextFileName As String,"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,i

Next i

#If SUPPORT_LEVEL Then

Case 192

For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize

Block192Decrypt data,i

Next i

Case 256

For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize

Block256Decrypt data,i

Next i

#If SUPPORT_LEVEL = 2 Then

Case 160

For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize

Block160Decrypt data,i

Next i

Case 224

For i = 0 To (MaxBlocks - 1) * BlockSize Step BlockSize

Block224Decrypt data,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,i

Next i

#If SUPPORT_LEVEL Then

Case 192

For i = 0 To m - BlockSize Step BlockSize

Block192Decrypt data,i

Next i

Case 256

For i = 0 To m - BlockSize Step BlockSize

Block256Decrypt data,i

Next i

#If SUPPORT_LEVEL = 2 Then

Case 160

For i = 0 To m - BlockSize Step BlockSize

Block160Decrypt data,i

Next i

Case 224

For i = 0 To m - BlockSize Step BlockSize

Block224Decrypt data,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),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),4&

CopyMemory Te0(i),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),4&

CopyMemory Td0(i),4&

CopyMemory Td1(i),4&

CopyMemory Td2(i),4&

CopyMemory Td3(i),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

总结

以上是编程之家为你收集整理的VB AES 字符串和文件加密全部内容,希望文章能够帮你解决VB AES 字符串和文件加密所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

小编个人微信号 jb51ccc

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值