Seite 1 von 2

AESEncoding Funktioniert nicht beim Speichern!

Verfasst: 23.05.2022 12:09
von Velindos
Hallo Leute,
wollte das AESEncoding speichern und laden, bringt die Sache nicht decodiert!

Code: Alles auswählen

; AESEncoder SPECIHERN
;
Global KKeyFile.s = "D:\TESTKEY.txt"
Global *CipheredString   
Global *DecipheredString   

Global String$ = "Hello this is a test for AES"

*CipheredString   = AllocateMemory(Len(String$) + SizeOf(Character)) ; Platz für den null-terminierten String
*DecipheredString = AllocateMemory(Len(String$) + SizeOf(Character)) ; mit seiner abschließenden Null (ASCII-Modus)

If AESEncoder(@String$, *CipheredString, Len(String$), ?Key, 128, 0, #PB_Cipher_ECB)
  Debug "Ciphered: "+PeekS(*CipheredString)
  ; --------------------------
  KeyFile = CreateFile(#PB_Any, KKeyFile)   
  WriteStringN(KeyFile, PeekS(*CipheredString),#PB_Ascii)  
  ; SetFileAttributes(KKeyFile, #PB_FileSystem_ReadOnly)
  CloseFile(KeyFile)   
  ; --------------------------
  AESDecoder(*CipheredString, *DecipheredString, Len(String$), ?Key, 128, 0, #PB_Cipher_ECB)
  Debug "Deciphered: "+PeekS(*DecipheredString)
  ; --------------------------
EndIf

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


Auslesen:

Code: Alles auswählen

; ------------------------------------------------
; TESTKEY.Key LESEN
; ------------------------------------------------
Global KKEY_FILE.s = "D:\TESTKEY.txt"
; ------------------------------------------------
Global String$
Global *CipheredString 
Global *DecipheredString
; ------------------------------------------------
; wenn die Datei ge?ffnet werden konnte, setzen wir fort...
If ReadFile(0,KKEY_FILE) 
  ; sich wiederholende Schleife bis das Ende der Datei ("end of file") erreicht ist
  While Eof(0) = 0                 
    ; Key Laden
    String$ = ReadString(0,#PB_Ascii)  
  Wend
  CloseFile(0)     
Else
  Beep_(1200,350)
EndIf
; ------------------------------------------------
Debug "String$: "+String$
; ------------------------------------------------
*CipheredString   = AllocateMemory(Len(String$) + SizeOf(Character)) ; Platz für den null-terminierten String
*DecipheredString = AllocateMemory(Len(String$) + SizeOf(Character)) ; mit seiner abschließenden Null (ASCII-Modus)
  ; --------------------------
AESDecoder(*CipheredString, *DecipheredString, StringByteLength(String$) + SizeOf(Character), ?Key, 128, 0, #PB_Cipher_ECB)
Debug "Deciphered: "+PeekS(*DecipheredString)
; ------------------------------------------------
DataSection
  Key:
  Data.b $06, $a9, $21, $40, $36, $b8, $a1, $5b, $51, $2e, $03, $d5, $34, $12, $00, $06
EndDataSection

-
Jemand eine Ahnung warum das nicht geht?

Gruss ... Velindos!

Re: AESEncoding Funktioniert nicht beim Speichern!

Verfasst: 23.05.2022 13:22
von mk-soft
Nicht als String Speichern , sondern als Data

Ausserdem ist die länge von String falsch (Unicode). Also StringByteLen oder String in ASCII wandeln

Alles in ASCII oder alles in Unicode ...

Code: Alles auswählen

; AESEncoder SPECIHERN
;
Global KKeyFile.s = "D:\Ablage\TESTKEY.txt"
Global *CipheredString   
Global *DecipheredString   

Global String$ = "Hello this is a test for AES"

*CipheredString   = AllocateMemory(Len(String$) + SizeOf(Character)) ; Platz für den null-terminierten String
*DecipheredString = AllocateMemory(Len(String$) + SizeOf(Character)) ; mit seiner abschließenden Null (ASCII-Modus)

*String = Ascii(String$)
If AESEncoder(*String, *CipheredString, Len(String$), ?Key, 128, 0, #PB_Cipher_ECB)
  Debug "Ciphered: "+PeekS(*CipheredString, -1, #PB_Ascii)
  ; --------------------------
  KeyFile = CreateFile(#PB_Any, KKeyFile)   
  WriteStringN(KeyFile, PeekS(*CipheredString, -1, #PB_Ascii), #PB_Ascii)  
  ; SetFileAttributes(KKeyFile, #PB_FileSystem_ReadOnly)
  CloseFile(KeyFile)   
  ; --------------------------
  AESDecoder(*CipheredString, *DecipheredString, Len(String$), ?Key, 128, 0, #PB_Cipher_ECB)
  Debug "Deciphered: "+PeekS(*DecipheredString, -1, #PB_Ascii)
  ; --------------------------
EndIf
FreeMemory(*String)

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

Re: AESEncoding Funktioniert nicht beim Speichern!

Verfasst: 23.05.2022 14:35
von Velindos
Hallo mk-soft!

Danke für deinen Tipp. Habe die Sache in ein Beispiel mit speichern/laden eingearbeitet!

Code: Alles auswählen

Hallo mk-soft!

Danke für deinen Tipp. Habe die Sache in ein Beispiel mit speichern & laden eingearbeitet, funzt!

[code]; ------------------------------------------------
; AESEncoder SPECIHERN/AUSLESEN des String
; ------------------------------------------------
Global String$
Global KKeyFile.s = "D:\Ablage\TESTKEY.txt"
Global *CipheredString   
Global *DecipheredString   

Global String$ = "Hello this is a test for AES in ASCII"

;{ EINLESEN
; =============================================
*CipheredString   = AllocateMemory(Len(String$) + SizeOf(Character)) ; Platz für den null-terminierten String
*DecipheredString = AllocateMemory(Len(String$) + SizeOf(Character)) ; mit seiner abschließenden Null (ASCII-Modus)
; =============================================
*String = Ascii(String$)
; =============================================
If AESEncoder(*String, *CipheredString, Len(String$), ?Key, 128, 0, #PB_Cipher_ECB)
  Debug "Ciphered: "+PeekS(*CipheredString, -1, #PB_Ascii)
EndIf
; =============================================
KeyFile = CreateFile(#PB_Any, KKeyFile)   
WriteStringN(KeyFile, PeekS(*CipheredString, -1, #PB_Ascii), #PB_Ascii)  
SetFileAttributes(KKeyFile, #PB_FileSystem_ReadOnly)
CloseFile(KeyFile)   
; =============================================
FreeMemory(*CipheredString)
FreeMemory(*DecipheredString)
; =============================================
;}
; =============================================
Delay(500)
; =============================================
;{ AUSLESEN
; =============================================
; wenn die Datei ge?ffnet werden konnte, setzen wir fort...
If ReadFile(0,KKeyFile) 
  ; sich wiederholende Schleife bis das Ende der Datei ("end of file") erreicht ist
  While Eof(0) = 0                 
    ; Key Laden
    String$ = ReadString(0,#PB_Ascii)  
    Debug "Ciphered: "+String$
  Wend
  CloseFile(0)     
Else
  Beep_(1200,350)
EndIf
; =============================================
*CipheredString   = AllocateMemory(Len(String$)) ; Platz für den null-terminierten String
*DecipheredString = AllocateMemory(Len(String$)) ; mit seiner abschließenden Null (ASCII-Modus)

; ------------------------------------------------
PokeS(*CipheredString, String$ , Len(String$) + SizeOf(Character), #PB_Ascii) 
; ------------------------------------------------
AESDecoder(*CipheredString, *DecipheredString, Len(String$), ?Key, 128, 0, #PB_Cipher_ECB)
Debug "Deciphered: "+PeekS(*DecipheredString, -1, #PB_Ascii)
; --------------------------
FreeMemory(*String)
FreeMemory(*CipheredString)
FreeMemory(*DecipheredString)
; --------------------------
;}
; =============================================
DataSection
  Key:
  Data.b $06, $a9, $21, $40, $36, $b8, $a1, $5b, $51, $2e, $03, $d5, $34, $12, $00, $06
EndDataSection
; --------------------------
Nochmals DANKE!

Gruss ... Velindos!

Re: AESEncoding Funktioniert nicht beim Speichern!

Verfasst: 23.05.2022 14:55
von Thorsten1867
Du kannst ja mal einen Blick auf mein Modul werfen:
qAES_Module.pbi

Re: AESEncoding Funktioniert nicht beim Speichern!

Verfasst: 23.05.2022 15:30
von Velindos
Hallo Thorsten1867,
besten Dank für dein Angebot. Hab es mir angesehen, gut zu wissen das es dies gibt!
Gute Idee, für sicheren Transport!

In meinen Fall speichere ich lediglich meine Velindos Key Datei damit ab und die ist nicht länger wie im Beispiel!

Also nochmals besten DANK für euere Mithilfe!!!

Gruss ... Velindos!

Re: AESEncoding Funktioniert nicht beim Speichern!

Verfasst: 23.05.2022 17:44
von NicTheQuick
Denk daran den Key nicht in der Datasection zu lassen, sondern mit einer Hashfunktion zu berechnen, nachdem der User das Passwort eingegeben hat. Ansonsten macht es ja keinen Sinn überhaupt zu verschlüsseln.

Re: AESEncoding Funktioniert nicht beim Speichern!

Verfasst: 24.05.2022 08:29
von Velindos
Hallo NicTheQuick!
Hashfunktion zu berechnen
Danke für deinen Hinweis auf Hashfunktion. Brauche es nicht im Velindos, da ich kein Passwort eingegebe!

Würde mich interessieren, wie die Hashfunktion zu berechnen ist! Vielleicht jemand ein kurzes Beispiel!

Nochmals Danke für die Tip´s und Anregungen!

Gruss .. Velindos!

Re: AESEncoding Funktioniert nicht beim Speichern!

Verfasst: 24.05.2022 08:58
von STARGÅTE
Velindos hat geschrieben: 24.05.2022 08:29 Hallo NicTheQuick!
Hashfunktion zu berechnen
Danke für deinen Hinweis auf Hashfunktion. Brauche es nicht im Velindos, da ich kein Passwort eingegebe!

Würde mich interessieren, wie die Hashfunktion zu berechnen ist! Vielleicht jemand ein kurzes Beispiel!

Nochmals Danke für die Tip´s und Anregungen!

Gruss .. Velindos!
NicTheQuick meint, du solltest eine dynamische Eingabe eines Passworts ermöglichen, aus dem dann z.B. mit SHA-3 (Hashfunktion) ein 256 bit Key für ASE generiert wird, damit dieser Key nicht in der DataSection liegt, wo man ihn lesen kann. Ansonsten kannst du dir diese ganze Verschlüsselung sparen ^^

Re: AESEncoding Funktioniert nicht beim Speichern!

Verfasst: 25.05.2022 08:44
von Velindos
Hallo STARGÅTE,

Danke für den Hinweis!

Wenn ich das nun richtig verstehe ist der Schlüssel der Vercodung der Key!
DataSection
Key:
Data.b $06, $a9, $21, $40, $36, $b8, $a1, $5b, $51, $2e, $03, $d5, $34, $12, $00, $06
EndDataSection
Nun dann ergibt sich die Frage wie erstelle ich diesen Schlüssel?
Gibt es hierfür einen Befehl oder Routine?

Gruss .. Velindos!

Re: AESEncoding Funktioniert nicht beim Speichern!

Verfasst: 25.05.2022 09:37
von STARGÅTE
Das ist richtig. Natürlich kann dieser Schlüssel, welcher hier 256 Bit lang ist (16 Byte) beliebig gewählt werden.
Mann könnte auch einfach ein 16 Byte lange Zeichenkette nutzen.
Üblicherweise wird ein solcher Schlüssel aber mit einer Hash-Funktion, wie zum Beispiel SHA-3, aus einem beliebigen (und beliebig langen) Passwort erzeugt.
Du kannst das in PureBasic mit StringFingerprint() machen.
Wenn du das aber "vorab" machst, und das Ergebnis (also den Key) einfach als DataSection in den Code schreibst, ist er später in der EXE frei einsehbar.
Bitte verstehe das nur als Sicherheitshinweis. Je nach dem was du eigentlich vor hast, kann das entweder "egal" sein oder aber ein Sicherheitsrisiko darstellen, wenn du Sensible Daten denkst zu verschlüsseln, den Schlüssel aber mit dazu legst.