' AES Encryption Implementation by: Chris Brown(2007) aka Zamaster
'
' -Takes plain text and converts it to encrypted ASCII
' -Keys must be 128 bits in size, or 32 hex places/16 char places
' -Set ed in RIJNDAEL_Encrypt to 2 for decryption, 1 for encryption
'
Sub RIJNDAEL_ConvertEXPtoKey(index As Integer, ekey() As Ubyte, tkey() As Ubyte)
Dim As Ubyte x,y,b
b = (index-1)*4
For y = 1 To 4
For x = 1 To 4
tkey(x,y) = ekey(b+x,y)
Next x
Next y
End Sub
Sub RIJNDAEL_SubBytes(T() As Ubyte)
Dim As Ubyte x,y, temp
For y = 1 To 4
For x = 1 To 4
temp = T(x,y)
T(x,y) = RIJNDAEL_S(temp)
Next x
Next y
End Sub
Sub RIJNDAEL_InverseSubBytes(T() As Ubyte)
Dim As Ubyte x,y, temp
For y = 1 To 4
For x = 1 To 4
temp = T(x,y)
T(x,y) = RIJNDAEL_InverseS(temp)
Next x
Next y
End Sub
Sub RIJNDAEL_ShiftRows(T() As Ubyte)
Swap T(1,2), T(4,2)
Swap T(2,2), T(1,2)
Swap T(3,2), T(2,2)
Swap T(1,3), T(3,3)
Swap T(2,3), T(4,3)
Swap T(1,4), T(2,4)
Swap T(3,4), T(4,4)
Swap T(1,4), T(3,4)
End Sub
Sub RIJNDAEL_InverseShiftRows(T() As Ubyte)
Swap T(1,2), T(2,2)
Swap T(1,2), T(4,2)
Swap T(3,2), T(4,2)
Swap T(1,3), T(3,3)
Swap T(2,3), T(4,3)
Swap T(1,4), T(2,4)
Swap T(2,4), T(3,4)
Swap T(3,4), T(4,4)
End Sub
Function RIJNDAEL_Gmul(Byval a As Ubyte, Byval b As Ubyte) As Ubyte
Dim As Ubyte p, i, hi
For i = 1 To 8
If (b And 1) = &H01 Then p = p Xor a
hi = a And &H80
a = a Shl 1
If hi = &H80 Then a = a Xor &H1B
b = b Shr 1
Next i
Return p
End Function
Sub RIJNDAEL_MixCollums(T() As Ubyte)
Dim As Ubyte a(1 To 4), b(1 To 4), i, q, hb
For q = 1 To 4
For i = 1 To 4
a(i) = T(q,i)
hb = T(q,i) And &H80
b(i) = a(i) Shl 1
If hb = &h80 Then b(i) = b(i) Xor &H1B
Next i
T(q,1) = b(1) Xor a(4) Xor a(3) Xor b(2) Xor a(2)
T(q,2) = b(2) Xor a(1) Xor a(4) Xor b(3) Xor a(3)
T(q,3) = b(3) Xor a(2) Xor a(1) Xor b(4) Xor a(4)
T(q,4) = b(4) Xor a(3) Xor a(2) Xor b(1) Xor a(1)
Next q
End Sub
Sub RIJNDAEL_InverseMixCollums(T() As Ubyte)
Dim As Ubyte a(1 To 4), q, i
For q = 1 To 4
For i = 1 To 4
a(i) = T(q,i)
Next
T(q,1) = RIJNDAEL_Gmul(a(1),&HE) Xor RIJNDAEL_Gmul(a(2),&HB) Xor RIJNDAEL_Gmul(a(3),&HD) Xor RIJNDAEL_Gmul(a(4),&H9)
T(q,2) = RIJNDAEL_Gmul(a(1),&H9) Xor RIJNDAEL_Gmul(a(2),&HE) Xor RIJNDAEL_Gmul(a(3),&HB) Xor RIJNDAEL_Gmul(a(4),&HD)
T(q,3) = RIJNDAEL_Gmul(a(1),&HD) Xor RIJNDAEL_Gmul(a(2),&H9) Xor RIJNDAEL_Gmul(a(3),&HE) Xor RIJNDAEL_Gmul(a(4),&HB)
T(q,4) = RIJNDAEL_Gmul(a(1),&HB) Xor RIJNDAEL_Gmul(a(2),&HD) Xor RIJNDAEL_Gmul(a(3),&H9) Xor RIJNDAEL_Gmul(a(4),&HE)
Next q
End Sub
Sub RIJNDAEL_AddKey(T() As Ubyte, K() As Ubyte)
Dim As Ubyte x,y
For y = 1 To 4
For x = 1 To 4
T(x,y) = T(x,y) Xor K(x,y)
Next x
Next y
End Sub
Sub RIJNDAEL_ExpandKey(K1() As Ubyte, K2() As Ubyte)
Static As Ubyte RCON(1 To 10) = {&H01, &H02, &H04, &H08, &H10, &H20, &H40, &H80, &H1B, &H36}
Dim As Integer i, q, a, opt4, opt4m1, opt4m4, o4, om1, om4
K2(1,1) = K1(1,1) Xor RIJNDAEL_S(K1(4,2)) Xor RCON(1)
K2(1,2) = K1(1,2) Xor RIJNDAEL_S(K1(4,3))
K2(1,3) = K1(1,3) Xor RIJNDAEL_S(K1(4,4))
K2(1,4) = K1(1,4) Xor RIJNDAEL_S(K1(4,1))
For i = 2 To 4
For q = 1 To 4
K2(i,q) = K2(i-1,q) Xor K1(i,q)
Next q
Next i
For i = 2 To 10
opt4 = ((i-1) Shl 2) + 1
opt4m1 = opt4 - 1
opt4m4 = opt4 - 4
K2(opt4,1) = K2(opt4m4,1) Xor RIJNDAEL_S(K2(opt4m1,2)) Xor RCON(i)
K2(opt4,2) = K2(opt4m4,2) Xor RIJNDAEL_S(K2(opt4m1,3))
K2(opt4,3) = K2(opt4m4,3) Xor RIJNDAEL_S(K2(opt4m1,4))
K2(opt4,4) = K2(opt4m4,4) Xor RIJNDAEL_S(K2(opt4m1,1))
For q = 2 To 4
o4 = opt4m1 + q
om1 = o4-1
om4 = o4-4
For a = 1 To 4
K2(o4,a) = K2(om1,a) Xor K2(om4,a)
Next a
Next q
Next i
End Sub
Sub RIJNDAEL_TextToState(Byref texts As String, T() As Ubyte, dirc As Integer)
Dim As String text
text = texts
Dim As Ubyte x,y
If dirc = 1 Then
For y = 1 To 4
For x = 1 To 4
T(x,y) = Asc(Mid$(text,(((y-1) Shl 2) + x),1))
Next x
Next y
Else
For y = 1 To 4
For x = 1 To 4
T(y,x) = Asc(Mid$(text,(((y-1) Shl 2) + x),1))
Next x
Next y
Endif
End Sub
Sub RIJNDAEL_Rotate(K() As Ubyte)
Swap K(1,2), K(2,1)
Swap K(1,3), K(3,1)
Swap K(1,4), K(4,1)
Swap K(2,4), K(4,2)
Swap K(3,4), K(4,3)
Swap K(2,3), K(3,2)
End Sub
Function RIJNDAEL_StateToText(T() As Ubyte) As String
Dim As String s
Dim As Integer x,y
For y = 1 To 4
For x = 1 To 4
s += Chr$(T(x,y))
Next x
Next y
Return s
End Function
Function RIJNDAEL_StrToHex (Byref s As String) As String
Dim As String convstr
convstr = s
Dim As Uinteger i
Dim As String ftext
For i = 1 To Len(convstr)
ftext += Hex$(Asc(Mid$(convstr,i,1)),2)
Next i
Return ftext
End Function
Function RIJNDAEL_HexToStr (Byref s As String) As String
Dim As String convstr
convstr = s
If Len(convstr) Mod 2 = 1 Then convstr += "0"
Dim As Uinteger i
Dim As String f
For i = 1 To Len(convstr) Step 2
f += Chr$(Val("&H"+Mid$(convstr,i,2)))
Next i
Return f
End Function
Sub RIJNDAEL_BlockEncrypt(T() As Ubyte, K1() As Ubyte, K2() As Ubyte)
Dim As Integer i
Dim As Ubyte TempKey(1 To 4, 1 To 4)
RIJNDAEL_AddKey T(), K1()
RIJNDAEL_Rotate T()
For i = 1 To 9
RIJNDAEL_SubBytes T()
RIJNDAEL_ShiftRows T()
RIJNDAEL_MixCollums T()
RIJNDAEL_ConvertEXPtoKey i, K2(), TempKey()
RIJNDAEL_AddKey T(), TempKey()
Next i
RIJNDAEL_SubBytes T()
RIJNDAEL_ShiftRows T()
RIJNDAEL_ConvertEXPtoKey 10, K2(), TempKey()
RIJNDAEL_AddKey T(), TempKey()
End Sub
Sub RIJNDAEL_BlockDecrypt(T() As Ubyte, K1() As Ubyte, K2() As Ubyte)
Dim As Integer i
Dim As Ubyte TempKey(1 To 4, 1 To 4)
RIJNDAEL_ConvertEXPtoKey 10, K2(), TempKey()
RIJNDAEL_AddKey T(), TempKey()
For i = 9 To 1 Step -1
RIJNDAEL_InverseShiftRows T()
RIJNDAEL_InverseSubBytes T()
RIJNDAEL_ConvertEXPtoKey i, K2(), TempKey()
RIJNDAEL_AddKey T(), TempKey()
RIJNDAEL_InverseMixCollums T()
Next i
RIJNDAEL_InverseShiftRows T()
RIJNDAEL_InverseSubBytes T()
RIJNDAEL_AddKey T(), K1()
End Sub
Function RIJNDAEL_Encrypt(Byref pptext As String, Byref Key As String, ed As Integer) As String
If ed < 1 Or ed > 2 Then
Beep
Return "ERROR - NO SUCH ENCRYPTION MODE"
Endif
Dim As String ptext, ctext, mtext
ptext = pptext
Dim As Integer lt
lt = Len(Key)
If (lt Mod 16 <> 0) Or (lt Shr 4 <> 1) Then
Return "ERROR - INVALID KEY"
Endif
Dim As Integer pmod, i
lt = Len(ptext)
pmod = lt Mod 16
If pmod <> 0 Or lt < 1 Then
pmod = 16 - pmod
For i = 1 To pmod
ptext += Chr$(0)
Next i
Endif
lt = Len(ptext)
lt = lt Shr 4
Dim As Ubyte State(1 To 4, 1 To 4), KeyT(1 To 4, 1 To 4), EXPKey(1 To 40, 1 To 4)
RIJNDAEL_TextToState Key, KeyT(), 2
RIJNDAEL_ExpandKey KeyT(), EXPKey()
Select Case ed
Case 1
For i = 1 To lt
mtext = Mid$(ptext, ((i-1) Shl 4) + 1, 16)
RIJNDAEL_TextToState mtext, State(), 1
RIJNDAEL_BlockEncrypt State(), KeyT(), EXPKey()
ctext += RIJNDAEL_StateToText(State())
Next i
Case 2
RIJNDAEL_Rotate KeyT()
For i = 1 To lt
mtext = Mid$(ptext, ((i-1) Shl 4) + 1, 16)
RIJNDAEL_TextToState mtext, State(), 1
RIJNDAEL_BlockDecrypt State(), KeyT(), EXPKey()
RIJNDAEL_Rotate State()
ctext += RIJNDAEL_StateToText(State())
Next i
End Select
Return ctext
End Function