F merupakan fungsi penggunaan kotak-S dan penambahan konstanta ronde. Penjadwalan kunci dapat diimplementasikan tanpa eksplisit menggunakan array W.
Jika jumlah yang tersedia kecil, maka kunci per ronde dapat dihitung on-the-fly dan hanya membutuhkan buffer sebesar 64 byte. Ini berarti bahwa mengetahui 4 word 64
byte berurutan dari kunci terekspansi akan dapat membangkitkan seluruh tabel subkey. Konstanta per ronde menghilangkan sifat simetri.
3.2 Implementasi Algoritma Rijndael
Implementasi Algoritma Rijndael dirancang
dalam bahasa
pemrograman Visual Basic 6.0. Berikut tahap implementasi algoritma Rijndael.
1. Pembentukan Kotak Substitusi S-Box 2. Proses MixColumns
3. Proses enkripsi 4. Proses dekripsi
3.2.1 Pembentukan Kotak Substitusi S-Box
Kotak substitusi untuk ByteSub dibentuk dari fungsi inversi perkalian pada GF2
8
dan kemudian ditambahkan operasi XOR terhadap fungsi affine semacam fungsi linear. Berikut implementasi kotak substitusi ke dalam bahasa pemrograman.
ltab0 = 0 ltab1 = 0
ltab3 = 1 ptab0 = 1
ptab1 = 3 For i = 2 To 255 ptabi = ptabi - 1 Xor Xtimeptabi - 1
If ptabi - 1 And H80 Then ptabi = ptabi - 1 Xor ptabi - 1 And 127 2 Xor
H1B Else
ptabi = ptabi - 1 Xor ptabi - 1 2 End If
ltabptabi = i
Eko Satria : Studi Algoritma RIJNDAEL Dalam Sistem Keamanan Data, 2009. USU Repository © 2009
Next i Te40 = H63636363
Td4H63 = 0 For i = 1 To 255
y = ptab255 - ltabi multiplicative inverse ib = y
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
If ib And H80 Then ib = ib And 127 2 Or 1 Else ib = ib 2 y = y Xor ib Xor H63
s0 = y s1 = s0
s2 = s0 s3 = s0
CopyMemory Te4i, s0, 4 s0 = i
s1 = s0 s2 = s0
s3 = s0 CopyMemory Td4y, s0, 4
Next i y = 1
For i = 0 To UBoundrco rcoi = y
If y And H80 Then y = Xtimey y = y And 127 2 Xor H1B
Else y = y 2
End If Next i
For i = 0 To 255 y = Te4i And HFF
If y And H80 Then s0 = y And 127 2 Xor H1B
s3 = y Xor s0 Else
s0 = y 2 s3 = y Xor s0
End If s2 = y
s1 = y CopyMemory s4, s0, 4
CopyMemory Te0i, s0, 4 CopyMemory Te1i, s3, 4
CopyMemory Te2i, s2, 4 CopyMemory Te3i, s1, 4
y = Td4i And HFF
Eko Satria : Studi Algoritma RIJNDAEL Dalam Sistem Keamanan Data, 2009. USU Repository © 2009
If y = 0 Then s3 = 0
s2 = 0 s1 = 0
s0 = 0 Else
s3 = ptabCLngltabHB + CLngltaby Mod 255 s2 = ptabCLngltabHD + CLngltaby Mod 255
s1 = ptabCLngltabH9 + CLngltaby Mod 255 s0 = ptabCLngltabHE + CLngltaby Mod 255
End If CopyMemory s4, s0, 4
CopyMemory Td0i, s0, 4 CopyMemory Td1i, s3, 4
CopyMemory Td2i, s2, 4 CopyMemory Td3i, s1, 4
Next i
Implementasi S-Box kunci ekspansi dalam bahasa pemrograman.
rco0=H1:rco1=H2:rco2=H4:rco3=H8:rco4=H10 rco5=H20:rco6=H40:rco7=H80:rco8=H1B:rco9 = H36
If SUPPORT_LEVEL Then rco10=H6C:rco11=HD8:rco12=HAB:rco13=H4D:rco14=H9A
rco15=H2F:rco16=H5E:rco17=HBC:rco18=H63:rco19=HC6 rco20=H97:rco21=H35:rco22=H6A:rco23=HD4:rco24=HB3
rco25=H7D:rco26=HFA:rco27=HEF:rco28=HC5
End If
Eko Satria : Studi Algoritma RIJNDAEL Dalam Sistem Keamanan Data, 2009. USU Repository © 2009
3.2.2 Proses MixColumns
Operasi ini merupakan suatu operasi dari penambahan kunci dengan operasi XOR. Berikut implementasi operasi MixColumns ke dalam bahasa pemrograman.
i = 4 CopyMemory fkey0, pass0, 4 i
For j = 0 To 9 CopyMemory s0, fkeyi - 1, 4
fkeyi = fkeyi - 4 Xor Te4s0 And HFF000000 _ Xor Te4s3 And HFF0000 _
Xor Te4s2 And HFF00 _ Xor Te4s1 And HFF _
Xor rcoj fkeyi + 1 = fkeyi - 3 Xor fkeyi
fkeyi + 2 = fkeyi - 2 Xor fkeyi + 1 fkeyi + 3 = fkeyi - 1 Xor fkeyi + 2
i = i + 4 Next j
Nr = 10
3.2.3 Proses Enkripsi
Dalam proses enkripsi ini terdapat proses enkripsi teks dan enkripsi file.
1. Proses enkripsi teks
Public Sub BlockEncryptplaintext 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 s15 As Byte CopyMemory t0, plaintextp + 0, 4
CopyMemory t1, plaintextp + 4, 4 CopyMemory t2, plaintextp + 8, 4
CopyMemory t3, plaintextp + 12, 4 t0 = t0 Xor fkey0
t1 = t1 Xor fkey1 t2 = t2 Xor fkey2
t3 = t3 Xor fkey3 k = 4
Eko Satria : Studi Algoritma RIJNDAEL Dalam Sistem Keamanan Data, 2009. USU Repository © 2009
For i = 1 To Nr - 1 Nr is number of rounds CopyMemory s0, t0, 4
CopyMemory s4, t1, 4 CopyMemory s8, t2, 4
CopyMemory s12, t3, 4 t0 = Te0s0 Xor Te1s5 Xor Te2s10 Xor Te3s15
Xor fkeyk + 0 t1 = Te0s4 Xor Te1s9 Xor Te2s14 Xor Te3s3 Xor
fkeyk + 1 t2 = Te0s8 Xor Te1s13 Xor Te2s2 Xor Te3s7 Xor
fkeyk + 2 t3 = Te0s12 Xor Te1s1 Xor Te2s6 Xor Te3s11
Xor fkeyk + 3 k = k + 4
Next i Final round
CopyMemory s0, t0, 4 CopyMemory s4, t1, 4
CopyMemory s8, t2, 4 CopyMemory s12, t3, 4
t0 = Te4s0 And HFF Xor Te4s5 And HFF00 Xor Te4s10 And HFF0000 Xor Te4s15 And HFF000000 Xor fkeyk
+ 0 t1 = Te4s4 And HFF Xor Te4s9 And HFF00 Xor
Te4s14 And HFF0000 Xor Te4s3 And HFF000000 Xor fkeyk + 1
t2 = Te4s8 And HFF Xor Te4s13 And HFF00 Xor Te4s2 And HFF0000 Xor Te4s7 And HFF000000 Xor fkeyk +
2 t3 = Te4s12 And HFF Xor Te4s1 And HFF00 Xor
Te4s6 And HFF0000 Xor Te4s11 And HFF000000 Xor fkeyk + 3
CopyMemory ciphertextq + 0, t0, 4 CopyMemory ciphertextq + 4, t1, 4
CopyMemory ciphertextq + 8, t2, 4 CopyMemory ciphertextq + 12, t3, 4
End Sub
2. Proses enkripsi file
Public Function FileEncryptPlaintextFileName As String, CiphertextFileName As String, BlockBits As Long As Long
Else Public Function FileEncryptPlaintextFileName 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
Eko Satria : Studi Algoritma RIJNDAEL Dalam Sistem Keamanan Data, 2009. USU Repository © 2009
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 = FileLenPlaintextFileName
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 dataMaxBlocks BlockSize - 1 Do
Get FileNum, , data If SUPPORT_LEVEL Then
Select Case BlockBits Case 128
End If For i = 0 To MaxBlocks - 1 BlockSize Step BlockSize
BlockEncrypt data, data, i, i Next i
If SUPPORT_LEVEL Then Case 192
For i = 0 To MaxBlocks - 1 BlockSize Step BlockSize Block192Encrypt data, data, i, i
Next i Case 256
For i = 0 To MaxBlocks - 1 BlockSize Step BlockSize Block256Encrypt data, data, i, i
Next i If SUPPORT_LEVEL = 2 Then
Case 160 For i = 0 To MaxBlocks - 1 BlockSize Step BlockSize
Block160Encrypt data, data, i, i Next i
Case 224 For i = 0 To MaxBlocks - 1 BlockSize Step BlockSize
Block224Encrypt data, data, i, i
Eko Satria : Studi Algoritma RIJNDAEL Dalam Sistem Keamanan Data, 2009. USU Repository © 2009
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 datam - 1
Get FileNum, , data datam - 1 = n Mod BlockSize
If SUPPORT_LEVEL Then Select Case BlockBits
Case 128 End If
For i = 0 To m - BlockSize Step BlockSize BlockEncrypt data, data, i, i
Next i If SUPPORT_LEVEL Then
Case 192 For i = 0 To m - BlockSize Step BlockSize
Block192Encrypt data, data, i, i Next i
Case 256 For i = 0 To m - BlockSize Step BlockSize
Block256Encrypt data, data, i, i Next i
If SUPPORT_LEVEL = 2 Then Case 160
For i = 0 To m - BlockSize Step BlockSize Block160Encrypt data, data, i, i
Next i Case 224
For i = 0 To m - BlockSize Step BlockSize Block224Encrypt data, data, i, i
Next i End If
End Select End If
Put FileNum2, , data Close FileNum
Close FileNum2 End Function
Eko Satria : Studi Algoritma RIJNDAEL Dalam Sistem Keamanan Data, 2009. USU Repository © 2009
3.2.4 Proses Dekripsi
Dalam proses dekripsi ini terdapat proses dekripsi teks dan dekripsi file.
1. Proses dekripsi teks
Public Sub BlockDecryptplaintext 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 s15 As Byte CopyMemory t0, ciphertextq + 0, 4
CopyMemory t1, ciphertextq + 4, 4 CopyMemory t2, ciphertextq + 8, 4
CopyMemory t3, ciphertextq + 12, 4 t0 = t0 Xor rkey0
t1 = t1 Xor rkey1 t2 = t2 Xor rkey2
t3 = t3 Xor rkey3 k = 4
For i = 1 To Nr - 1 Nr is number of rounds CopyMemory s0, t0, 4
CopyMemory s4, t1, 4 CopyMemory s8, t2, 4
CopyMemory s12, t3, 4 t0 = Td0s0 Xor Td1s13 Xor Td2s10 Xor Td3s7
Xor rkeyk + 0 t1 = Td0s4 Xor Td1s1 Xor Td2s14 Xor Td3s11
Xor rkeyk + 1 t2 = Td0s8 Xor Td1s5 Xor Td2s2 Xor Td3s15 Xor
rkeyk + 2 t3 = Td0s12 Xor Td1s9 Xor Td2s6 Xor Td3s3 Xor
rkeyk + 3 k = k + 4
Next i Final round
CopyMemory s0, t0, 4 CopyMemory s4, t1, 4
CopyMemory s8, t2, 4 CopyMemory s12, t3, 4
t0 = Td4s0 And HFF Xor Td4s13 And HFF00 Xor Td4s10 And HFF0000 Xor Td4s7 And HFF000000 Xor rkeyk +
t1 = Td4s4 And HFF Xor Td4s1 And HFF00 Xor Td4s14 And HFF0000 Xor Td4s11 And HFF000000 Xor rkeyk
+ 1
Eko Satria : Studi Algoritma RIJNDAEL Dalam Sistem Keamanan Data, 2009. USU Repository © 2009
t2 = Td4s8 And HFF Xor Td4s5 And HFF00 Xor Td4s2 And HFF0000 Xor Td4s15 And HFF000000 Xor rkeyk +
2 t3 = Td4s12 And HFF Xor Td4s9 And HFF00 Xor
Td4s6 And HFF0000 Xor Td4s3 And HFF000000 Xor rkeyk + 3
CopyMemory plaintextp + 0, t0, 4 CopyMemory plaintextp + 4, t1, 4
CopyMemory plaintextp + 8, t2, 4 CopyMemory plaintextp + 12, t3, 4
End Sub
2. Proses dekripsi file
Public Function FileDecryptPlaintextFileName As String, CiphertextFileName As String, BlockBits As Long As Long
Else Public Function FileDecryptPlaintextFileName As String,
CiphertextFileName As String As Long End If
Dim FileNum As Integer Dim FileNum2 As Integer
Dim i As Long Dim m As Long ciphertext file size
Dim n As Long plaintext file size Dim data As Byte
If SUPPORT_LEVEL = 0 Then Const BlockSize As Long = 16 bytes
Const MaxBlocks As Long = MaxFileChunkSize \ BlockSize Else
Dim BlockSize As Long Dim MaxBlocks As Long
Select Case BlockBits Case 128: BlockSize = 16
Case 192: BlockSize = 24 Case 256: BlockSize = 32
If SUPPORT_LEVEL = 2 Then Case 160: BlockSize = 20
Case 224: BlockSize = 28 End If
Case Else: Err.Raise 1, , cRijndael.FileDecrypt - Illegal BlockBits value
End Select MaxBlocks = MaxFileChunkSize \ BlockSize
End If m = FileLenCiphertextFileName
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
Eko Satria : Studi Algoritma RIJNDAEL Dalam Sistem Keamanan Data, 2009. USU Repository © 2009
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 dataMaxBlocks BlockSize - 1
Do Get FileNum, , data
If SUPPORT_LEVEL Then Select Case BlockBits
Case 128 End If
For i = 0 To MaxBlocks - 1 BlockSize Step BlockSize
BlockDecrypt data, data, i, i Next i
If SUPPORT_LEVEL Then Case 192
For i = 0 To MaxBlocks - 1 BlockSize Step BlockSize
Block192Decrypt data, data, i, i Next i
Case 256 For i = 0 To MaxBlocks - 1 BlockSize Step
BlockSize Block256Decrypt data, data, i, i
Next i If SUPPORT_LEVEL = 2 Then
Case 160 For i = 0 To MaxBlocks - 1 BlockSize Step
BlockSize Block160Decrypt data, data, i, i
Next i Case 224
For i = 0 To MaxBlocks - 1 BlockSize Step BlockSize
Block224Decrypt data, data, i, i Next i
End If End Select
End If Put FileNum2, , data
m = m - MaxBlocks BlockSize Loop While m MaxBlocks BlockSize
End If Decrypt the last piece of the file
ReDim datam - 1 Get FileNum, , data
If SUPPORT_LEVEL Then Select Case BlockBits
Case 128 End If
Eko Satria : Studi Algoritma RIJNDAEL Dalam Sistem Keamanan Data, 2009. USU Repository © 2009
For i = 0 To m - BlockSize Step BlockSize BlockDecrypt data, data, i, i
Next i If SUPPORT_LEVEL Then
Case 192 For i = 0 To m - BlockSize Step BlockSize
Block192Decrypt data, data, i, i Next i
Case 256 For i = 0 To m - BlockSize Step BlockSize
Block256Decrypt data, data, i, i Next i
If SUPPORT_LEVEL = 2 Then Case 160
For i = 0 To m - BlockSize Step BlockSize Block160Decrypt data, data, i, i
Next i Case 224
For i = 0 To m - BlockSize Step BlockSize Block224Decrypt data, data, i, i
Next i End If
End Select End If
Recover length field If datam - 1 BlockSize Then
n = m - BlockSize + CLngdatam - 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 datan - 1 Put FileNum2, , data
End If Close FileNum
Close FileNum2 End If
End Function
Eko Satria : Studi Algoritma RIJNDAEL Dalam Sistem Keamanan Data, 2009. USU Repository © 2009
3.3 Flowchart Program