AES Verschlüsselung

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

onnie

Betreff: AES Verschlüsselung

BeitragDi, Jan 01, 2013 16:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mal eine Funktion geschrieben, die Daten mit AES verschlüsselt. Daten und Schlüssel werden als Bank gespeichert.
Aber irgendwo ist noch ein Fehler. Kann mir jemand helfen suchen?
Code: [AUSKLAPPEN]
;S-Box einlesen
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)
   ;Eingabedaten prüfen
   If BankSize(block)<>16 Then Return 0
   Select BankSize(schluessel)
      Case 16
         modus=0 ; 128 bit Schlüssel
      Case 24
         modus=1 ; 192 bit Schlüssel
      Case 32
         modus=2 ; 256 bit Schlüssel
      Default
         Return 0
   End Select
   
   
   ;Schlüsselexpansion
   ResizeBank schluessel,176+modus*32
   
   rcon=1
   
   For erstesbyte=16+modus*8 To 172+modus*32 Step 4
      ; Die Daten der vorigen Spalte werden in die neue kopiert
      For x=0 To 3
         PokeByte(schluessel,erstesbyte+x,PeekByte(schluessel,erstesbyte+x-4))
      Next
      If erstesbyte Mod (16+modus*8) = 0 Then ; Je nach Schlüssellänge nur alle 4,6 oder 8 Spalten
         ;rotieren
         rotier=PeekByte(schluessel,erstesbyte)
         For x=0 To 2
            PokeByte(schluessel,erstesbyte+x,PeekByte(schluessel,erstesbyte+x+1))
         Next
         PokeByte(schluessel,erstesbyte+3,rotier)
         ;S-Box
         For x=0 To 3
            byte=PeekByte(schluessel,erstesbyte+x)
            byte=sbox1(byte)
            PokeByte(schluessel,erstesbyte+x,byte)
         Next
      EndIf
      ;XOR mit der Spalte, die 4,6 oder 8 zurückliegt
      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
   
   
   ;Vorrunde
   ;Add Round Key
   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
   
   
   ;Verschlüsselungsrunden (10, 12 oder 14)
   For runde=1 To 10+modus*2
      ;Sub Bytes
      For x=0 To 15
         byte=PeekByte(block,x)
         byte=sbox1(byte)
         PokeByte(block,x,byte)
      Next
      
      ;Shift Rows
      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
      
      ;Mix Columns (nicht in der Schlussrunde)
      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
      
      ;Add Round Key
      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(schluesel,16+modus*8)
   EndIf
End Function

;Hilfsfunktionen für Mix Columns
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

Xeres

Moderator

BeitragDi, Jan 01, 2013 16:28
Antworten mit Zitat
Benutzer-Profile anzeigen
~VERSCHOBEN~


Na denn viel Spaß beim suchen...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

DAK

BeitragDi, Jan 01, 2013 21:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Was macht denn der Fehler? Was macht er denn falsch? Du bist Programmierer, nicht ein ahnungsloser User. Du kannst uns ruhig auch etwas mehr Infos geben.
Gewinner der 6. und der 68. BlitzCodeCompo
 

onnie

BeitragMi, Jan 02, 2013 11:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Was macht denn der Fehler? Was macht er denn falsch?

Das Programm läuft fehlerfrei ab, aber es liefert falsche Ergebnisse.

Jamagin

BeitragDo, Jan 03, 2013 3:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ohne wirkliche Angaben kann man nix machen wie nur vermuten!
Vielleicht liegt der Fehler ja hier drin:

Code: [AUSKLAPPEN]

;Schlüsselexpansion
   ResizeBank schluessel,176+modus*32     >>> 192+(modus*32)
   
   rcon=1
   
   For erstesbyte=16+modus*8 To 172+modus*32 Step 4   >>> 192+(modus*32)


Liege ich falsch, solltest du schon mehr Angaben machen wie auch schon die anderen das beängelt haben!

lg. Jamagin
Bevor du etwas neues beginnst, erledige das alte
 

onnie

BeitragDo, Jan 03, 2013 14:19
Antworten mit Zitat
Benutzer-Profile anzeigen
@Jamagin
Ok, erstmal muss ich ein paar Sachen erklären.
modus ist abhängig von der Schlüssellänge.
128 bit: modus=0
192 bit: modus=1
256 bit: modus=2

soweit war es vermutlich noch klar.
Nun verwende ich in meinem Programm immer wenn bestimmte Zahlen von der Schlüssellänge abhängen die Formel a+modus*b mit entsprechenden Werten von a und b.

Ein Beispiel, damit es verständlich wird:
Print "Der Schlüssel besteht aus "+Str$(128+modus*64)+" bit."

Jetzt muss der Schlüssel expandiert werden und zwar so, dass für jede Verschlüsselungsrunde (inclusive der Vorrunde und Schlussrunde) ein 16-byte-Schlüssel vorliegt.
Erstmal zur Rundenanzahl:
128 bit: 11 Runden
192 bit: 13 Runden
256 bit: 15 Runden

und für jede Runde 16 byte:

128 bit: 11*16=176 byte
192 bit: 13*16=208 byte
256 bit: 15*16=240 byte

deshalb die Formel 176+modus*32

Und jetzt noch ein Beispiel:
Am Besten ganz unten unter den Code aus dem ersten Beitrag kopieren
Code: [AUSKLAPPEN]
schluessel=CreateBank(16)
block=CreateBank(16)

; beide Speicherbänke mit Nullen füllen:
For k=0 To 15
   PokeByte(schluessel,k,0)
   PokeByte(block,k,0)
Next

verschluesseln(block,schluessel)
For k=0 To 15
   byte=PeekByte(block,k)
   tplus$=Hex$(byte)
   tplus$=Right$(tplus$,2)
   tplus$=Lower$(tplus$)
   t$=t$+tplus$
Next
Graphics 800,600,0,2
Text 0,0,t$
Flip
WaitKey()
End

Es wird ein Datenblock und ein Schlüssel mit jeweils 16 byte erstellt.
Beide werden mit Nullen gefüllt.
Und schließlich wird der Block mit dem Schlüssel verschlüsselt.

Ergebnis: 00a33e9248cbed97ce210a27b23f029c


Vergleich mit http://testprotect.com/appendix/AEScalc

AES key: 00000000000000000000000000000000
Input Data: 00000000000000000000000000000000
Encrypt it: 66e94bd4ef8a2c3b884cfa59ca342b2e

Die Ergebnisse sind offensichtlich verschiden.
Deshalb stimmt in meinem Programm etwas nicht.

lg Onnie

BladeRunner

Moderator

BeitragDo, Jan 03, 2013 14:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde das Programm mal auf schrittweisen Ablauf stellen und mir alle Zwischenergebnisse ausgeben lassen und dann schauen wo Unterschiede zu den erwarteten Ergebnissen bestehen.
Dabei wäre es natürlich sehr hilfreich wenn Du eine entsprechende Routine zB in C++ zur Verfügung hast die du parallel arbeiten lassen kannst.
Damit kannst Du den Fehler schonmal deutlich eingrenzen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

onnie

BeitragDo, Jan 03, 2013 14:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Dabei wäre es natürlich sehr hilfreich wenn Du eine entsprechende Routine zB in C++ zur Verfügung hast die du parallel arbeiten lassen kannst.

Das würde ich auch gerne machen, aber genau das ist das Problem. Ich hab keine funktionierende Routine, die Zwischenergebnisse ausgibt.
Findet man sowas auch im Internet? Ich wurde bisher nicht fündig.

lg Onnie

BladeRunner

Moderator

BeitragDo, Jan 03, 2013 14:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Da zumindest laut Wikipedia der Algo ja OS ist sollte man sich eine Variante finden lassen, um genau zu sein ist im Wikipedialink einiges an links auf quelloffene Bibliotheken vorhanden die nur um entsprechende Ausgaben erweitert werden müssten.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Jamagin

BeitragDo, Jan 03, 2013 15:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Aha! Bin zwar kein Genie aber es ist interessant! Vielleicht liegt ja der Fehler in dieser Zeile!

Code: [AUSKLAPPEN]


If a2>255 Then a2=a2 Xor $11b




da kommt immer ein Wert von 239 raus sobald a2 > 255 ist


lg. Jamagin
Bevor du etwas neues beginnst, erledige das alte
 

onnie

BeitragDo, Jan 03, 2013 15:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Jamagin hat Folgendes geschrieben:
da kommt immer ein Wert von 239 raus sobald a2 > 255 ist

komisch, bei mir kommt 239 nur dann raus, wenn a2 vorher 500 war.
Was hast du denn als Eingangswerte?

lg

Jamagin

BeitragDo, Jan 03, 2013 16:07
Antworten mit Zitat
Benutzer-Profile anzeigen
ups, meinte ja wenn a2 = 500!

ich habe an deinem code nix verändert! woher hast du die DATA Hex-Werte? Könnte ja da der Fehler drinnen sein? Wie auch immer, es ist mit Sicherheit kein einfaches Unterfangen!

lg. Jamagin
Bevor du etwas neues beginnst, erledige das alte
 

onnie

BeitragDo, Jan 03, 2013 16:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Jamagin hat Folgendes geschrieben:
woher hast du die DATA Hex-Werte?

z.B. hier: http://en.wikipedia.org/wiki/Rijndael_S-box
musst ein Stück runterscrollen

Jamagin hat Folgendes geschrieben:
Könnte ja da der Fehler drinnen sein?

Glaub ich nicht. Aber du kannst es ja mal vergleichen. Viel Spaß Wink

lg
 

onnie

BeitragFr, Jan 04, 2013 19:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab den Fehler gefunden. Es lag an der Zeile:
Code: [AUSKLAPPEN]
rcon=1

die muss heißen:
Code: [AUSKLAPPEN]
rcon=$8d

dann funktionierts. Ich schreib jetzt noch die Entschlüsselfunktion und dann stell ich das vollständige Projekt online.

Edit:
Ok, nutzt bitte die neue Version. Ich hab noch kleinere Fehler behoben und eine Entschlüsselfunktion geschrieben.
Ich habs als Download online gestellt, weil es ziemlich groß ist.
Download AES.bb

und dann noch ein Beispiel zur Verwendung:
Code: [AUSKLAPPEN]
Include "AES.bb" ; Muss am Anfang stehen

Graphics 800,600,0,2
SetBuffer BackBuffer()

block=hextobank("0123456789abcdef0123456789abcdef")
schluessel=hextobank("1a1b1c1d1e1f2a2b2c2d2e2f3a3b3c3d")

If Not verschluesseln(block,schluessel,False) Then RuntimeError "Fehlerhafte Eingangsdaten"+Chr$(13)+"Der Block muss 32 Hexziffern haben, der Schlüssel 32, 48 oder 64"
; Der 3. Parameter False gibt an, dass der Schlüssel stehen bleibt.
; Der Rückgabewert ist normalerweise 1. Sind jedoch die Eingangsdaten nicht korrekt, wird 0 zurück gegeben.

; Die verschlüsselten Daten stehen im 'block', also in der Bank, mit der der Klartext übergeben wurde.

Text 0,0,hexofbank$(block)

entschluesseln(block,schluessel)
; Wird der dritte Parameter weg gelassen oder auf True gesetzt, wird der Schlüssel gelöscht.

Text 0,30,hexofbank$(block)
Flip
WaitKey()

PokeByte schluessel,0,33 ; führt zu einem Fehler, da die Bank 'schluessel' nicht mehr existiert.

End



Function hextobank(hexwert$)
   lang=Len(hexwert$)
   If lang Mod 2 <> 0 Then Return 0
   bank=CreateBank(lang/2)
   For k=0 To lang/2-1
      z1$=Mid$(hexwert$,k*2+1,1)
      z2$=Mid$(hexwert$,k*2+2,1)
      z3=zahlofhex(z1$)
      z4=zahlofhex(z2$)
      If z3=-1 Or z4=-1 Then
         FreeBank bank
         Return 0
      EndIf
      z5=z3*16+z4
      PokeByte(bank,k,z5)
   Next
   Return bank
End Function
Function zahlofhex(hexziffer$)
   hexzahl=Asc(hexziffer$)
   If hexzahl>=48 And hexzahl<=57 Then Return hexzahl-48
   If hexzahl>=65 And hexzahl<=70 Then Return hexzahl-55
   If hexzahl>=97 And hexzahl<=102 Then Return hexzahl-87
   Return -1
End Function
Function hexofbank$(bank)
   For k=0 To BankSize(bank)-1
      byte=PeekByte(block,k)
      tplus$=Hex$(byte)
      tplus$=Right$(tplus$,2)
      tplus$=Lower$(tplus$)
      t$=t$+tplus$
   Next
   Return t$
End Function

Da sind noch die Funktionen hextobank und hexofbank drin.
Die Include Zeile muss an einem Ort stehen, wo das Programm am Anfang durchläuft. Am Besten ganz an den Anfang des Programms.

Fehler bitte zurück melden, ich kümmer mich dann drum.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group