Seite 2 von 4

Verfasst: 09.12.2007 16:16
von m0
heeejjj vielen vielen dank helle!!!
das war superweltklasse!!!! ich bin begeistert jetzt weis ich auch gleich alle nötigen ASM-befehlte um die routine weitestgehend in ASM zu schreiben perfekt umso schneller sollte sie werden!!!


Vielen vielen Dank werd mich da heute abend/nacht gleichma dahinterklemmen geilo das freut mich jetzt echt!!!

DANKE DANKE DANKE!!!!

m0

Verfasst: 09.12.2007 17:53
von m0
Wow ich hab mir deinen ASM-code ma angeschaut.... also ich dacht ich komm dahinter, weil ich microprozessoren mit ASM programmiere, aber irgendwie is das doch etwas komplexer.... ich hab da noch n paar fragen:

Also anfangs ist mir noch alles klar du liest die daten ein speicherst dir nen pointer zum memory, okay. aber dann was z.b. steht in eax zum zeitpunkt wenn du eax mit eax xorst.... da wurde doch noch nichts rein geschrieben, oder?? das selbe dann mit ebx, ecx, edx und dl sowie al, oder sind das spezielle register? wäre echt klasse wenn du mir das noch sagen könntest!!


danke dir!!

Verfasst: 09.12.2007 20:47
von Helle
Auf Wunsch eines einzelnen Herrn Code neu mit Kommentierung (s.o.).
Viel Spass :mrgreen: !

Gruß
Helle

Verfasst: 09.12.2007 21:46
von m0
Hej du bist echt genial vielen dank für die gute doku, aber ich glaub das ganze wird doch net so easy wie ichs mir vorgestellt hab, hab garnet gedacht dass die byteschubserei aufm PC ja garnet so easy geht wie im µC... sone scheiße... und ich werd immernoch nicht schlau draus wieso da aufeinmal das einzelne byte in DL wenn ich bx dach edx kopiere... das ist alles etwas seltsam glaube ich.. außerdem komm ich ja schon ins schleudern, wenn ich n byte in ne speicherzelle ablegen will. hab nämlich keinen plan welche man da im PC nehmen darf, bzw welche reserviert sind und so scherze... das is alles net so der hit... ich glaub dafür bin ich einfach zu blöd....sehr schade... aber ich versuch mich mal weiter an der sache vielleicht finde ich noch eine andere Lösung....


vielen dank soweit!!

Verfasst: 12.12.2007 15:25
von Helle
Oh je, die Prozessor-Register... Habe diesbezüglich soeben mein ASM-Tut für PB etwas erweitert. Vielleicht hilfts...
http://www.purebasic.fr/german/viewtopic.php?t=13598
oder direkt
http://www.mdcc-fun.de/k.helbing/ASM-Tut/Tutorial.zip

Gruß
Helle

Verfasst: 12.12.2007 18:38
von onny
hardfalcon hat geschrieben:Ansonsten frag mal hier nach:
http://www.purebasic.fr/english/viewtopic.php?t=12086
AESLIB.ZIP ist nicht mehr verfügbar :(
Könnte ich mit dem LibaryMaker daraus eine kompatieble Lib für PB machen?

Verfasst: 12.12.2007 19:39
von onny
Hab jetzt eine gute Userlib gefunden: http://www.purebasic.fr/english/viewtop ... hlight=aes

Kann mir jemand BITTE BITTE ein Beispiel zu Rijndael_makeKey() geben?

Verfasst: 13.12.2007 18:25
von onny
was soll ich nur machen? ich brauch unbedingt die AES-verschlüsselung :cry: :cry: :bluescreen:

Verfasst: 13.12.2007 23:07
von Helle
Da ich hier nun schonmal angefangen habe hier ein kompletter Encrypt-Vorgang für 16 Bytes. Vielleicht kann´s jemand als Grundlage oder Anregung gebrauchen. Die Verwendung von ASM scheint mir hier unerlässlich zu sein (Speed), also bitte nicht meckern!

Code: Alles auswählen

;- AES-Rijndael-Encryption-Test, Textblock-und Keyword-Länge jeweils 128 Bit 
;- "Helle" Klaus Helbing, 13.12.2007, PB4.10 
;- Ohne Gewähr! Lässt sich bestimmt noch optimieren

Global Array1.l
Global Array2.l
  
Array1=AllocateMemory(16)              ;für (Zwischen-)Ergebnisse, so auch wegen einfache 
Array2=AllocateMemory(16)              ; Zugriffs-Möglichkeit für PB (Anzeige)

;- RoundKeys ermitteln
;- RoundKey1, Ergebnis steht in RoundKey
!lea edi,[CipherKey]
!mov eax,[edi+12]
!ror eax,8

!lea edi,[RoundKey]
!lea esi,[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

!lea esi,[RoundKey]
!lea edi,[CipherKey]
!lea edx,[RCon]
!mov eax,[edi]
!xor [esi],eax
!mov ebx,[edx]
!xor [esi],ebx               ;1.DWord von RoundKey1

!mov edx,[esi]
!mov eax,[edi+4]
!xor eax,edx
!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 [Schleife1],9
!RoundKeys:
!add [RConZ],4
!ror eax,8
!lea esi,[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
!lea edi,[RoundKey]          
!add edi,[Round]             ;1.DWord vom "VorKey"
!mov eax,[edi]
!xor eax,edx
!lea esi,[RCon]
!add esi,[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     Fehler beim Uru in RoundKey2 (Schreib-Fehler)!
!add edi,4
!xor eax,[edi-16]
!mov [edi],eax               ;4.DWord
!add [Round],16 
!dec [Schleife1]
!jnz RoundKeys
;- Ende RoundKey2 - RoundKey10

;- 1.Schritt State XOR Cipher Key -----
;- Ergebnis steht in Array1
!mov edi,[v_Array1]
!lea esi,[State]
!mov ecx,4
!@@:
!mov eax,[esi]
!xor eax,[esi+16]
!mov [edi],eax
!add edi,4
!add esi,4
!dec ecx
!jnz @b
;--------------------------------------

!mov [Round],0               ;für Schleife unten
!Schleife:

;- 2.Schritt Werte aus S-Box holen ----
;- Ergebnis steht in Array1
!mov edi,[v_Array1]
!lea esi,[SBox]
!xor ebx,ebx
!mov edx,4
!S0:
!mov ecx,4
!@@:
!mov bl,[edi]
!mov al,[esi+ebx]
!mov [edi],al
!inc edi
!dec ecx
!jnz @b
!dec edx
!jnz S0
;--------------------------------------

;- 3.Schritt Rotationen ---------------
;- Ergebnis steht in Array1
!mov esi,[v_Array1]
!mov ecx,8
!Rotat:
!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 Rotat
;--------------------------------------

;- 4.Schritt Mix-Columns --------------
;- Ergebnis steht in Array2
!cmp [Round],144
!jne @f
!mov edi,[v_Array1]
!jmp NoMix                   ;letzte Runde nicht
!@@:
!mov esi,[v_Array1]
!mov edi,[v_Array2]
!mov [Schleife2],4
!Mix2:
!mov ebx,[esi]
!mov [Schleife1],4
!Mix1:
!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 [edi],al
!inc edi
!ror ebx,16
!dec [Schleife1]
!jnz Mix1 

!add esi,4
!dec [Schleife2]
!jnz Mix2
;--------------------------------------

;- 5.Schritt AddRoundKey --------------
;- Ergebnis steht in Array1 für Schleife
!mov edi,[v_Array2]
!NoMix:
!mov ebx,[v_Array1]
!lea esi,[RoundKey]
!add esi,[Round]
!mov ecx,4
!@@:
!mov eax,[esi]
!mov edx,[edi]
!xor eax,edx
!mov [ebx],eax
!add ebx,4
!add edi,4
!add esi,4
!dec ecx
!jnz @b

!add [Round],16              ;Zeiger in RoundKey
!cmp [Round],160
!jne Schleife
;--------------------------------------

;- Anzeige des Ergebnisses
For k=0 To 15
  X.c=PeekB(Array1+k)
  X$=Hex(X)
  Erg$+RSet(X$,2,"0")
Next

MessageRequester("AES-Rijndael-Encryption-Test", "Die verschlüsselten 16 Bytes lauten : "+Erg$)

End 

;--------
!section '.data' Data readable writeable
!State:                      ;16 Bytes des zu verschlüsselnden Textes
!DB 32h, 43h, 0F6h, 0A8h, 88h, 5Ah, 30h, 8Dh, 31h, 31h, 98h, 0A2h, 0E0h, 37h, 07h, 34h
!CipherKey:                  ;das Passwort (16 Bytes) 
!DB 2Bh, 7Eh, 15h, 16h, 28h, 0AEh, 0D2h, 0A6h, 0ABh, 0F7h, 15h, 88h, 09h, 0CFh, 4Fh, 3Ch
!SBox:
!DB 63h, 7ch, 77h, 7bh, 0f2h, 6bh, 6fh, 0c5h, 30h, 01h, 67h, 2bh, 0feh, 0d7h, 0abh, 76h
!DB 0cah, 82h, 0c9h, 7dh, 0fah, 59h, 47h, 0f0h, 0adh, 0d4h, 0a2h, 0afh, 9ch, 0a4h, 72h, 0c0h
!DB 0b7h, 0fdh, 93h, 26h, 36h, 3fh, 0f7h, 0cch, 34h, 0a5h, 0e5h, 0f1h, 71h, 0d8h, 31h, 15h
!DB 04h, 0c7h, 23h, 0c3h, 18h, 96h, 05h, 9ah, 07h, 12h, 80h, 0e2h, 0ebh, 27h, 0b2h, 75h
!DB 09h, 83h, 2ch, 1ah, 1bh, 6eh, 5ah, 0a0h, 52h, 3bh, 0d6h, 0b3h, 29h, 0e3h, 2fh, 84h
!DB 53h, 0d1h, 00h, 0edh, 20h, 0fch, 0b1h, 5bh, 6ah, 0cbh, 0beh, 39h, 4ah, 4ch, 58h, 0cfh
!DB 0d0h, 0efh, 0aah, 0fbh, 43h, 4dh, 33h, 85h, 45h, 0f9h, 02h, 7fh, 50h, 3ch, 9fh, 0a8h
!DB 51h, 0a3h, 40h, 8fh, 92h, 9dh, 38h, 0f5h, 0bch, 0b6h, 0dah, 21h, 10h, 0ffh, 0f3h, 0d2h
!DB 0cdh, 0ch, 13h, 0ech, 5fh, 97h, 44h, 17h, 0c4h, 0a7h, 7eh, 3dh, 64h, 5dh, 19h, 73h
!DB 60h, 81h, 4fh, 0dch, 22h, 2ah, 90h, 88h, 46h, 0eeh, 0b8h, 14h, 0deh, 5eh, 0bh, 0dbh
!DB 0e0h, 32h, 3ah, 0ah, 49h, 06h, 24h, 5ch, 0c2h, 0d3h, 0ach, 62h, 91h, 95h, 0e4h, 79h
!DB 0e7h, 0c8h, 37h, 6dh, 8dh, 0d5h, 4eh, 0a9h, 6ch, 56h, 0f4h, 0eah, 65h, 7ah, 0aeh, 08h
!DB 0bah, 78h, 25h, 2eh, 1ch, 0a6h, 0b4h, 0c6h, 0e8h, 0ddh, 74h, 1fh, 4bh, 0bdh, 8bh, 8ah
!DB 70h, 3eh, 0b5h, 66h, 48h, 03h, 0f6h, 0eh, 61h, 35h, 57h, 0b9h, 86h, 0c1h, 1dh, 9eh
!DB 0e1h, 0f8h, 98h, 11h, 69h, 0d9h, 8eh, 94h, 9bh, 1eh, 87h, 0e9h, 0ceh, 55h, 28h, 0dfh
!DB 8ch, 0a1h, 89h, 0dh, 0bfh, 0e6h, 42h, 68h, 41h, 99h, 2dh, 0fh, 0b0h, 54h, 0bbh, 16h    
!RCon:
!DD 1h, 2h, 4h, 8h, 10h, 20h, 40h, 80h, 1bh, 36h
!RoundKey  RB 160
!Round DD 0                  ;spielt den Rundenzähler
!RConZ DD 0
!Schleife1 DD ?
!Schleife2 DD ?
Gruß
Helle

Verfasst: 14.12.2007 10:05
von m0
Hey, vielen Dank für deinen Code Helle, ich hab nämlich verzweifelt, hab versucht ohne asm auszukommen, aber dann hat die verschlüsselung geradema ne datenrate von 4MB/s des is sowas voln lahm, ich werde mich nexte woche gleichma ransetzen deine Verschlüsselung auf 32byte Key und blockgröße umzubauen, ich denke das sollte ich schaffen mit deinem echt guten ASM-tut du bist echt ne wahnsinns hilfe, vielen vielen Dank!
Nuch eine riesige Bitte hätte ich noch.... meinst du du könntest mir eine Reverse Mix Columns schreiben, da wird ja mit 14 multipliziert und so..... aber natürlich nur wenn du zeit/lust hast, sons muss ich halt rumprobieren bis das richtige rauskommt ^^

Den Rest der Entschlüsselung müsste ich (hoffentlich) hinkriegen, der bleibt ja weitgehend gleich...

Vielen Dank!!!!!
m0