Advanced Encryption Standard AES - Rijndael - Assembler optimiert
Zum Code
In diesem Projekt habe ich meine eigene Implementierung von AES (Rijndael) verwirklicht. AES ist der Nachfolger vom alten Verschlüsselungsstandard DES (bzw. später Triple-DES). Wer mehr über AES erfahren möchte, kann sich bei Wikipedia informieren: http://de.wikipedia.org/wiki/AES

Die korrekte Ausführung des Algorithmus wird mittels einem einfachem Testmodul überprüft. Dennoch kann ich keine Fehlerlosigkeit garantieren, korrigiere aber gerne jeden Fehler den jemand findet. Für eine weitergehende sicherheitsrelevante Anwendung ist die Implementierung nicht ausreichend abgeschirmt, da weder Variablen gelöscht werden noch sonstige Daten abgeschirmt sind. Zusätzlich zum Testmodul existiert ein Speedtest-Modul, mit welchem die Ausführungszeit für einen Durchlauf gemessen werden kann. Hieraus wird zudem der theoretische Datendurchsatz errechnet.

Die Referenzimplementierung ist in reinem VB abgehandelt und kommentiert. Die Kommentare setzen allerdings Kenntnis von der Materie voraus. Theoretisch dürfte der Referenzcode mit allen vorgesehenen Bitlängen (128/196/256 Bit sowohl für Blöcke als auch Schlüssel) zurecht kommen. Zwecks verbesserter Performanz habe ich die Verschlüsselungsroutine ebenfalls in Assembler zur Verfügung gestellt. Diese Variante ist jedoch auf 128 Bit für die Blöcke und die Schlüssel begrenzt. Der beiliegende Assemblercode ist für MASM vorgesehen. Auf meinem Athlon XP2200+ erreicht die optimierte Variante einen theoretischen Datendurchsatz von ~72 Mb/s.

History
24.09.2004 Hinzugefügt
16.10.2004 Entschlüsselung nun auch in Assembler vorhanden

Autor: Dominik Auras <Dominik_auf_vbInside.de>

Code aus RijndaelTest.bas
Private Const EXIT_ON_ERROR As Boolean = True

Public Sub Do_Tests()
VariableKey_Test
VariableText_Test
Random_Test
End Sub

Private Sub VariableKey_Test()
Dim key() As Byte, block(3, 3) As Byte
Dim i As Byte, n As Byte, c As Long, k As String

Log "Test mit variablen Schlüssel wird gestartet"
Log "Block- und Schlüssellänge: 128 Bit"

k = String(16, "0")

c = 1
Mid$(k, c, 1) = "8"

Do
key = StrConv(k, vbFromUnicode)
KeyExpansion key, 128

For i = 0 To 3
For n = 0 To 3
block(i, n) = 0
Next n
Next i

Rijndael_EncryptBlock block
Rijndael_DecryptBlock block

For i = 0 To 3
For n = 0 To 3
If block(i, n) <> 0 Then
Log "Fehler aufgetreten, VariableKey-Test"
PrintBlock block
If EXIT_ON_ERROR Then
Stop
End If
End If
Next n
Next i

If Mid$(k, c, 1) = "1" Then
Mid$(k, c, 1) = "0"
c = c + 1
If c > 16 Then
Exit Do
End If
Mid$(k, c, 1) = "8"
Else
If Mid$(k, c, 1) = "2" Then
Mid$(k, c, 1) = "1"
Else
If Mid$(k, c, 1) = "4" Then
Mid$(k, c, 1) = "2"
Else
If Mid$(k, c, 1) = "8" Then
Mid$(k, c, 1) = "4"
Else
Stop
End If
End If
End If
End If
Loop

Log CStr(c * 4 - 4) & " Schlüssel ausprobiert"
Log "Test erfolgreich beendet"
Log "#####################################"
End Sub

Private Sub VariableText_Test()
Dim key() As Byte, block() As Byte, block2() As Byte
Dim i As Byte, n As Byte, c As Long, b As String

Log "Test mit variablem Plaintext wird gestartet"
Log "Block- und Schlüssellänge: 128 Bit"

key = StrConv(String(16, "0"), vbFromUnicode)
KeyExpansion key, 128

b = String(16, "0")
c = 1
Mid$(b, c, 1) = "8"

Do
StringToBlock b, block, 128
StringToBlock b, block2, 128

Rijndael_EncryptBlock block
Rijndael_DecryptBlock block

For i = 0 To 3
For n = 0 To 3
If block(i, n) <> block2(i, n) Then
Log "Fehler aufgetreten, VariableText-Test"
PrintBlock block
PrintBlock block2
If EXIT_ON_ERROR Then
Stop
End If
End If
Next n
Next i

If Mid$(b, c, 1) = "1" Then
Mid$(b, c, 1) = "0"
c = c + 1
If c > 16 Then
Exit Do
End If
Mid$(b, c, 1) = "8"
Else
If Mid$(b, c, 1) = "2" Then
Mid$(b, c, 1) = "1"
Else
If Mid$(b, c, 1) = "4" Then
Mid$(b, c, 1) = "2"
Else
If Mid$(b, c, 1) = "8" Then
Mid$(b, c, 1) = "4"
Else
Stop
End If
End If
End If
End If
Loop

Log CStr(c * 4 - 4) & " Blöcke ausprobiert"
Log "Test erfolgreich beendet"
Log "#####################################"
End Sub

Private Sub Random_Test()
Dim key() As Byte, block() As Byte, block2() As Byte
Dim i As Long, k As String, n As Long

Log "Verschiedene Tests werden ausgeführt"
Log "Block- und Schlüssellänge: 128 Bit"

Log "Schlüssel und Block identisch: = Null"
ReDim key(15)
ReDim block(3, 3): ReDim block2(3, 3)

KeyExpansion key, 128
Rijndael_EncryptBlock block
Rijndael_DecryptBlock block
Check_Block block, block2

Log "Schlüssel und Block identisch: Zufallswerte"
k = ""
For i = 1 To 16
k = k & Chr$(Rnd * 255)
Next i
key = StrConv(k, vbFromUnicode)
StringToBlock k, block, 128
Copy_Block block, block2

KeyExpansion key, 128
Rijndael_EncryptBlock block
Rijndael_DecryptBlock block
Check_Block block, block2

Log "Schlüssel und Block zufällig festgelegt"
For i = 1 To Rnd * 1000 + 1000
k = ""
For n = 1 To 16
k = k & Chr$(Rnd * 255)
Next n
key = StrConv(k, vbFromUnicode)

Set_Random block
Copy_Block block, block2

KeyExpansion key, 128
Rijndael_EncryptBlock block
Rijndael_DecryptBlock block
Check_Block block, block2
Next i

Log "Test erfolgreich beendet"
Log "#####################################"
End Sub

Private Sub Check_Block(block() As Byte, block2() As Byte)
Dim i As Long, n As Long

For i = 0 To 3
For n = 0 To 3
If block(i, n) <> block2(i, n) Then
Log "Fehler aufgetreten: Random_Test"
PrintBlock block
PrintBlock block2
If EXIT_ON_ERROR Then
Stop
End If
End If
Next n
Next i
End Sub

Private Sub Set_Random(block() As Byte)
Dim i As Long, n As Long

For i = 0 To 3
For n = 0 To 3
block(i, n) = Int(Rnd * 255)
Next n
Next i
End Sub

Private Sub Copy_Block(block() As Byte, block2() As Byte)
Dim i As Long, n As Long

For i = 0 To 3
For n = 0 To 3
block2(i, n) = block(i, n)
Next n
Next i
End Sub