Brauche Hilfe bei AESEncoder/AESDecoder

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
EmmJott
Beiträge: 66
Registriert: 25.10.2024 12:23

Brauche Hilfe bei AESEncoder/AESDecoder

Beitrag 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$)
Hauptsache: Niveau! Bin beim Pogrammieren seit Jahrzehnten konstant auf Anfängerniveau!
Axolotl
Beiträge: 319
Registriert: 31.12.2008 16:34

Re: Brauche Hilfe bei AESEncoder/AESDecoder

Beitrag 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$)
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Brauche Hilfe bei AESEncoder/AESDecoder

Beitrag 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.
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
EmmJott
Beiträge: 66
Registriert: 25.10.2024 12:23

Re: Brauche Hilfe bei AESEncoder/AESDecoder

Beitrag 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:
Hauptsache: Niveau! Bin beim Pogrammieren seit Jahrzehnten konstant auf Anfängerniveau!
Axolotl
Beiträge: 319
Registriert: 31.12.2008 16:34

Re: Brauche Hilfe bei AESEncoder/AESDecoder

Beitrag 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
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Brauche Hilfe bei AESEncoder/AESDecoder

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

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
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: Brauche Hilfe bei AESEncoder/AESDecoder

Beitrag von Bisonte »

Danke Stargate. Wieder eine Funktion erwischt, die sich an mir vorbeigeschlichen hat :D
Seit wann gibt es denn DeriveCipherKey() ?
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Brauche Hilfe bei AESEncoder/AESDecoder

Beitrag 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.
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
Antworten