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

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

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

Beitrag 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?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8677
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

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

Beitrag 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)
Bild
Antworten