AES Decodieren

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Kumpu
Beiträge: 27
Registriert: 13.06.2009 16:07
Computerausstattung: Windows 7 Home Premium 64Bit
PB V4.3
Kontaktdaten:

Re: AES Decodieren

Beitrag 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
Anfänger!
Windows 7 Home Premium 64Bit
PB V4.3
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: AES Decodieren

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Kumpu
Beiträge: 27
Registriert: 13.06.2009 16:07
Computerausstattung: Windows 7 Home Premium 64Bit
PB V4.3
Kontaktdaten:

Re: AES Decodieren

Beitrag 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!
Anfänger!
Windows 7 Home Premium 64Bit
PB V4.3
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: AES Decodieren

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Kumpu
Beiträge: 27
Registriert: 13.06.2009 16:07
Computerausstattung: Windows 7 Home Premium 64Bit
PB V4.3
Kontaktdaten:

Re: AES Decodieren

Beitrag 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:
Anfänger!
Windows 7 Home Premium 64Bit
PB V4.3
Antworten