Dim sbox1(255)
Dim sbox2(255)
For x=0 To 255
Read y
sbox1(x)=y
sbox2(y)=x
Next
Data $63,$7c,$77,$7b,$f2,$6b,$6f,$c5,$30,$01,$67,$2b,$fe,$d7,$ab,$76
Data $ca,$82,$c9,$7d,$fa,$59,$47,$f0,$ad,$d4,$a2,$af,$9c,$a4,$72,$c0
Data $b7,$fd,$93,$26,$36,$3f,$f7,$cc,$34,$a5,$e5,$f1,$71,$d8,$31,$15
Data $04,$c7,$23,$c3,$18,$96,$05,$9a,$07,$12,$80,$e2,$eb,$27,$b2,$75
Data $09,$83,$2c,$1a,$1b,$6e,$5a,$a0,$52,$3b,$d6,$b3,$29,$e3,$2f,$84
Data $53,$d1,$00,$ed,$20,$fc,$b1,$5b,$6a,$cb,$be,$39,$4a,$4c,$58,$cf
Data $d0,$ef,$aa,$fb,$43,$4d,$33,$85,$45,$f9,$02,$7f,$50,$3c,$9f,$a8
Data $51,$a3,$40,$8f,$92,$9d,$38,$f5,$bc,$b6,$da,$21,$10,$ff,$f3,$d2
Data $cd,$0c,$13,$ec,$5f,$97,$44,$17,$c4,$a7,$7e,$3d,$64,$5d,$19,$73
Data $60,$81,$4f,$dc,$22,$2a,$90,$88,$46,$ee,$b8,$14,$de,$5e,$0b,$db
Data $e0,$32,$3a,$0a,$49,$06,$24,$5c,$c2,$d3,$ac,$62,$91,$95,$e4,$79
Data $e7,$c8,$37,$6d,$8d,$d5,$4e,$a9,$6c,$56,$f4,$ea,$65,$7a,$ae,$08
Data $ba,$78,$25,$2e,$1c,$a6,$b4,$c6,$e8,$dd,$74,$1f,$4b,$bd,$8b,$8a
Data $70,$3e,$b5,$66,$48,$03,$f6,$0e,$61,$35,$57,$b9,$86,$c1,$1d,$9e
Data $e1,$f8,$98,$11,$69,$d9,$8e,$94,$9b,$1e,$87,$e9,$ce,$55,$28,$df
Data $8c,$a1,$89,$0d,$bf,$e6,$42,$68,$41,$99,$2d,$0f,$b0,$54,$bb,$16
Function verschluesseln(block,schluessel,schluessel_loeschen=True)
If BankSize(block)<>16 Then Return 0
modus=vorarbeit(schluessel)
If modus=-1 Then
If schluessel_loeschen Then FreeBank schluessel
Return 0
EndIf
For x=0 To 15
byte_block=PeekByte(block,x)
byte_schluessel=PeekByte(schluessel,x)
byte_block=byte_block Xor byte_schluessel
PokeByte(block,x,byte_block)
Next
For runde=1 To 10+modus*2
For x=0 To 15
byte=PeekByte(block,x)
byte=sbox1(byte)
PokeByte(block,x,byte)
Next
For zeile=1 To 3
For verschiebung=1 To zeile
rotier=PeekByte(block,zeile)
For x=0 To 2
PokeByte(block,x*4+zeile,PeekByte(block,x*4+4+zeile))
Next
PokeByte(block,12+zeile,rotier)
Next
Next
If runde<>10+modus*2 Then
For spalte=0 To 3
a0=PeekByte(block,spalte*4  )
a1=PeekByte(block,spalte*4+1)
a2=PeekByte(block,spalte*4+2)
a3=PeekByte(block,spalte*4+3)
b0=mal2(a0) Xor mal3(a1) Xor      a2  Xor      a3
b1=     a0  Xor mal2(a1) Xor mal3(a2) Xor      a3
b2=     a0  Xor      a1  Xor mal2(a2) Xor mal3(a3)
b3=mal3(a0) Xor      a1  Xor      a2  Xor mal2(a3)
PokeByte(block,spalte*4  ,b0)
PokeByte(block,spalte*4+1,b1)
PokeByte(block,spalte*4+2,b2)
PokeByte(block,spalte*4+3,b3)
Next
EndIf
For x=0 To 15
byte_block=PeekByte(block,x)
byte_schluessel=PeekByte(schluessel,x+runde*16)
byte_block=byte_block Xor byte_schluessel
PokeByte(block,x,byte_block)
Next
Next
If schluessel_loeschen Then
FreeBank(schluessel)
Else
ResizeBank(schluessel,16+modus*8)
EndIf
Return 1
End Function
Function entschluesseln(block,schluessel,schluessel_loeschen=True)
If BankSize(block)<>16 Then Return 0
modus=vorarbeit(schluessel)
If modus=-1 Then
If schluessel_loeschen Then FreeBank schluessel
Return 0
EndIf
For runde=10+modus*2 To 1 Step -1
For x=0 To 15
byte_block=PeekByte(block,x)
byte_schluessel=PeekByte(schluessel,x+runde*16)
byte_block=byte_block Xor byte_schluessel
PokeByte(block,x,byte_block)
Next
If runde<>10+modus*2 Then
For spalte=0 To 3
a0=PeekByte(block,spalte*4  )
a1=PeekByte(block,spalte*4+1)
a2=PeekByte(block,spalte*4+2)
a3=PeekByte(block,spalte*4+3)
b0=mal14(a0) Xor mal11(a1) Xor mal13(a2) Xor  mal9(a3)
b1= mal9(a0) Xor mal14(a1) Xor mal11(a2) Xor mal13(a3)
b2=mal13(a0) Xor  mal9(a1) Xor mal14(a2) Xor mal11(a3)
b3=mal11(a0) Xor mal13(a1) Xor  mal9(a2) Xor mal14(a3)
PokeByte(block,spalte*4  ,b0)
PokeByte(block,spalte*4+1,b1)
PokeByte(block,spalte*4+2,b2)
PokeByte(block,spalte*4+3,b3)
Next
EndIf
For zeile=1 To 3
For verschiebung=1 To zeile
rotier=PeekByte(block,12+zeile)
For x=2 To 0 Step -1
PokeByte(block,x*4+4+zeile,PeekByte(block,x*4+zeile))
Next
PokeByte(block,zeile,rotier)
Next
Next
For x=0 To 15
byte=PeekByte(block,x)
byte=sbox2(byte)
PokeByte(block,x,byte)
Next
Next
For x=0 To 15
byte_block=PeekByte(block,x)
byte_schluessel=PeekByte(schluessel,x)
byte_block=byte_block Xor byte_schluessel
PokeByte(block,x,byte_block)
Next
If schluessel_loeschen Then
FreeBank(schluessel)
Else
ResizeBank(schluessel,16+modus*8)
EndIf
Return 1
End Function
Function vorarbeit(schluessel)
Select BankSize(schluessel)
Case 16
modus=0
Case 24
modus=1
Case 32
modus=2
Default
Return -1
End Select
ResizeBank schluessel,176+modus*32
rcon=$8d
For erstesbyte=16+modus*8 To 172+modus*32 Step 4
For x=0 To 3
PokeByte(schluessel,erstesbyte+x,PeekByte(schluessel,erstesbyte+x-4))
Next
If erstesbyte Mod (16+modus*8) = 0 Then
rotier=PeekByte(schluessel,erstesbyte)
For x=0 To 2
PokeByte(schluessel,erstesbyte+x,PeekByte(schluessel,erstesbyte+x+1))
Next
PokeByte(schluessel,erstesbyte+3,rotier)
For x=0 To 3
byte=PeekByte(schluessel,erstesbyte+x)
byte=sbox1(byte)
PokeByte(schluessel,erstesbyte+x,byte)
Next
EndIf
If modus=2 And erstesbyte Mod 32=16 Then
For x=0 To 3
byte=PeekByte(schluessel,erstesbyte+x)
byte=sbox1(byte)
PokeByte(schluessel,erstesbyte+x,byte)
Next
EndIf
For x=0 To 3
byte=PeekByte(schluessel,erstesbyte+x)
vorigesbyte=PeekByte(schluessel,erstesbyte+x-16-8*modus)
byte=byte Xor vorigesbyte
PokeByte(schluessel,erstesbyte+x,byte)
Next
If erstesbyte Mod (16+modus*8) = 0 Then
byte=PeekByte(schluessel,erstesbyte)
rcon=mal2(rcon)
byte=byte Xor rcon
PokeByte(schluessel,erstesbyte,byte)
EndIf
Next
Return modus
End Function
Function mal2(a)
a2=a*2
If a2>255 Then a2=a2 Xor $11b
Return a2
End Function
Function mal3(a)
a2=mal2(a)
a3=a2 Xor a
Return a3
End Function
Function mal9(a)
a2=mal2(a)
a2=mal2(a2)
a2=mal2(a2)
a2=a2 Xor a
Return a2
End Function
Function mal11(a)
a2=mal2(a)
a2=mal2(a2)
a2=a2 Xor a
a2=mal2(a2)
a2=a2 Xor a
Return a2
End Function
Function mal13(a)
a2=mal2(a)
a2=a2 Xor a
a2=mal2(a2)
a2=mal2(a2)
a2=a2 Xor a
Return a2
End Function
Function mal14(a)
a2=mal2(a)
a2=a2 Xor a
a2=mal2(a2)
a2=a2 Xor a
a2=mal2(a2)
Return a2
End Function