Verschlüsseln eines Strings mit InitializationVector

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Verschlüsseln eines Strings mit InitializationVector

Beitrag von Velindos »

Halo Leute,

der String ist nicht mehr leserlich, warum?

Code: Alles auswählen

; ------------------------------------------------
; Verschlüsseln eines Strings mit InitializationVector
; ------------------------------------------------
Global FileNr
Global FileKey.s = "D:\[Pure@KEY]\Velindos_KEY.key"

Global StringMemorySize
Global *CipheredString
Global *DecipheredString

; ------------------------------------------------
InitializationCodecString$ = "Wir testen den decoder mit einigen Eingaben etx..."
; ------------------------------------------------
If FileSize(FileKey) <> -1
  ; Debug "Delete"
  DeleteFile(FileKey,#PB_FileSystem_Force)
EndIf
; =============================================
;{ HIER WÄRE SPEICHERN
; =============================================
; Platz für den null-terminierten String mit seiner abschließenden Null
StringMemorySize = StringByteLength(InitializationCodecString$) + SizeOf(Character)
; =============================================
; MEMORY
*CipheredString = AllocateMemory(StringMemorySize)   
*DecipheredString = AllocateMemory(StringMemorySize) 
; ------------------------------------------------
If AESEncoder(@InitializationCodecString$, *CipheredString, MemorySize(*CipheredString), ?Key, 128, ?InitializationVector)
  ; ------------------------------------------------
  ; Warning: wird beim ersten Null-Byte angehalten, nur für Demo-Zwecke
  Debug "Ciphered: "+PeekS(*CipheredString) 
  
  
  ; =============================================
  ; ------------------------------------------------
  FileNr = CreateFile(#PB_Any, FileKey)   
  WriteStringN(FileNr, PeekS(*CipheredString, -1))  
  ;     WriteStringN(FileNr, PeekS(*CipheredString, -1, #PB_Ascii), #PB_Ascii)  
  SetFileAttributes(FileKey, #PB_FileSystem_ReadOnly)
  CloseFile(FileNr)   
  ; ------------------------------------------------
  FreeMemory(*CipheredString)
  FreeMemory(*DecipheredString)
  ; ------------------------------------------------
  ;}
  
  ; =============================================
  ;{ HIER WÄRE LOADED
  ; ------------------------------------------------
  If FileSize(FileKey)
    ; ------------------------------------------------
    If ReadFile(0,FileKey) 
      ; sich wiederholende Schleife bis das Ende der Datei ("end of file") erreicht ist
      While Eof(0) = 0                 
        ; Key Laden
        DecodeString$ = ReadString(0,#PB_Ascii)  
        Debug "ReadString: "+DecodeString$
      Wend
      CloseFile(0)     
    Else
      Beep_(1200,350)
    EndIf
  EndIf
  ; =============================================   
  ;   StringMemorySize = Len(DecodeString$) + SizeOf(Character)
  StringMemorySize = StringByteLength(DecodeString$) + SizeOf(Character)
  ; ------------------------------------------------
  *CipheredString = AllocateMemory(StringMemorySize)   
  *DecipheredString = AllocateMemory(StringMemorySize) 
  ; ------------------------------------------------
  PokeS(*CipheredString, DecodeString$ ,StringMemorySize, #PB_Ascii) 
  ; ------------------------------------------------
  ; =============================================
  AESDecoder(*CipheredString, *DecipheredString, StringByteLength(DecodeString$) + SizeOf(Character), ?Key, 128, ?InitializationVector)
  Key_String$ = PeekS(*DecipheredString)
  ; =============================================
  Debug "Deciphered: " + Key_String$
  ; =============================================
  ;}
  
EndIf
; ------------------------------------------------
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
; ------------------------------------------------
Gruss ... Velindos!
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Verschlüsseln eines Strings mit InitializationVector

Beitrag von STARGÅTE »

Ein mit AESEncoder verschlüsselter String ist kein String mehr, sondern reine Binärdaten und als solche musst du sie auch behanden.
Du kannst deine verschlüsselten Daten also nicht mit WriteStringN speichern und auch nicht mit DecodeString$ = ReadString(0,#PB_Ascii) einlesen, sondern muss/kannst es direkt mit WriteData(*CipheredString) bzw. mit ReadData machen. Natürlich musst du dabei irgendwo noch speichern, wie lang die Daten sind, denn das NUL-Zeichen kann ja teil der Daten sein und muss nicht das ende sein. Außerdem würde ReadString eh bei jedem Zeilenumbruch auch aufhören zu lesen.
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
TroaX
Beiträge: 662
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: Verschlüsseln eines Strings mit InitializationVector

Beitrag von TroaX »

Alternativ kannst du auch die Daten Base64 kodieren und dann als String speichern. Das ist aber weniger effizient und die Daten nehmen auf der Platte viel mehr Platz weg (bis zu 36% mehr). Daher ist dies eher weniger zu empfehlen.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Verschlüsseln eines Strings mit InitializationVector

Beitrag von Velindos »

Hallo,
Ein mit AESEncoder verschlüsselter String ist kein String mehr, sondern reine Binärdaten und als solche musst du sie auch behanden.
das muss man wissen! Danke!

Code: Alles auswählen

; ------------------------------------------------
; Verschlüsseln eines Strings mit InitializationVector
; ------------------------------------------------
Global FileNr
Global FileKey.s = "D:\[Pure@KEY]\Velindos_KEY.key"

Global length
Global StringMemorySize
Global *CipheredString
Global *DecipheredString

; ------------------------------------------------
InitializationCodecString$ = "Wir testen den decoder mit einigen Eingaben etx..."
; ------------------------------------------------
If FileSize(FileKey) <> -1
  ; Debug "Delete"
  DeleteFile(FileKey,#PB_FileSystem_Force)
EndIf
; =============================================
;{ HIER WÄRE SPEICHERN
; =============================================
; Platz für den null-terminierten String mit seiner abschließenden Null
StringMemorySize = StringByteLength(InitializationCodecString$) + SizeOf(Character)
; =============================================
; MEMORY
*CipheredString = AllocateMemory(StringMemorySize)   
*DecipheredString = AllocateMemory(StringMemorySize) 
; ------------------------------------------------
If AESEncoder(@InitializationCodecString$, *CipheredString, MemorySize(*CipheredString), ?Key, 128, ?InitializationVector)
  ; ------------------------------------------------
  ; Warning: wird beim ersten Null-Byte angehalten, nur für Demo-Zwecke
  Debug "Ciphered: "+PeekS(*CipheredString) 
  ; =============================================
  FileNr = CreateFile(#PB_Any, FileKey)   
  ; ------------------------------------------------
  Ergebnis = WriteData(FileNr, *CipheredString, StringMemorySize)
  ; ------------------------------------------------
  SetFileAttributes(FileKey, #PB_FileSystem_ReadOnly)
  ; ------------------------------------------------
  CloseFile(FileNr)   
  ; ------------------------------------------------
  FreeMemory(*CipheredString)
  FreeMemory(*DecipheredString)
  ; =============================================
  ;}
  
  ;{ HIER WÄRE LOADED
  ; =============================================   
  If FileKey
    If ReadFile(0, FileKey) 
      length = Lof(0)                              ; Länge der geöffneten Datei ermitteln
      *CipheredString   = AllocateMemory(length)   ; Reservieren des benötigten Speichers
      *DecipheredString = AllocateMemory(length) 
      If *CipheredString
        bytes = ReadData(0, *CipheredString, length)   ; Einlesen aller Daten in den Speicherblock
        Debug "Anzahl der gelesenen Bytes: " + Str(bytes)
      EndIf
      CloseFile(0)
    EndIf
  EndIf
  ; =============================================
  AESDecoder(*CipheredString, *DecipheredString, length, ?Key, 128, ?InitializationVector)
  Key_String$ = PeekS(*DecipheredString)
  ; =============================================
  Debug "Deciphered: " + Key_String$
  ; =============================================
  ;}
  
EndIf
; ------------------------------------------------
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
; ------------------------------------------------
So funzt die Sache! Danke für die Hilfe!

Gruss ... Velindos!
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Antworten