AES Verschlüsselung
Übersicht

onnieBetreff: AES Verschlüsselung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
~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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Zitat: Was macht denn der Fehler? Was macht er denn falsch?
Das Programm läuft fehlerfrei ab, aber es liefert falsche Ergebnisse. |
||
![]() |
Jamagin |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@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 |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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ß ![]() lg |
||
onnie |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group