Seite 1 von 1

AES256 CBC Mode Decoder und Encoder - Update 27.02.2014

Verfasst: 24.02.2014 21:32
von walbus
:)

Re: AES 256 CBC Mode Decoder und Encoder - Voll funktionsfäh

Verfasst: 24.02.2014 22:09
von NicTheQuick
Im Grunde kannst du das etwas optimieren. Zum Beispiel brauchst du *iv2 und ii gar nicht. Außerdem kann man die PeekQ durch Pointer ersetzen.

Code: Alles auswählen

Procedure.q AES256CBC_Encoder(*inBuffer.Quad, *outBuffer.Quad, bytes.q, *key, *i_v)
	;(AES256_CBC mode encoder , by Werner Albus , www.nachtoptik.de :-)
	Protected result_1.q
	
	If (bytes % 16)
		ProcedureReturn 0
	EndIf
	
	Protected *iv.Quad = AllocateMemory(16)
	
	CopyMemory(*i_v, *iv, 16)
	Protected rounds.q = (bytes >> 4) - 1
	Protected i.q, result.i
	
	For i = 0 To rounds
		result = AESEncoder(*inBuffer, *outBuffer, 16, *key, 256, *iv)
		If (Not result)
			FreeMemory(*iv)
			ProcedureReturn 0
		EndIf
		result_1 + result
		*iv\q ! *outBuffer\q
		*outBuffer + 8 : *iv + 8
		*iv\q ! *outBuffer\q
		
		*outBuffer + 8 : *iv - 8
		*inBuffer + 16
	Next i
	
	FreeMemory(*iv)
	ProcedureReturn result_1
EndProcedure
Allerdings hab ich nicht verstanden, warum du das Ergebnis von 'AESEncoder()' gegen 16 prüfst. Laut Hilfe war das Encoden erfolgreich, wenn der Rückgabewert ungleich 0 ist und nicht, wenn er gleich 16 war. Ich würde jedenfalls immer so programmieren wie es im Handbuch steht. Wenn das mit der 16 jetzt noch funktioniert, dann kann das im nächsten PB-Update schon wieder ganz anders sein.

Re: AES 256 CBC Mode Decoder und Encoder - Voll funktionsfäh

Verfasst: 24.02.2014 22:13
von walbus
:)

Re: AES 256 CBC Mode Decoder und Encoder - Voll funktionsfäh

Verfasst: 24.02.2014 23:22
von NicTheQuick
Dann vielleicht einfach so. Übersichtlich und kompakt

Code: Alles auswählen

Structure AES_IV
	q.q[0]
EndStructure

Macro AES256CBC(Type, dir)
Procedure.i AES256CBC_#Type(*inBuffer.AES_IV, *outBuffer.AES_IV, bytes.q, *key, *i_v)
	;(AES256_CBC mode encoder , by Werner Albus (www.nachtoptik.de) and NicTheQuick (www.freakscorner.de)
	
	If (bytes % 16)
		ProcedureReturn 0
	EndIf
	
	Protected *iv.AES_IV = AllocateMemory(16)
	
	CopyMemory(*i_v, *iv, 16)
	Protected rounds.q = (bytes >> 4)
	Protected i.q, result.i
	
	While i < rounds
		result = AES#Type(*inBuffer, *outBuffer, 16, *key, 256, *iv)
		If (Not result)
			FreeMemory(*iv)
			ProcedureReturn #False
		EndIf
		
		*iv\q[0] ! *dir#Buffer\q[0]
		*iv\q[1] ! *dir#Buffer\q[1]
		
		*outBuffer + 16
		*inBuffer + 16
		i + 1
	Wend
	
	FreeMemory(*iv)
	ProcedureReturn #True
EndProcedure
EndMacro

AES256CBC(Encoder, out)
AES256CBC(Decoder, in)
///Edit: For-Schleife-Bug mit Quads gefixt

Re: AES 256 CBC Mode Decoder und Encoder - Voll funktionsfäh

Verfasst: 24.02.2014 23:56
von walbus
:)

Re: AES 256 CBC Mode Decoder und Encoder - Voll funktionsfäh

Verfasst: 25.02.2014 00:09
von NicTheQuick
Achja, die 32-Bit-ler haben damit ja Probleme. Hab's gefixt.