Seite 1 von 3

Problem bei AES-Verschlüsselung

Verfasst: 13.04.2011 19:29
von Sunny
Ich habe mir mal 2 Codes zurechtgebastelt die beide ziemlich ähnlich sind. Beim 2. Code kommt nur noch eine kleinigkeit dazu. Erstmal kommen die Codes und dann mein Problem :)

Code: Alles auswählen

Procedure.s EnAES(String$)
  While Len(String$) < 16
    String$+Chr(10)
  Wend

  *CipheredString   = AllocateMemory(Len(String$)+1)
  
  If AESEncoder(@String$, *CipheredString, Len(String$), ?Key, 256, ?Init)
    Output$ = PeekS(*CipheredString)
  EndIf
  
  ProcedureReturn Output$
EndProcedure

Procedure.s DeAES(String$)
  *DecipheredString = AllocateMemory(Len(String$)+1)
  
  If AESDecoder(@String$, *DecipheredString, Len(String$), ?Key, 256, ?Init)
    Output$ = PeekS(*DecipheredString)
  EndIf
  
  While Right(Output$,1) = Chr(10)
    Output$ = Left(Output$,Len(Output$)-1)
  Wend
  
  ProcedureReturn Output$
EndProcedure

Debug EnAES("kleiner Text")
Debug DeAES(EnAES("kleiner Text"))

DataSection
  Key:
    Data.b $06, $a9, $21, $40, $36, $b8, $a1, $5b, $51, $2e, $03, $d5, $34, $12, $00, $06

  Init:
    Data.b $3d, $af, $ba, $42, $9d, $9e, $b4, $30, $b4, $22, $da, $80, $2c, $9f, $ac, $41
EndDataSection
Dieser Code Funktioniert einwandfrei aber jetzt kommt der andere Code:

Code: Alles auswählen

Procedure.s EnAES(String$)
  While Len(String$) < 16
    String$+Chr(10)
  Wend

  *CipheredString   = AllocateMemory(Len(String$)+1)
  
  If AESEncoder(@String$, *CipheredString, Len(String$), ?Key, 256, ?Init)
    AESCode$ = PeekS(*CipheredString)
  EndIf
  
  For n = 1 To Len(AESCode$)
    Output$ + Str(Asc(Mid(AESCode$,n,1))) + " "
  Next
  
  ProcedureReturn Output$
EndProcedure

Procedure.s DeAES(String$)
  For n = 1 To CountString(String$," ")
    ToDecode$ + Chr(Val(StringField(String$,n," ")))
  Next
  
  *DecipheredString = AllocateMemory(Len(ToDecode$)+1)
  
  If AESDecoder(@String$, *DecipheredString, Len(ToDecode$), ?Key, 256, ?Init)
    Output$ = PeekS(*DecipheredString)
  EndIf
  
  While Right(Output$,1) = Chr(10)
    Output$ = Left(Output$,Len(Output$)-1)
  Wend
  
  ProcedureReturn Output$
EndProcedure

Debug EnAES("kleiner Text")
Debug DeAES(EnAES("kleiner Text"))

DataSection
  Key:
    Data.b $06, $a9, $21, $40, $36, $b8, $a1, $5b, $51, $2e, $03, $d5, $34, $12, $00, $06

  Init:
    Data.b $3d, $af, $ba, $42, $9d, $9e, $b4, $30, $b4, $22, $da, $80, $2c, $9f, $ac, $41
EndDataSection
Hier wird beim Decodieren ein falscher Wert zurückgegeben, wobei ich keine Ahnung hab wieso...
Liegt vieleicht an meinem fehlenden Verständniss für die Funktionsweise von AES.

Ich hab schon ein bischen was nachgeprüft und in der Prozedur "DeAES" entspricht der String in "ToDecode$" dem selben wie "AESCode$" in der Prozedur "EnAES" also warum wird beim Decodieren im 1. Code der richtige String zurückgegeben, beim 2. allerdings nicht?

Re: Problem bei AES-Verschlüsselung

Verfasst: 13.04.2011 19:38
von STARGÅTE
Folgende Hinweise:
  1. AllocateMemory(Len(String$)+1)
    ist schlecht, weil es dnan unter UNICODE nicht mehr funktioniert, hier lieber StringBytesLength nutzen und + SizeOf(Character)
  2. beim DeAEC schreibt du dein ToDecode$ string überhaupt nicht in die Funktion AESDecoder, dort steht im 2. COde immer noch @String$, statt @ToDecode$
  3. AESCode$ = PeekS(*CipheredString)
    Den Codierten Speicher als String zurückzu geben ist schlecht!
    weil du dort NULL drin haben kannst, und der String dann ändet.
    Lese die Chars lieber direkt aus dem Buffer
EDIT: Hier mal der der bessere Code.

Code: Alles auswählen

Procedure.s EnAES(String$)
  While Len(String$) < 16
    String$+Chr(10)
  Wend

  *CipheredString   = AllocateMemory(StringByteLength(String$)+SizeOf(Character))
  
  If AESEncoder(@String$, *CipheredString, Len(String$), ?Key, 256, ?Init)
    AESCode$ = PeekS(*CipheredString)
  EndIf
  
  For n = 0 To Len(AESCode$)-1
    Output$ + Str(PeekC(@AESCode$+n*SizeOf(Character))) + " "
  Next
  
  FreeMemory(*CipheredString)
  
  ProcedureReturn Output$
EndProcedure

Procedure.s DeAES(String$)
  *Buffer = AllocateMemory(CountString(String$," ")*SizeOf(Character))
  For n = 0 To CountString(String$," ")-1
    PokeC(*Buffer+n, Val(StringField(String$, n+1, " ")))
  Next
  
  *DecipheredString = AllocateMemory(StringByteLength(String$)+SizeOf(Character))
  
  If AESDecoder(*Buffer, *DecipheredString, MemorySize(*Buffer), ?Key, 256, ?Init)
    Output$ = PeekS(*DecipheredString)
  EndIf
  
  While Right(Output$,1) = Chr(10)
    Output$ = Left(Output$,Len(Output$)-1)
  Wend
  
  FreeMemory(*DecipheredString)
 
  FreeMemory(*Buffer)
 
  ProcedureReturn Output$
EndProcedure

Debug EnAES("kleiner Text")
Debug DeAES(EnAES("kleiner Text"))

DataSection
  Key:
    Data.b $06, $a9, $21, $40, $36, $b8, $a1, $5b, $51, $2e, $03, $d5, $34, $12, $00, $06

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

Re: Problem bei AES-Verschlüsselung

Verfasst: 13.04.2011 19:47
von Sunny
Ah...
der 2. Punkt war der Grund warum es nicht so funktioniert hat, wie ich wollte... (sowas passiert wenn man zu leichtfertig mit Kopieren und Einfügen arbeitet ^^)

Deine anderen beiden Hinweise werde ich auch beherzigen.
Dankeschön.

Re: [gelöst] Problem bei AES-Verschlüsselung

Verfasst: 13.04.2011 19:57
von STARGÅTE
>>"Deine anderen beiden Hinweise werde ich auch beherzigen."

Gut, denn eine NULL taucht in Binärcode zu 0,4% auf ^^
ich sehe immer wieder Codes, wo Strings als Buffer verwendet werden, was extrem gefählich ist, und BUGs ohne ende produzieren kann.

Das heißt immer mit echten Buffern arbeiten.
Und wenn du doch einen String am Ende haben willst, kannst du Base64Encoder nutzen, der bläht die Codierung nicht so stark auf. (aber auch dort bitte erst ein Buffer schreiben lassen und dann erst mit PeekS zurückgeben, weil die Codierung bei Base64 immer lesbare Zeichen enthält)

Re: Problem bei AES-Verschlüsselung

Verfasst: 13.04.2011 20:27
von Sunny
Es hat sich doch noch ein Problem aufgetan...
Ich hab jetzt mal dein Programm nahezu Kopiert.
Nur den String, der durch die Prozeduren gejagt werden soll habe ich geändert und wenn du das jetzt mal Kompilierst, dann wirst du sicherlich auch feststellen, dass da irgendwas nicht hinhaut.

Code: Alles auswählen

Procedure.s EnAES(String$)
  While Len(String$) < 16
    String$+Chr(10)
  Wend

  *CipheredString   = AllocateMemory(StringByteLength(String$)+SizeOf(Character))
 
  If AESEncoder(@String$, *CipheredString, Len(String$), ?Key, 256, ?Init)
    AESCode$ = PeekS(*CipheredString)
  EndIf
 
  For n = 0 To Len(AESCode$)-1
    Output$ + Str(PeekC(@AESCode$+n*SizeOf(Character))) + " "
  Next
 
  FreeMemory(*CipheredString)
 
  ProcedureReturn Output$
EndProcedure

Procedure.s DeAES(String$)
  *Buffer = AllocateMemory(CountString(String$," ")*SizeOf(Character))
  For n = 0 To CountString(String$," ")-1
    PokeC(*Buffer+n, Val(StringField(String$, n+1, " ")))
  Next
 
  *DecipheredString = AllocateMemory(StringByteLength(String$)+SizeOf(Character))
 
  If AESDecoder(*Buffer, *DecipheredString, MemorySize(*Buffer), ?Key, 256, ?Init)
    Output$ = PeekS(*DecipheredString)
  EndIf
 
  While Right(Output$,1) = Chr(10)
    Output$ = Left(Output$,Len(Output$)-1)
  Wend
 
  FreeMemory(*DecipheredString)

  FreeMemory(*Buffer)

  ProcedureReturn Output$
EndProcedure

String$ = "Kleines Problem mit manchen Texten. Woran könnte das liegen!? Würde mich gerne interessieren."

Debug EnAES(String$)
Debug DeAES(EnAES(String$))

DataSection
  Key:
    Data.b $06, $a9, $21, $40, $36, $b8, $a1, $5b, $51, $2e, $03, $d5, $34, $12, $00, $06

  Init:
    Data.b $3d, $af, $ba, $42, $9d, $9e, $b4, $30, $b4, $22, $da, $80, $2c, $9f, $ac, $41
EndDataSection 
Edit:
Weiß zufällig jemand, wie man mit PB eine PGP-Ver- und Entschlüsselung realisiert?

Re: Problem bei AES-Verschlüsselung

Verfasst: 13.04.2011 20:39
von STARGÅTE
Jo, da war noch n NULL-Falle drin beim encoden.

Nun sollte es gehen, ist gleich noch n verbesserte Version:

Code: Alles auswählen

Procedure.s EnAES(String$)
  
  Protected *CipheredString
  
  While Len(String$) < 16
    String$+Chr(10)
  Wend

  *CipheredString   = AllocateMemory(StringByteLength(String$))

  If AESEncoder(@String$, *CipheredString, StringByteLength(String$), ?Key, 256, ?Init)
    For n = 0 To Len(String$)-1
      Output$ + Str(PeekC(*CipheredString+n*SizeOf(Character))) + " "
    Next
  EndIf

  FreeMemory(*CipheredString)

  ProcedureReturn Output$
  
EndProcedure

Procedure.s DeAES(String$)
  
  Protected *Buffer = AllocateMemory(CountString(String$," ")*SizeOf(Character))
  Protected *DecipheredString = AllocateMemory(CountString(String$," ")*SizeOf(Character))
  
  For n = 0 To CountString(String$," ")-1
    PokeC(*Buffer+n, Val(StringField(String$, n+1, " ")))
  Next

  If AESDecoder(*Buffer, *DecipheredString, MemorySize(*Buffer), ?Key, 256, ?Init)
    Output$ = RTrim(PeekS(*DecipheredString, CountString(String$," ")), Chr(10))
  EndIf

  FreeMemory(*DecipheredString)
  FreeMemory(*Buffer)

  ProcedureReturn Output$
EndProcedure

String$ = "Kleines Problem mit manchen Texten. Woran könnte das liegen!? Würde mich gerne interessieren."

Debug EnAES(String$)
Debug DeAES(EnAES(String$))

DataSection
  Key:
    Data.b $06, $a9, $21, $40, $36, $b8, $a1, $5b, $51, $2e, $03, $d5, $34, $12, $00, $06

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

Re: Problem bei AES-Verschlüsselung

Verfasst: 13.04.2011 20:43
von Sunny
Ahhhhhh....
Ja herrlich jetz seh ich das auch.
Immer diese versteckten fehler^^

Um nochmal auf meine andere Frage zurück zu kommen...
Ist es in PB überhaupt realisierbar eine PGP-Verschlüsselung einzubauen?

Re: Problem bei AES-Verschlüsselung

Verfasst: 17.04.2011 20:12
von pureanfänger
@ STARGÅTE

Cool das dein Code so gut funktioniert.

Ich habe durch Zufall heute auch an diesem Thema gesessen und bekomm dabei nur Komische Ergebnisse.

Könntest du mir die Folgenden Stellen in deinem Code näher erklären, ich kopiere ungern einen Code in eines meiner Projekte ohne ihn zu verstehen ;)

Beim Encoder: (Warum gibst du den Output in dieser Form aus, hat das eine bestimmte Bedeutung ?)

Code: Alles auswählen

If AESEncoder(@String$, *CipheredString, StringByteLength(String$), ?Key, 256, ?Init)
    For n = 0 To Len(String$)-1
      Output$ + Str(PeekC(*CipheredString+n*SizeOf(Character))) + " "
    Next
  EndIf
Beim Decoder: (Wofür benötigst du diesen Buffer bzw. wofür das CountString ?)

Code: Alles auswählen

Protected *Buffer = AllocateMemory(CountString(String$," ")*SizeOf(Character))
Hier mein Code der bei größeren Strings nicht funktioniert und bestimmt auch noch mehrere Fehler hat

Code: Alles auswählen

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

Procedure.s AES_Encode(String.s)
 
  While Len(String.s) < 16
    
    String.s + Chr(10)
    
  Wend
   
  Protected *EncodeBuffer = AllocateMemory(StringByteLength(String.s))
  
  If AESEncoder(@String.s, *EncodeBuffer, StringByteLength(String.s), ?Key, 128, ?InitializationVector)
    
    ProcedureReturn PeekS(*EncodeBuffer)
    
    FreeMemory(*EncodeBuffer)
    
  EndIf  
  
EndProcedure

Procedure.s AES_Decode(String.s)

  Protected *DecodeBuffer = AllocateMemory(StringByteLength(String$) + SizeOf(Character))
  
  If AESDecoder(@String.s, *DecodeBuffer, StringByteLength(String.s), ?Key, 128, ?InitializationVector)
    
    Output.s = RTrim(PeekS(*DecodeBuffer), Chr(10))
    
    FreeMemory(*DecodeBuffer)
    
    ProcedureReturn Output.s    
    
  EndIf
  
EndProcedure

String.s = "Test"


Debug AES_Encode(String.s)
Debug AES_Decode(AES_Encode(String.s))

Re: Problem bei AES-Verschlüsselung

Verfasst: 17.04.2011 20:26
von STARGÅTE
@pureanfänger

Code: Alles auswählen

If AESEncoder(@String.s, *EncodeBuffer, StringByteLength(String.s), ?Key, 128, ?InitializationVector)
  ProcedureReturn PeekS(*EncodeBuffer)
  FreeMemory(*EncodeBuffer)
EndIf
ist ganz einfach Falsch!

Wie ich schon weiter vorne Erklärt habe, ist AES ein Binär-Codierer, dass heißt, das die Codierung kein String ist!!
Du darfst ihn also auch nicht einfach als String zurück geben!

Darum macht Sunny (war nicht mein Code) auch diesen "Umweg" die Binärdaten in Text umzuwandeln.
Entweder durch eine Zahlenkette der Zeichen, oder wie ich schon schrieb durch Base64...

Man sollte sich wirklich angewöhnen, Memory-Buffer zu nutzen, wenn sie auch erforderlich sind, auch wenn Strings "einfachere" Abkürzungen sind, machen sie nur Probleme!

Re: Problem bei AES-Verschlüsselung

Verfasst: 18.04.2011 00:29
von pureanfänger
Ah danke, jetzt macht das schon alles mehr einen Sinn... <)