Seite 1 von 1

Brauche Hilfe bei AESEncoder/AESDecoder

Verfasst: 29.01.2026 15:45
von EmmJott
Guude!

Versuche gerade, das Beispiel in der Hilfe für meine Zwecke umzubauen, krieg's aber nicht hin. Da wird zwar was encodiert, aber das Decoden will nicht. Kann mir da mal jemand über die Schulter gucken?

Code: Alles auswählen

Procedure.s Encode(pstr$)
  StringMemorySize = StringByteLength(pstr$) + SizeOf(Character)
  *CipheredString = AllocateMemory(StringMemorySize)
  *DecipheredString = AllocateMemory(StringMemorySize)
  If AESEncoder(@pstr$, *CipheredString, StringByteLength(pstr$), ?Key, 128, ?InitializationVector)
    Return$ = PeekS(*CipheredString)
  Else
    Return$ = ""
  EndIf
  FreeMemory(*CipheredString)
  FreeMemory(*DecipheredString)
  ProcedureReturn Return$
EndProcedure

Procedure.s Decode(pstr$)
  StringMemorySize = StringByteLength(pstr$) + SizeOf(Character)
  *CipheredString = AllocateMemory(StringMemorySize)
  *DecipheredString = AllocateMemory(StringMemorySize)
  If AESDecoder(*CipheredString, *DecipheredString, StringByteLength(pstr$), ?Key, 128, ?InitializationVector)
    ;Debug "Deciphered: "+PeekS(*DecipheredString)
    Return$ = PeekS(*DecipheredString)
  Else
    Return$ = ""
  EndIf
  FreeMemory(*CipheredString)
  FreeMemory(*DecipheredString)
  ProcedureReturn Return$    
EndProcedure

DataSection
  Key:
  Data.b $06, $a9, $21, $40, $36, $b8, $a1, $5b, $51, $2e, $03, $d5, $34, $12, $00, $06
  
  InitializationVector:
  Data.b $3d, $af, $ba, $42, $9d, $9e, $b4, $30, $b4, $22, $da, $80, $2c, $9f, $ac, $41
EndDataSection



pw$ = "1234567890abcABC"

x$ = Encode(pw$)

Debug x$

Debug Decode(x$)

Re: Brauche Hilfe bei AESEncoder/AESDecoder

Verfasst: 29.01.2026 16:25
von Axolotl
Moin,
versuche das hier:

Code: Alles auswählen

Procedure.s Encode(pstr$)
  StringMemorySize = StringByteLength(pstr$) + SizeOf(Character)
  *CipheredString = AllocateMemory(StringMemorySize)
; *DecipheredString = AllocateMemory(StringMemorySize)
  If AESEncoder(@pstr$, *CipheredString, StringByteLength(pstr$), ?Key, 128, ?InitializationVector)
    Return$ = PeekS(*CipheredString)
  Else
    Return$ = ""
  EndIf
  FreeMemory(*CipheredString)
; FreeMemory(*DecipheredString)
  ProcedureReturn Return$
EndProcedure

Procedure.s Decode(pstr$)
  StringMemorySize = StringByteLength(pstr$) + SizeOf(Character)
; *CipheredString = AllocateMemory(StringMemorySize)
  *DecipheredString = AllocateMemory(StringMemorySize)

; If AESDecoder(*CipheredString, *DecipheredString, StringByteLength(pstr$), ?Key, 128, ?InitializationVector)
  If AESDecoder(@pstr$, *DecipheredString, StringByteLength(pstr$), ?Key, 128, ?InitializationVector)
    ;Debug "Deciphered: "+PeekS(*DecipheredString)
    Return$ = PeekS(*DecipheredString)
  Else
    Return$ = ""
  EndIf
; FreeMemory(*CipheredString)
  FreeMemory(*DecipheredString)
  ProcedureReturn Return$    
EndProcedure

DataSection
  Key:
  Data.b $06, $a9, $21, $40, $36, $b8, $a1, $5b, $51, $2e, $03, $d5, $34, $12, $00, $06
  
  InitializationVector:
  Data.b $3d, $af, $ba, $42, $9d, $9e, $b4, $30, $b4, $22, $da, $80, $2c, $9f, $ac, $41
EndDataSection



pw$ = "1234567890abcABC"

x$ = Encode(pw$)

Debug x$

Debug Decode(x$)

Re: Brauche Hilfe bei AESEncoder/AESDecoder

Verfasst: 29.01.2026 20:57
von STARGÅTE
EmmJott hat geschrieben: 29.01.2026 15:45 Guude!
Versuche gerade, das Beispiel in der Hilfe für meine Zwecke umzubauen, krieg's aber nicht hin. Da wird zwar was encodiert, aber das Decoden will nicht. Kann mir da mal jemand über die Schulter gucken?
Vorweg erst mal der wichtige Hinweis, dass ein mit AESEncoder() kodierter Speicherpuffer (in dem ein Text steht) im allgemeinen Fall keinen als Text darstellbaren Speicherpuffer zurück gibt! In Strings von PureBasic ist das NUL-Zeichen innerhalb des Strings nicht erlaubt, weil es immer das Ende des Strings markiert. Wenn du also irgendwie zwingst dieses kodierten Text wieder als Text zu dekodieren wirst du scheitern, weil der kodierten Text beschädigt und unvollständig ist.
Ich verstehe bis heute noch, wie so ein fataler Fehler in der PureBasic Hilfe trotz des Hinweises "Warning: wird beim ersten Null-Byte angehalten, nur für Demo-Zwecke" stehen bleibt.
Ein weiterer wichtiger Punkt ist, dass die Mindestgröße für einen Speicherpuffer der verschlüsselt werden soll mindestens 16 Byte sein muss (siehe Hilfe).

Damit du ein String zurückgeben kannst, musst du z.B. Base64Encoder() verwenden um den kodierten Speicherpuffer als String zurückgeben zu können. Später kannst du dann wieder mit Base64Decoder vor dem dekodieren arbeiten.

Re: Brauche Hilfe bei AESEncoder/AESDecoder

Verfasst: 30.01.2026 08:26
von EmmJott
Erstmal Danke an Axolotl, damit funktioniert es. Die Eingabe wird codiert (im Debug-Fenster überwiegend mit chinesischen Schriftzeichen dargestellt) und dieser String wird korrekt decodiert.

@ STARGÅTE:
Danke für Deinen Input. Wenn ich Dich richtig verstehe, "funktioniert" das wie gerade eben beschrieben nur zufällig, weil PeekS(*CipheredString) eben keinen "echten" String erzeugt (wegen Null und so).

Also wäre die richtige Vorgehensweise zum codieren und decodieren dann so?
1. Den zu codierenden String (nennen wir den ab jetzt mal Passwort) ggf. zuerst auf Länge bringen (mindestens 16 Zeichen) durch das Voranstellen von Leerzeichen.
2. das (ggf. aufgefüllte) Passwort AESEncodieren
3. den Speicherbereich in einen "echten" String zu speichern mit z. B. string$ = Base64Encoder(*CipheredString, MemorySize(*CipheredString))

und das decodieren dann andersherum
1. String Base64Decode, Ergebnis in einem Speicherbereich
2. den Speicherbereich AESDecodieren
3. Passwort (im Klartext) ist dann Trim(PeekS(*DecipheredString))

Wenn das so wäre - mit den Zeigern auf Speicherbereiche und ermitteln der Länge des Bereichs "hab' ich's nicht so" und bräuchte Unterstützung. :praise:

Re: Brauche Hilfe bei AESEncoder/AESDecoder

Verfasst: 30.01.2026 16:43
von Axolotl
Moin,

ich habe mal die beiden Hilfe-Beispiele für AESXxxx und Base64Xxxx zusammen kopiert, das ist dabei herausgekommen.
Vielleicht hilft es dir ja als Start.

Code: Alles auswählen

String$ = "Hello this is a test for AES"
Format  = #PB_UTF8 
; Format = #PB_Unicode 

If 0 And Format = #PB_UTF8 
  ; (easy way)  
  *Text = UTF8(String$) ; <= allocates the needed memory internally 
Else 
  ; more sophisticated 
  *Text = AllocateMemory(StringByteLength(String$, Format) + SizeOf(Character)) 
  PokeS(*Text, String$, StringByteLength(String$, Format), Format) 
EndIf 

MemorySize = StringByteLength(String$, Format) ; Space for the string 
*CipheredData   = AllocateMemory(MemorySize + SizeOf(Character)) 
*DecipheredData = AllocateMemory(MemorySize + SizeOf(Character)) 

If AESEncoder(*Text, *CipheredData, MemorySize, ?Key, 128, ?InitializationVector)
  result$ = Base64Encoder(*CipheredData, MemorySize)                                ; <= string w/o unwanted Zero-chars 
  Debug "Ciphered: " + result$ 

  ; all back to the beginning 
  bytes = Base64Decoder(result$, *DecipheredData, MemorySize)                       ; <= make data out of string ?? 
  If bytes 
    AESDecoder(*CipheredData, *DecipheredData, MemorySize, ?Key, 128, ?InitializationVector) 
    Debug "Deciphered: " + PeekS(*DecipheredData, -1, Format) 
  EndIf 
EndIf 

FreeMemory(*Text) 
FreeMemory(*CipheredData) 
FreeMemory(*DecipheredData) 

DataSection
  Key:
    Data.b $06, $a9, $21, $40, $36, $b8, $a1, $5b, $51, $2e, $03, $d5, $34, $12, $00, $06

  InitializationVector:
    Data.b $3d, $af, $ba, $42, $9d, $9e, $b4, $30, $b4, $22, $da, $80, $2c, $9f, $ac, $41
EndDataSection

Re: Brauche Hilfe bei AESEncoder/AESDecoder

Verfasst: 31.01.2026 23:48
von STARGÅTE
EmmJott hat geschrieben: 30.01.2026 08:26 Wenn das so wäre - mit den Zeigern auf Speicherbereiche und ermitteln der Länge des Bereichs "hab' ich's nicht so" und bräuchte Unterstützung. :praise:
Hallo EmmJott,

hier mal zwei Prozeduren und ein Beispiel für das ver- und entschlüsseln von Strings, mit einem Passwort.

Code: Alles auswählen

EnableExplicit


#Cipher_Salt       = "Example" ; Für DeriveCipherKey
#Cipher_Iterations = 100       ; Für DeriveCipherKey

DataSection
	InitializationVector: ; Für AESEncoder/Decoder
	Data.b $3d, $af, $ba, $42, $9d, $9e, $b4, $30, $b4, $22, $da, $80, $2c, $9f, $ac, $41
EndDataSection

UseSHA3Fingerprint() ; Für DeriveCipherKey


Procedure.s SimpleEncode(Message.s, Key.s)
	
	Protected *InputBuffer, *OutputBuffer, *Key
	Protected BufferLength.i
	Protected EncryptedMessage.s
	
	; Aus einem Passwort ein Verschlüsselung-Key bauen
	*Key = AllocateMemory(16)
	DeriveCipherKey(Key, #Cipher_Salt, #Cipher_Iterations, *Key, 128, #PB_Cipher_SHA3, 256)
	
	; Pufferlänge ermittelt und auf mindestens 16 Byte bringen
	BufferLength = StringByteLength(Message, #PB_UTF8)
	If BufferLength < 16  :  BufferLength = 16  :  EndIf
	
	; Zu verschlüsselnde Nachricht in den *InputBuffer laden
	*InputBuffer  = AllocateMemory(BufferLength)
	*OutputBuffer = AllocateMemory(BufferLength)
	PokeS(*InputBuffer, Message, -1, #PB_UTF8|#PB_String_NoZero)
	
	; Verschlüsseln
	AESEncoder(*InputBuffer, *OutputBuffer, BufferLength, *Key, 128, ?InitializationVector)
	
	; In lesbare Zeichen umwandeln
	EncryptedMessage = Base64Encoder(*OutputBuffer, BufferLength)
	
	FreeMemory(*InputBuffer)
	FreeMemory(*OutputBuffer)
	FreeMemory(*Key)
	
	ProcedureReturn EncryptedMessage
	
EndProcedure


Procedure.s SimpleDecode(EncryptedMessage.s, Key.s)
	
	Protected *InputBuffer, *OutputBuffer, *Key
	Protected BufferLength.i
	Protected Message.s
	
	; Aus einem Passwort ein Verschlüsselung-Key bauen
	*Key = AllocateMemory(16)
	DeriveCipherKey(Key, #Cipher_Salt, #Cipher_Iterations, *Key, 128, #PB_Cipher_SHA3, 256)
	
	; Pufferlänge ermittelt und auf mindestens 64 Byte bringen
	BufferLength = StringByteLength(EncryptedMessage, #PB_UTF8)
	If BufferLength < 64  :  BufferLength = 64  :  EndIf
	
	; Zu entschlüsselnde Nachricht in den *InputBuffer laden
	*InputBuffer  = AllocateMemory(BufferLength)
	*OutputBuffer = AllocateMemory(BufferLength)
	BufferLength = Base64Decoder(EncryptedMessage, *InputBuffer, BufferLength) 
	
	; Entschlüsseln
	AESDecoder(*InputBuffer, *OutputBuffer, BufferLength, *Key, 128, ?InitializationVector)
	Message = PeekS(*OutputBuffer, BufferLength, #PB_UTF8|#PB_ByteLength)
	
	FreeMemory(*InputBuffer)
	FreeMemory(*OutputBuffer)
	FreeMemory(*Key)
	
	ProcedureReturn Message
	
EndProcedure


Define EncryptedMessage.s
Define Message.s = "Das ist ein Beispielsatz."
Define Key.s = "Qwertz"

Debug "Original Nachricht:        " + Message
EncryptedMessage = SimpleEncode(Message, Key)
Debug "Verschlüsselte Nachricht:  " + EncryptedMessage
Message = SimpleDecode(EncryptedMessage, Key)
Debug "Entschlüsselte Nachricht:  " + Message
Debug "Falsches Passwort:         " + SimpleDecode(EncryptedMessage, ReverseString(Key))


Re: Brauche Hilfe bei AESEncoder/AESDecoder

Verfasst: 01.02.2026 11:24
von Bisonte
Danke Stargate. Wieder eine Funktion erwischt, die sich an mir vorbeigeschlichen hat :D
Seit wann gibt es denn DeriveCipherKey() ?

Re: Brauche Hilfe bei AESEncoder/AESDecoder

Verfasst: 01.02.2026 11:46
von STARGÅTE
Seit PureBasic 6.10. Aber mach dir nix draus, ich habe sie auch erst jetzt entdeckt, als ich den Code geschrieben habe.