AES-Crypter Finde den Fehler nicht

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Sauer-RAM
Beiträge: 326
Registriert: 13.04.2009 16:22
Computerausstattung: Lenovo ThinkPad X230t Convertible
Wohnort: Haslach i. K.

AES-Crypter Finde den Fehler nicht

Beitrag von Sauer-RAM »

Hi, ich schreibe gerade an einer einfachen Ver und entschluesselungsprozedru, finde aber einfach den Fehler nicht. Ich hoffe ihr könnt mir da weiterhelfen.

Code: Alles auswählen

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

  
Procedure.s EncryptString(StringtoEncrypt.s)
    *CipheredString   = AllocateMemory(Len(StringtoEncrypt)+1) ; Platz für den null-terminierten String
  If AESEncoder(@StringtoEncrypt, *CipheredString, Len(StringtoEncrypt), ?Key, 256, ?InitializationVector)
  Else
    Debug "ERROR WHILE ENCRYPTING"
  EndIf
  
  Ausgabe.s = PeekS(*CipheredString)
  FreeMemory(*CipheredString)
  Ausgabe = Str(Len(StringtoEncrypt)) + "?" + Ausgabe
  ProcedureReturn Ausgabe
EndProcedure

Procedure.s DecryptString(StringtoDecrypt.s)
  Groesse = Val(Left(StringtoDecrypt,FindString(StringtoDecrypt,"?")))
  StringtoDecrypt = Mid(StringtoDecrypt,FindString(StringtoDecrypt,"?") + 1)
  Debug StringtoDecrypt
    *DecipheredString = AllocateMemory(Groesse + 1) ; mit seiner abschließenden Null (ASCII-Modus)
  If AESDecoder(@StringtoDecrypt, *DecipheredString, Groesse, ?Key, 256, ?InitializationVector)
  Else
    Debug "ERROR WHILE DECRYPTING"
  EndIf
  
  Ausgabe.s = PeekS(*DecipheredString)
  FreeMemory(*DecipheredString)
  ProcedureReturn Ausgabe
EndProcedure

Repeat
  String.s = ""
  For n = 0 To 16 + Random(400)
    String.s = String.s + Chr(1 + Random(254))
  Next
  
  Encryptet.s = EncryptString(String)
  Debug "Ciphered: " + Encryptet
  Decrypted.s = DecryptString(Encryptet)
    Debug "Deciphered: " + Decrypted
    
    If Decrypted = String
    Else
      Debug "ERROR"
      Delay(5000)
      End
    EndIf
ForEver

P.S. Ich habe es auch schon mit einem Initialisierungsvektor der doppelten Größe versucht, habe dann aber hier im Bord gelesen das man immer einen 16 Bit größen braucht.
"Bildung kommt vom Bildschirm und nicht vom Buch, sonst hieße es ja Buchung."
Dieter Hildebrandt
"Bildung ist Das, was übrig bleibt, wenn man alles was man in der Schule gelernt hat, vergisst. "
Albert Einstein
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: AES-Crypter Finde den Fehler nicht

Beitrag von STARGÅTE »

Es ist immer wieder der selbe Fehler:

Man darf keine Strings mit AES codieren, weil dabei u.u. ein NUL-Character erzeugt wird, welcher den String unwiederruflich abschneidet und damit Information verloren geht.

Du kannst immer nur mit Memorys arbeiten!
Sowas wie: DecryptString(EncryptString(String)) funktioniert nicht im AES.

EDIT: Strings codieren geht schon, aber man darf den erzeugten Code nicht mit PeekS() als String lesen, weils kein String ist!
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
Sauer-RAM
Beiträge: 326
Registriert: 13.04.2009 16:22
Computerausstattung: Lenovo ThinkPad X230t Convertible
Wohnort: Haslach i. K.

Re: AES-Crypter Finde den Fehler nicht

Beitrag von Sauer-RAM »

Also gibt es keine Möglichkeit, den verschlüsselten Speicherbereich in einen String umzuwandeln?
"Bildung kommt vom Bildschirm und nicht vom Buch, sonst hieße es ja Buchung."
Dieter Hildebrandt
"Bildung ist Das, was übrig bleibt, wenn man alles was man in der Schule gelernt hat, vergisst. "
Albert Einstein
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: AES-Crypter Finde den Fehler nicht

Beitrag von STARGÅTE »

Nicht eins zu eins.

Es gibt nur Möglichkeiten wie:
  • Den verschlüsselten Speicherblock als Hex-String ausgeben
  • Den Speicherblock mit Base64Encoder transformieren
  • Ein Maskierungszeichen einführen (zB "\") und dann NUL und \ selbst maskieren in \0 und \\ zum Beispiel.
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
Sauer-RAM
Beiträge: 326
Registriert: 13.04.2009 16:22
Computerausstattung: Lenovo ThinkPad X230t Convertible
Wohnort: Haslach i. K.

Re: AES-Crypter Finde den Fehler nicht

Beitrag von Sauer-RAM »

Ok vielen Dank für die Vorschläge... Ich habe es mal mit dem Bas64-Lösungsvorschlag versucht.
Es funktioniert leider immer noch nicht... Fällt die hier auf den ersten Blick auch etwas auf?

Code: Alles auswählen

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

  
Procedure.s EncryptString(StringtoEncryptraw.s)
  *StringtoEncrypt = AllocateMemory(Len(StringtoEncryptraw)*1.35)
  Base64Encoder(@StringtoEncryptraw,Len(StringtoEncryptraw),*StringtoEncrypt, MemorySize(*StringtoEncrypt))
    *CipheredString   = AllocateMemory(MemorySize(*StringtoEncrypt)+1) ; Platz für den null-terminierten String
  If AESEncoder(@StringtoEncrypt, *CipheredString, Len(StringtoEncryptraw), ?Key, 256, ?InitializationVector)
  Else
    Debug "ERROR WHILE ENCRYPTING"
  EndIf
  
  Ausgabe.s = PeekS(*CipheredString)
  FreeMemory(*CipheredString)
  Ausgabe = Str(MemorySize(*StringtoEncrypt)) + "?" + Ausgabe
  ProcedureReturn Ausgabe
EndProcedure

Procedure.s DecryptString(StringtoDecrypt.s)
  Groesse = Val(Left(StringtoDecrypt,FindString(StringtoDecrypt,"?")))
  StringtoDecrypt = Mid(StringtoDecrypt,FindString(StringtoDecrypt,"?") + 1)
  Debug StringtoDecrypt
    *DecipheredString = AllocateMemory(Groesse + 1) ; mit seiner abschließenden Null (ASCII-Modus)
  If AESDecoder(@StringtoDecrypt, *DecipheredString, Groesse, ?Key, 256, ?InitializationVector)
  Else
    Debug "ERROR WHILE DECRYPTING"
  EndIf

  *Ausgabe = AllocateMemory(MemorySize(*DecipheredString) * 1.2)
  Base64Decoder(*DecipheredString,MemorySize(*DecipheredString),*Ausgabe,MemorySize(*Ausgabe))
  FreeMemory(*DecipheredString)  
  ProcedureReturn PeekS(*Ausgabe)
EndProcedure

Repeat
  String.s = ""
  For n = 0 To 16 + Random(400)
    String.s = String.s + Chr(1 + Random(254))
  Next
  
  Encryptet.s = EncryptString(String)
  Debug "Ciphered: " + Encryptet
  Decrypted.s = DecryptString(Encryptet)
    Debug "Deciphered: " + Decrypted
    
    If Decrypted = String
    Else
      Debug "ERROR"
      Delay(5000)
      End
    EndIf
ForEver

"Bildung kommt vom Bildschirm und nicht vom Buch, sonst hieße es ja Buchung."
Dieter Hildebrandt
"Bildung ist Das, was übrig bleibt, wenn man alles was man in der Schule gelernt hat, vergisst. "
Albert Einstein
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: AES-Crypter Finde den Fehler nicht

Beitrag von STARGÅTE »

EncryptString() braucht den Base64Encoder bevor du einen codierten String zurück gibts.

DecryptString() braucht dann dementsprechent zuerst einen Base64Decoder, und dann den AES, der dann theoretisch wieder einenen echten String erzeugen kann.
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