Seite 2 von 2

Re: AES Decodieren

Verfasst: 02.05.2010 15:07
von Kumpu
Version 4.41 x64
OS: Windows 7 Home Premium
Naja im Compiler ist nur die XP-Skin Unterstützung an.

Ich hab mir mal die Länge vor und nach kodieren ausgeben lassen. Die sind nicht gleich, nach dem kodieren ist der STring ein Zeichen länger :|
Hier mal meine Prozeduren:

Code: Alles auswählen

DataSection
  Vector:
    Data.b $3d, $af, $ba, $42, $9d, $9e, $b4, $30, $b4, $22, $da, $80, $2c, $9f, $ac, $41
EndDataSection
Global Character.c

Procedure.s Encode(S1$,PW$)
  *Buffer = AllocateMemory(StringByteLength(S1$) + SizeOf(Character))

  AESEncoder(@S1$,*Buffer,MemorySize(*Buffer),@PW$,128,?vector)
  
  ret$ = PeekS(*Buffer)
  FreeMemory(*Buffer)
  ProcedureReturn ret$
EndProcedure

Procedure.s Decode(S1$,PW$)
  *Buffer = AllocateMemory(StringByteLength(S1$) + SizeOf(Character))
  
  AESDecoder(@S1$,*Buffer,MemorySize(*Buffer),@PW$,128,?vector)
  
  ret$ = PeekS(*Buffer)
  FreeMemory(*Buffer)
  ProcedureReturn ret$
EndProcedure

Re: AES Decodieren

Verfasst: 02.05.2010 15:39
von ts-soft
Du mußt mit Speichern arbeiten, String können keine Nullbytes enthalten!
Hier mal ein funktionierendes Beispiel:

Code: Alles auswählen

EnableExplicit

Procedure.i Encode(Text.s, PW.s) ; Es darf kein String zurückgegeben werden, da dieser Null-Bytes Enthalten könnte!
  Static *mem ; Speicher muß nach verlassen der Procedure Erhalten bleiben!
  Protected *key = AllocateMemory(16)
  
  If *mem : FreeMemory(*mem) : EndIf
  
  If *key
    PokeS(*key, PW, 16, #PB_Ascii) ; es werden nur 16 Zeichen unterstützt
    *mem = AllocateMemory(StringByteLength(Text) + SizeOf(Character))
    If *mem
      If AESEncoder(@Text, *mem, MemorySize(*mem), *key, 128, 0, #PB_Cipher_ECB)
        FreeMemory(*key)
        ProcedureReturn *mem
      EndIf
    EndIf
  EndIf
EndProcedure

Procedure.s Decode(*mem, PW.s)
  Protected *dmem, *key = AllocateMemory(16)
  Protected result.s
  
  If *key
    PokeS(*key, PW, 16, #PB_Ascii) ; es werden nur 16 Zeichen unterstützt
    *dmem = AllocateMemory(MemorySize(*mem))
    If *dmem
      If AESDecoder(*mem, *dmem, MemorySize(*dmem), *key, 128, 0, #PB_Cipher_ECB)
        result = PeekS(*dmem)
        FreeMemory(*dmem)
        ProcedureReturn result
      EndIf
    EndIf
  EndIf
EndProcedure

Define.s Text, DecodeText, PW
Define *mem

Text = "Feel the ..Pure.. Power"
PW = "testpasswort"

*mem = Encode(Text, PW)
If *mem
  DecodeText = Decode(*mem, PW)
  Debug DecodeText
EndIf
Gruß
Thomas

Re: AES Decodieren

Verfasst: 02.05.2010 16:48
von Kumpu
Jaaa! Habs hinbekommen! :D
Weil ich den Buffer als String haben will zum Speichern habe ich die Byte-Werte in einem neuen String gespeichert und schreibe sie dann beim dekodieren in den Speicher. Das ist zwar glaube ich nicht ganz perfekt, funktioniert aber :wink:
Danke dir für die Hilfe!

Re: AES Decodieren

Verfasst: 02.05.2010 16:57
von ts-soft
Speichern solltest Du mit WriteData und nicht mit WriteString!
Es werden Speicherbereiche verschlüsselt, keine Strings! Du wirst sonst
über kurz oder lang wieder Probleme haben.

Also zur Klarstellung: Es können keine Strings verschlüsselt werden!
Es können lediglich Speicherbereiche, die Strings enthalten, verschlüsselt werden.
Diese verschlüsselten Speicherbereiche können Daten enthalten, die in Strings
verloren gehen, somit wird dann ein entschlüsseln unmöglich gemacht!

Gruß
Thomas

Re: AES Decodieren

Verfasst: 02.05.2010 19:43
von Kumpu
Ja, hab ich mir natürlich auch gedacht! :)
Ich lese die Bytewerte aus und speichere sie dann mit Str(PeekB(*Buffer+i)) ab. Ich weiß, das ist eigentlich ziemlich dämlich, aber ich kannte das entsprechende Schlüsselwort ja nicht :D
Gruß, David

Edit: War halt einfach ne Notlösung, wollte das das Ding jetzt läuft :allright: