Seite 1 von 1

AES-Crypter Finde den Fehler nicht

Verfasst: 01.07.2013 15:16
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.

Re: AES-Crypter Finde den Fehler nicht

Verfasst: 01.07.2013 15:23
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!

Re: AES-Crypter Finde den Fehler nicht

Verfasst: 01.07.2013 15:54
von Sauer-RAM
Also gibt es keine Möglichkeit, den verschlüsselten Speicherbereich in einen String umzuwandeln?

Re: AES-Crypter Finde den Fehler nicht

Verfasst: 01.07.2013 16:20
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.

Re: AES-Crypter Finde den Fehler nicht

Verfasst: 01.07.2013 16:50
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


Re: AES-Crypter Finde den Fehler nicht

Verfasst: 01.07.2013 17:18
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.