Seite 1 von 1

AddCipherBuffer - Paketgröße nicht "frei wählbar"?

Verfasst: 07.05.2017 21:01
von STARGÅTE
Hallo Leute,

bin gerade etwas verwirrt über das Verhalten von AddCipherBuffer in Bezug auf die AES Verschlüsselung.
Scheinbar wird bei jedem Aufruf von AddCipherBuffer() der übergebene Buffer einfach sofort verschlüsselt/entschlüsselt, egal welche Länge er hat, und auch wenn die mindestlänge oder ein vielfaches von 16 Bytes nicht erreicht wird.

Ich hätte nun erwartet, dass AddCipherBuffer() die "Pakete" selbst verwaltet und nur dann mit der verschlüsselt/entschlüsselt beginnt, wenn es erlaubt ist, und sich den Rest solange "merkt". Statt dessen, rechnet er einfach drauf los und produziert nur Müll. Zumal gibt es ja sogar FinishCipher(), und ich dachte damit werden dann "übriggebliebene" Bytes noch zu Ende Verschlüsselt.

Ich habe somit keine Chance einen 35 Byte langen Buffer zu zerlegen (außer in 16 und 19), wie man an diesem Beispiel sieht:

Code: Alles auswählen

*Key    = AllocateMemory(16)
*Vector = AllocateMemory(16)
*Input  = AllocateMemory(64)
*Output = AllocateMemory(64)
PokeS(*Input, "Hallo Welt! Hallo Welt! Hallo Welt!", -1, #PB_Ascii)


TotalLength = 35

CompilerIf #True
	
	FirstPart = 18
	
	StartAESCipher(1, *Key, 128, *Key, #PB_Cipher_Encode|#PB_Cipher_CBC)
	AddCipherBuffer(1, *Input, *Output, FirstPart)
	AddCipherBuffer(1, *Input+FirstPart, *Output+FirstPart, TotalLength-FirstPart)
	FinishCipher(1)
	
CompilerElse
	
	AESEncoder(*Input, *Output, TotalLength, *Key, 128, *Key, #PB_Cipher_CBC)
	
CompilerEndIf

AESDecoder(*Output, *Input, TotalLength, *Key, 128, *Key, #PB_Cipher_CBC)

Debug PeekS(*Input, TotalLength, #PB_Ascii)
Muss ich jetzt wirklich selbst diese Verwaltung übernehmen, wie ich es schon bei meiner Version für Base64 gebraucht habe?
Sollte man so ein Verhalten nicht in der Hilfe dokumentieren?
Oder übersehe ich hier irgendwas?
Ist das vielleicht sogar als Bug zu bezeichnen?

Re: AddCipherBuffer - Paketgröße nicht "frei wählbar"?

Verfasst: 08.05.2017 16:19
von NicTheQuick
Das ist ja fies. Das kommt mir tatsächlich wie ein Bug vor.

Dekodiert man wieder mit der selben Blockgröße funktioniert es wieder. Aber man will ja auch kompatibel sein zu anderen Programmen, die nicht wissen mit welchen einzelnen Blockgrößen man hier gearbeitet hat. Ich hätte auch erwartet, dass es so funktioniert wie du es beschrieben hast. Also mit eigener interner Blockverwaltung.

Code: Alles auswählen

 *Key    = AllocateMemory(16)
*Vector = AllocateMemory(16)
*Input  = AllocateMemory(64)
*Output = AllocateMemory(64)
PokeS(*Input, "Hallo Welt! Hallo Welt! Hallo Welt!", -1, #PB_Ascii)


TotalLength = 35

CompilerIf #True
   
   FirstPart = 18
   
   StartAESCipher(1, *Key, 128, *Key, #PB_Cipher_Encode|#PB_Cipher_CBC)
   AddCipherBuffer(1, *Input, *Output, FirstPart)
   AddCipherBuffer(1, *Input+FirstPart, *Output+FirstPart, TotalLength-FirstPart)
   FinishCipher(1)
   
   StartAESCipher(1, *Key, 128, *Key, #PB_Cipher_Decode|#PB_Cipher_CBC)
   AddCipherBuffer(1, *Output, *Input, FirstPart)
   AddCipherBuffer(1, *Output+FirstPart, *Input+FirstPart, TotalLength-FirstPart)
   FinishCipher(1)
   
CompilerElse
   
   AESEncoder(*Input, *Output, TotalLength, *Key, 128, *Key, #PB_Cipher_CBC)
   AESDecoder(*Output, *Input, TotalLength, *Key, 128, *Key, #PB_Cipher_CBC)
   
CompilerEndIf



Debug PeekS(*Input, TotalLength, #PB_Ascii)