Zum Abschluss hier ein AES128-Anwendungs-Beispiel in seiner simpelsten Form (trotzdem wohl mehr als sicher). Betreffs Durchsatz fehlen mir Vergleichswerte von anderen Programmen; wer entscheidene Verbesserungen findet kann´s mir mitteilen
Code: Alles auswählen
;- AES128-Test, Textblock-und Keyword-Länge jeweils 128 Bit, ECB-Modus
;- "Helle" Klaus Helbing, 25.12.2007, PB4.10
;- Die Original-Datei bleibt unberührt und erhält ein "O" am Ende des Datei-Namens und
;- kann jederzeit wieder umbenannt werden
;- Die verschlüsselte Datei erhält neben "AES128" ein "_X" am Ende, wobei X ein Hexwert
;- von 0 bis F sein kann (gibt die Anzahl der evtl. notwendigen Auffüll-Bytes an)
;- Der Vorteil dieser Methode ist, dass für die verschlüsselte Datei auf dem Datenträger
;- nie mehr Platz als für die Original-Datei benötigt wird
;- Die verschlüsselte Datei wird im selben Verzeichnis wie die Original-Datei abgespeichert
;- Als Buffer-Größe wurde 4096 = normale Cluster-Größe NTFS gewählt
Global Array1.l
Global RoundKey.l
Global Round.l
Global RConZ.l
Global Schleife1.l
Global Schleife2.l
Global Key.l ;Zeiger auf Passwort
Global Laenge.l
Global Auffuell.l
Array1=AllocateMemory(4096) ;der eigentliche "Arbeitsplatz"
RoundKey=AllocateMemory(160) ;für 10 Rundenschlüssel a 16 Bytes
Array2=Array1
CipherKey$=Space(16)
Key=@CipherKey$
Procedure GenRoundKeys()
;- RoundKeys ermitteln
;- RoundKey1, Ergebnis steht in RoundKey
!mov [v_RConZ],0
!mov [v_Round],0
!mov edi,[v_Key]
!mov eax,[edi+12]
!ror eax,8
!mov edi,[v_RoundKey]
!lea esi,[l_sbox]
!xor ebx,ebx
!mov ecx,4
!@@:
!mov bl,al
!mov dl,[esi+ebx]
!mov [edi],dl
!shr eax,8
!inc edi
!dec ecx
!jnz @b
!mov esi,[v_RoundKey]
!mov edi,[v_Key]
!lea edx,[l_rcon]
!mov eax,[edi]
!xor [esi],eax
!mov ebx,[edx]
!xor [esi],ebx ;1.DWord von RoundKey1
!mov eax,[edi+4]
!xor eax,[esi]
!mov [esi+4],eax ;2.DWord von RoundKey1
!xor eax,[edi+8]
!mov [esi+8],eax ;3.DWord von RoundKey1
!xor eax,[edi+12]
!mov [esi+12],eax ;4.DWord von RoundKey1
;- Ende RoundKey1
;- RoundKey2 - RoundKey10
!mov [v_Schleife1],9
!RoundKeys:
!add [v_RConZ],4
!ror eax,8
!lea esi,[l_sbox]
!mov ecx,4
!@@:
!mov ebx,eax
!and ebx,0ffh
!mov dl,[esi+ebx]
!dec ecx
!jz @f
!shl edx,8
!shr eax,8
!jmp @b
!@@:
!bswap edx
!mov edi,[v_RoundKey]
!add edi,[v_Round] ;1.DWord vom "VorKey"
!mov eax,[edi]
!xor eax,edx
!lea esi,[l_rcon]
!add esi,[v_RConZ]
!xor eax,[esi]
!add edi,16 ;hier soll abgespeichert werden
!mov [edi],eax
!add edi,4
!xor eax,[edi-16]
!mov [edi],eax ;2.DWord
!add edi,4
!xor eax,[edi-16]
!mov [edi],eax ;3.DWord
!add edi,4
!xor eax,[edi-16]
!mov [edi],eax ;4.DWord
!add [v_Round],16
!dec [v_Schleife1]
!jnz RoundKeys
;- Ende RoundKey2 - RoundKey10
EndProcedure
Procedure EnCrypt()
;- 1.Schritt State XOR Cipher Key -----
;- Ergebnis steht in Array1
!mov edi,[v_Array1]
!mov esi,[v_Key]
!mov ecx,4
!@@:
!mov eax,[esi]
!xor [edi],eax
!add edi,4
!add esi,4
!dec ecx
!jnz @b
;--------------------------------------
!mov [v_Round],ecx ;für Schleife unten, ECX=0
!SchleifeEC:
;- 2.Schritt Werte aus S-Box holen ----
;- Ergebnis steht in Array1
!mov edi,[v_Array1]
!lea esi,[l_sbox]
!xor ebx,ebx
!mov edx,4
!S0EC:
!mov ecx,4
!@@:
!mov bl,[edi]
!mov al,[esi+ebx]
!mov [edi],al
!inc edi
!dec ecx
!jnz @b
!dec edx
!jnz S0EC
;--------------------------------------
;- 3.Schritt Rotationen ---------------
;- Ergebnis steht in Array1
!mov esi,[v_Array1]
!mov ecx,8
!RotatEC:
!inc esi
!mov edx,12
!@@:
!mov al,[esi+edx]
!sub edx,4
!jc @f
!shl eax,8
!jmp @b
!@@:
!ror eax,cl
!xor edx,edx
!@@:
!mov [esi+edx],al
!add edx,4
!cmp edx,16
!je @f
!shr eax,8
!jmp @b
!@@:
!add ecx,8
!cmp ecx,24
!jbe RotatEC
;--------------------------------------
;- 4.Schritt Mix-Columns --------------
;- Ergebnis steht in Array1
!cmp [v_Round],144
!je NoMix ;letzte Runde nicht
!mov esi,[v_Array1]
!mov [v_Schleife2],4
!Mix2EC:
!mov ebx,[esi]
!mov [v_Schleife1],4
!Mix1EC:
!xor eax,eax
!mov ecx,eax
!mov edx,ebx
!shl dl,1
!jnc @f
!xor dl,1bh
!@@:
!ror ebx,8
!mov al,bl
!shl ax,1
!mov cl,bl
!xor ax,cx
!or ah,ah
!je @f
!xor al,1bh
!@@:
!xor al,dl
!ror ebx,8
!xor al,bl
!ror ebx,8
!xor al,bl
!mov [esi],al
!inc esi
!ror ebx,16
!dec [v_Schleife1]
!jnz Mix1EC
;--------------------------------------
!dec [v_Schleife2]
!jnz Mix2EC
!NoMix:
;- 5.Schritt AddRoundKey --------------
;- Ergebnis steht in Array1
!mov edi,[v_Array1]
!mov esi,[v_RoundKey]
!add esi,[v_Round]
!mov ecx,4
!@@:
!mov eax,[esi]
!xor [edi],eax
!add edi,4
!add esi,4
!dec ecx
!jnz @b
;--------------------------------------
!add [v_Round],16 ;Zeiger in RoundKey
!cmp [v_Round],160
!jne SchleifeEC
;--------------------------------------
EndProcedure
Procedure DeCrypt()
;- 1.Schritt State XOR RoundKey10 -----
;- Ergebnis steht in Array1
!mov edi,[v_Array1]
!mov esi,[v_RoundKey]
!add esi,144
!mov ecx,4
!@@:
!mov eax,[esi]
!xor [edi],eax
!add edi,4
!add esi,4
!dec ecx
!jnz @b
;--------------------------------------
!mov [v_Round],128
!mov [v_Schleife1],10
!SchleifeDC:
;- 2.Schritt Rotationen ---------------
;- Ergebnis steht in Array1
!mov esi,[v_Array1]
!mov ecx,8
!RotatDC:
!inc esi
!mov ebx,12
!@@:
!mov al,[esi+ebx]
!sub ebx,4
!jc @f
!shl eax,8
!jmp @b
!@@:
!rol eax,cl ;hier "andersrum"
!xor ebx,ebx
!@@:
!mov [esi+ebx],al
!add ebx,4
!cmp ebx,16
!je @f
!shr eax,8
!jmp @b
!@@:
!add ecx,8
!cmp ecx,24
!jbe RotatDC
;--------------------------------------
;- 3.Schritt Werte aus InvSBox holen --
;- Ergebnis steht in Array1
!mov edi,[v_Array1]
!lea esi,[l_invsbox]
!mov edx,4
!S0DC:
!mov ecx,4
!@@:
!mov bl,[edi] ;EBX wurde oben auf Null gesetzt
!mov al,[esi+ebx]
!mov [edi],al
!inc edi
!dec ecx
!jnz @b
!dec edx
!jnz S0DC
;--------------------------------------
!cmp [v_Round],-16
!je EndWert
;- 4.Schritt AddRoundKey --------------
;- Ergebnis steht in Array1
!mov edi,[v_Array1]
!mov esi,[v_RoundKey]
!add esi,[v_Round]
!mov ecx,4
!@@:
!mov edx,[esi]
!xor [edi],edx
!add edi,4
!add esi,4
!dec ecx
!jnz @b
;- 5.Schritt Inv-Mix-Columns ----------
!mov esi,[v_Array1]
!lea edi,[l_xtime]
!mov [v_Schleife2],4
!Mix2DC:
!mov ecx,4
!mov edx,[esi] ;4 Bytes einer Spalte
!Mix1DC:
;1.Byte *0Eh
!mov bl,dl ;EBX wurde oben auf Null gesetzt
!mov al,[edi+ebx]
!mov bl,al
!mov bl,[edi+ebx]
!xor al,bl
!xor al,[edi+ebx]
;2.Byte *0Bh
!ror edx,8
!mov bl,dl
!xor al,dl
!mov bl,[edi+ebx]
!xor al,bl
!mov bl,[edi+ebx]
!xor al,[edi+ebx]
;3.Byte *0Dh
!ror edx,8
!mov bl,dl
!xor al,dl
!mov bl,[edi+ebx]
!xor al,[edi+ebx]
!mov bl,[edi+ebx]
!xor al,[edi+ebx]
;4.Byte *09h
!ror edx,8
!mov bl,dl
!xor al,dl
!mov bl,[edi+ebx]
!mov bl,[edi+ebx]
!xor al,[edi+ebx]
;- "gemixtes" Byte abspeichern
!mov [esi],al
!ror edx,16
!inc esi
!dec ecx
!jnz Mix1DC
!dec [v_Schleife2]
!jnz Mix2DC
!sub [v_Round],16
!dec [v_Schleife1]
!jnz SchleifeDC
;--------------------------------------
!EndWert:
;- Endergebnis steht in Array1
!mov edi,[v_Array1]
!mov esi,[v_Key]
!mov ecx,4
!@@:
!mov edx,[esi]
!xor [edi],edx
!add edi,4
!add esi,4
!dec ecx
!jnz @b
;--------------------------------------
EndProcedure
;=================================== T E S T P R O G R A M M ======================================
If OpenWindow(0,0,0,450,280,"AES128, ECB",#PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
TextGadget(0,10,10,430,20,"Zu bearbeitende Datei auswählen :",#PB_Text_Center)
ExplorerTreeGadget(1, 10, 30, 430, 240,"",#PB_Explorer_NoDriveRequester)
Repeat
Event=WaitWindowEvent()
If Event=#PB_Event_CloseWindow
End
EndIf
Until EventType()=#PB_EventType_LeftDoubleClick And GetGadgetState(1)=#PB_Explorer_File
File$=GetGadgetText(1)
FreeGadget(0):FreeGadget(1)
File1$=File$
If Len(File$)>75
File1$=Mid(File$,1,75)+#LFCR$+Mid(File$,76,Len(File$)-75)
EndIf
TextGadget(0,10,10,430,20,"Ausgewählte Datei :",#PB_Text_Center)
TextGadget(1,10,30,430,40,File1$,#PB_Text_Center)
OptionGadget(2,50,70,100,20,"Verschlüsseln")
OptionGadget(3,300,70,100,20,"Entschlüsseln")
Repeat
Event=WaitWindowEvent()
If Event=#PB_Event_CloseWindow
End
EndIf
Until EventGadget()=2 Or EventGadget()=3
Art=GetActiveGadget()
If Art=2
Art$="Verschlüsselung"
Else
Art$="Entschlüsselung"
EndIf
FreeGadget(2):FreeGadget(3)
TextGadget(2,10,70,430,20,"Bearbeitungsart :",#PB_Text_Center)
TextGadget(3,10,90,430,20,Art$,#PB_Text_Center)
TextGadget(4,35,120,380,20,"Bitte Passwort eingeben (max.16 Zeichen) :",#PB_Text_Center)
StringGadget(5, 125, 140, 200, 20, "", #PB_String_Password)
SetActiveGadget(5)
ButtonGadget(6,175,170,100,20,"OK")
Repeat
Event=WaitWindowEvent()
If Event=#PB_Event_CloseWindow
End
EndIf
Until EventGadget()=6
CipherKey$=Mid(GetGadgetText(5),1,16)
CipherKey$=LSet(CipherKey$,16) ;oder mit anderen Zeichen als Space auffüllen
FreeGadget(4):FreeGadget(5):FreeGadget(6)
TextGadget (4,10,120,430,20, "Bearbeitungs-Fortschritt :", #PB_Text_Center)
ProgressBarGadget(5,10,145,430,30,0,100)
Else
MessageRequester("Fehler !","Auswahl bzw. Eingabe überprüfen !")
End
EndIf
;----------------------------
Select Art
;- Verschlüsselung
Case 2
CreateFile(1,File$+".AES128")
ReadFile(0,File$) ;nur zum Lesen öffnen
FileL=Lof(0)
FileR=FileL%4096
FileL/4096
TA=ElapsedMilliseconds()
GenRoundKeys()
For i=1 To FileL
Laenge=ReadData(0,Array1,4096)
X+Laenge ;für Anzeige
For k=1 To 256 ;4096/16
EnCrypt()
Array1+16
Next
WriteData(1,Array2,Laenge)
Array1-Laenge
Y.f=(X/(FileL*4096))*100
SetGadgetState(5,Y)
Next
Auffuell=FileR%16
;- Rest der Datei:
If FileR
Laenge=ReadData(0,Array1,FileR)
If Auffuell
!mov edi,[v_Array1]
!add edi,[v_Laenge]
!mov ecx,[v_Auffuell]
!@@:
!mov byte[edi],0 ;für Test Null als Auffüll-Byte(s)
!inc edi
!dec ecx
!jnz @b
EndIf
Laenge+Auffuell
m=Laenge/16
For k=1 To m
EnCrypt()
Array1+16
Next
WriteData(1,Array2,Laenge)
SetGadgetState(5,100) ;kühn auf fertig gesetzt
EndIf
CloseFile(0)
CloseFile(1)
;- an den Namem der verschlüsselten Datei die Anzahl der Auffüll-Bytes anhängen
FileAlt$=File$+".AES128"
FileNeu$=FileAlt$+"_"+Hex(Auffuell) ;Hex, damit nur 1 Zeichen (0 bis F)
RenameFile(FileAlt$,FileNeu$)
;- an den Namen der Original-Datei ein "O" anhängen, normalerweise wird die Datei gelöscht
RenameFile(File$,File$+"O")
TE=ElapsedMilliseconds()-TA
If TE
Durchsatz=FileL*4096/TE
EndIf
TextGadget(7,10,190,430,20,"Verschlüsselungs-Zeit = "+ Str(TE)+" ms",#PB_Text_Center)
TextGadget(8,10,215,430,20,"Durchsatz = "+Str(Durchsatz)+" kB/s" ,#PB_Text_Center)
ButtonGadget(9,175,240,100,20,"Ende")
Repeat
Event=WaitWindowEvent()
If Event=#PB_Event_CloseWindow
End
EndIf
Until EventGadget()=9
End
;--------------------------------------------------------------------------------------------------
;- Entschlüsselung
Case 3
Auffuell$=Mid(File$,Len(File$),1)
If Asc(Auffuell$)>60
Auffuell=Asc(Auffuell$)-55
Else
Auffuell=Asc(Auffuell$)-48
EndIf
FileN$=Mid(File$,1,Len(File$)-9) ;".AES128_"und Anzahl der Auffüll-Bytes entfernen
CreateFile(1,FileN$) ;ist der Original-Dateiname
ReadFile(0,File$) ;verschlüsselte Datei nur zum Lesen öffnen
FileL=Lof(0)
Array1=AllocateMemory(4096) ;der eigentliche "Arbeitsplatz"
Array2=Array1 ;ist so am einfachsten
RoundKey=AllocateMemory(160) ;für 10 Rundenschlüssel a 16 Bytes
FileR=FileL%4096
FileL/4096
TA=ElapsedMilliseconds()
GenRoundKeys()
For i=1 To FileL
Laenge=ReadData(0,Array1,4096) ;sollte immer 4096 sein
X+Laenge ;für Anzeige
For k=1 To 256 ;4096/16
DeCrypt()
Array1+16
Next
WriteData(1,Array2,Laenge)
Array1-Laenge
Y.f=(X/(FileL*4096))*100
SetGadgetState(5,Y)
Next
If FileR
Laenge=ReadData(0,Array1,FileR)
m=Laenge/16
For k=1 To m
DeCrypt()
Array1+16
Next
WriteData(1,Array2,Laenge)
SetGadgetState(5,100) ;kühn auf fertig gesetzt
EndIf
FileSeek(1,((FileL*4096)+FileR)-Auffuell)
TruncateFile(1)
CloseFile(0)
CloseFile(1)
TE=ElapsedMilliseconds()-TA
If TE
Durchsatz=FileL*4096/TE
EndIf
TextGadget(7,10,190,430,20,"Entschlüsselungs-Zeit = "+ Str(TE)+" ms",#PB_Text_Center)
TextGadget(8,10,215,430,20,"Durchsatz = "+Str(Durchsatz)+" kB/s" ,#PB_Text_Center)
ButtonGadget(9,175,240,100,20,"Ende")
Repeat
Event=WaitWindowEvent()
If Event=#PB_Event_CloseWindow
End
EndIf
Until EventGadget()=9
End
EndSelect
End
;----------------------------------------------------------------------------------------
DataSection
SBox: ;wird für En-und Decrypt benötigt
Data.b $63, $7c, $77, $7b, $f2, $6b, $6f, $c5, $30, $01, $67, $2b, $fe, $d7, $ab, $76
Data.b $ca, $82, $c9, $7d, $fa, $59, $47, $f0, $ad, $d4, $a2, $af, $9c, $a4, $72, $c0
Data.b $b7, $fd, $93, $26, $36, $3f, $f7, $cc, $34, $a5, $e5, $f1, $71, $d8, $31, $15
Data.b $04, $c7, $23, $c3, $18, $96, $05, $9a, $07, $12, $80, $e2, $eb, $27, $b2, $75
Data.b $09, $83, $2c, $1a, $1b, $6e, $5a, $a0, $52, $3b, $d6, $b3, $29, $e3, $2f, $84
Data.b $53, $d1, $00, $ed, $20, $fc, $b1, $5b, $6a, $cb, $be, $39, $4a, $4c, $58, $cf
Data.b $d0, $ef, $aa, $fb, $43, $4d, $33, $85, $45, $f9, $02, $7f, $50, $3c, $9f, $a8
Data.b $51, $a3, $40, $8f, $92, $9d, $38, $f5, $bc, $b6, $da, $21, $10, $ff, $f3, $d2
Data.b $cd, $0c, $13, $ec, $5f, $97, $44, $17, $c4, $a7, $7e, $3d, $64, $5d, $19, $73
Data.b $60, $81, $4f, $dc, $22, $2a, $90, $88, $46, $ee, $b8, $14, $de, $5e, $0b, $db
Data.b $e0, $32, $3a, $0a, $49, $06, $24, $5c, $c2, $d3, $ac, $62, $91, $95, $e4, $79
Data.b $e7, $c8, $37, $6d, $8d, $d5, $4e, $a9, $6c, $56, $f4, $ea, $65, $7a, $ae, $08
Data.b $ba, $78, $25, $2e, $1c, $a6, $b4, $c6, $e8, $dd, $74, $1f, $4b, $bd, $8b, $8a
Data.b $70, $3e, $b5, $66, $48, $03, $f6, $0e, $61, $35, $57, $b9, $86, $c1, $1d, $9e
Data.b $e1, $f8, $98, $11, $69, $d9, $8e, $94, $9b, $1e, $87, $e9, $ce, $55, $28, $df
Data.b $8c, $a1, $89, $0d, $bf, $e6, $42, $68, $41, $99, $2d, $0f, $b0, $54, $bb, $16
InvSBox: ;wird nur für Decrypt benötigt
Data.b $52, $09, $6a, $d5, $30, $36, $a5, $38, $bf, $40, $a3, $9e, $81, $f3, $d7, $fb
Data.b $7c, $e3, $39, $82, $9b, $2f, $ff, $87, $34, $8e, $43, $44, $c4, $de, $e9, $cb
Data.b $54, $7b, $94, $32, $a6, $c2, $23, $3d, $ee, $4c, $95, $0b, $42, $fa, $c3, $4e
Data.b $08, $2e, $a1, $66, $28, $d9, $24, $b2, $76, $5b, $a2, $49, $6d, $8b, $d1, $25
Data.b $72, $f8, $f6, $64, $86, $68, $98, $16, $d4, $a4, $5c, $cc, $5d, $65, $b6, $92
Data.b $6c, $70, $48, $50, $fd, $ed, $b9, $da, $5e, $15, $46, $57, $a7, $8d, $9d, $84
Data.b $90, $d8, $ab, $00, $8c, $bc, $d3, $0a, $f7, $e4, $58, $05, $b8, $b3, $45, $06
Data.b $d0, $2c, $1e, $8f, $ca, $3f, $0f, $02, $c1, $af, $bd, $03, $01, $13, $8a, $6b
Data.b $3a, $91, $11, $41, $4f, $67, $dc, $ea, $97, $f2, $cf, $ce, $f0, $b4, $e6, $73
Data.b $96, $ac, $74, $22, $e7, $ad, $35, $85, $e2, $f9, $37, $e8, $1c, $75, $df, $6e
Data.b $47, $f1, $1a, $71, $1d, $29, $c5, $89, $6f, $b7, $62, $0e, $aa, $18, $be, $1b
Data.b $fc, $56, $3e, $4b, $c6, $d2, $79, $20, $9a, $db, $c0, $fe, $78, $cd, $5a, $f4
Data.b $1f, $dd, $a8, $33, $88, $07, $c7, $31, $b1, $12, $10, $59, $27, $80, $ec, $5f
Data.b $60, $51, $7f, $a9, $19, $b5, $4a, $0d, $2d, $e5, $7a, $9f, $93, $c9, $9c, $ef
Data.b $a0, $e0, $3b, $4d, $ae, $2a, $f5, $b0, $c8, $eb, $bb, $3c, $83, $53, $99, $61
Data.b $17, $2b, $04, $7e, $ba, $77, $d6, $26, $e1, $69, $14, $63, $55, $21, $0c, $7d
XTime: ;wird nur für Decrypt benötigt
Data.b $00, $02, $04, $06, $08, $0a, $0c, $0e, $10, $12, $14, $16, $18, $1a, $1c, $1e
Data.b $20, $22, $24, $26, $28, $2a, $2c, $2e, $30, $32, $34, $36, $38, $3a, $3c, $3e
Data.b $40, $42, $44, $46, $48, $4a, $4c, $4e, $50, $52, $54, $56, $58, $5a, $5c, $5e
Data.b $60, $62, $64, $66, $68, $6a, $6c, $6e, $70, $72, $74, $76, $78, $7a, $7c, $7e
Data.b $80, $82, $84, $86, $88, $8a, $8c, $8e, $90, $92, $94, $96, $98, $9a, $9c, $9e
Data.b $a0, $a2, $a4, $a6, $a8, $aa, $ac, $ae, $b0, $b2, $b4, $b6, $b8, $ba, $bc, $be
Data.b $c0, $c2, $c4, $c6, $c8, $ca, $cc, $ce, $d0, $d2, $d4, $d6, $d8, $da, $dc, $de
Data.b $e0, $e2, $e4, $e6, $e8, $ea, $ec, $ee, $f0, $f2, $f4, $f6, $f8, $fa, $fc, $fe
Data.b $1b, $19, $1f, $1d, $13, $11, $17, $15, $0b, $09, $0f, $0d, $03, $01, $07, $05
Data.b $3b, $39, $3f, $3d, $33, $31, $37, $35, $2b, $29, $2f, $2d, $23, $21, $27, $25
Data.b $5b, $59, $5f, $5d, $53, $51, $57, $55, $4b, $49, $4f, $4d, $43, $41, $47, $45
Data.b $7b, $79, $7f, $7d, $73, $71, $77, $75, $6b, $69, $6f, $6d, $63, $61, $67, $65
Data.b $9b, $99, $9f, $9d, $93, $91, $97, $95, $8b, $89, $8f, $8d, $83, $81, $87, $85
Data.b $bb, $b9, $bf, $bd, $b3, $b1, $b7, $b5, $ab, $a9, $af, $ad, $a3, $a1, $a7, $a5
Data.b $db, $d9, $df, $dd, $d3, $d1, $d7, $d5, $cb, $c9, $cf, $cd, $c3, $c1, $c7, $c5
Data.b $fb, $f9, $ff, $fd, $f3, $f1, $f7, $f5, $eb, $e9, $ef, $ed, $e3, $e1, $e7, $e5
RCon: ;wird für En-und Decrypt benötigt
Data.l $1, $2, $4, $8, $10, $20, $40, $80, $1b, $36
EndDataSection