Seite 1 von 1

AES - En/Decode... variabler Schlüssel

Verfasst: 17.07.2012 18:23
von Sunny
Ich hatte vor einer ganzen Weile mal eine Frage bezüglich der AES-Verschlüsselung hier im Forum gestellt, wobei STARGÅTE mir auch sehr geholfen hat... (nochmal dankeschön ^^)
Jetzt habe ich diesen Code nochmal aufgegriffen und etwas abgeändert und wollte mal wissen, warum das so nicht funktioniert und was ich machen muss, damit alles so klappt wie ich das will.

Hier mal der veränderte Code:

Code: Alles auswählen

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

  *CipheredString   = AllocateMemory(StringByteLength(String$))
  
  *Key = AllocateMemory(StringByteLength(Key$))
  PokeS(*Key, Key$)
  
  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$, Key$)
 
  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
  
  *Key = AllocateMemory(StringByteLength(Key$))
  PokeS(*Key, Key$)
  
  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$ = "Teststring"
Key$ = "variabler Schlüssel"

AES$ = EnAES(String$, Key$)
Plain$ = DeAES(AES$, Key$)

Debug String$
Debug AES$
Debug Plain$

DataSection
  Init:
    Data.b $3d, $af, $ba, $42, $9d, $9e, $b4, $30, $b4, $22, $da, $80, $2c, $9f, $ac, $41
EndDataSection 
Eigentlich müsste ja in der 1. und 3. Ausgabe (String$ und Plain$) das Gleiche stehen, das ist aber nicht der Fall, woran liegt das?

Edit:
Hier nochmal der Original-Code von STARGÅTE zum Verglich:

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: AES - En/Decode... variabler Schlüssel

Verfasst: 17.07.2012 23:07
von purebas
Gibt es noch ein Forum-Abschnitt für Pre-Anfänger? :-)

Nein, im Ernst. Ich denke, diese Frage passt eher zu Fortgeschrittene!

Re: AES - En/Decode... variabler Schlüssel

Verfasst: 17.07.2012 23:55
von STARGÅTE
Es funktioniert nicht, weil schon mein Beispiel falsch war ^^.
Wenn man bei den Bits in AES 256 angibt, muss der Key und die Vektor 32 Byte haben, aber in meinem Beispiel sind es nur 16 und in deinem Beispiel kommt hinzu das der String-Key zu kurz ist und deswegen hinten zufällige Zeichen stehen.

Hier mal eine neue Version:

Code: Alles auswählen

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

  *CipheredString   = AllocateMemory(StringByteLength(String$))
  
  Key$ = LSet(Key$, 32)
  
  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$, Key$)
 
  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
  
  Key$ = LSet(Key$, 32)
  
  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$ = "Teststring"
Key$ = "variabler Schlüssel"

AES$ = EnAES(String$, Key$)
Plain$ = DeAES(AES$, Key$)

Debug String$
Debug AES$
Debug Plain$

DataSection
  Init:
    Data.b $3d, $af, $ba, $42, $9d, $9e, $b4, $30, $b4, $22, $da, $80, $2c, $9f, $ac, $41
    Data.b $3d, $af, $ba, $42, $9d, $9e, $b4, $30, $b4, $22, $da, $80, $2c, $9f, $ac, $41
EndDataSection 
Die Bytes unter Init: sind frei erfunden, und müssen halt nur gleich bleiben fürs (de)codieren

Re: AES - En/Decode... variabler Schlüssel

Verfasst: 18.07.2012 07:02
von Christian+
Für das Init genügen 16 Byte da der IV nur so groß wie die Blöcke der Verschlüsslung (bei AES immer 16 Byte) sein muss.
Außerdem fehlt in der DeAES Procedure einmal ein SizeOf(Character) so dass es nicht unter Unicode läuft.
Habe den Code mal angepasst:

Code: Alles auswählen

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

  *CipheredString   = AllocateMemory(StringByteLength(String$))
 
  Key$ = LSet(Key$, 32)
 
  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$, Key$)
 
  Protected *Buffer = AllocateMemory(CountString(String$," ")*SizeOf(Character))
  Protected *DecipheredString = AllocateMemory(CountString(String$," ")*SizeOf(Character))
 
  For n = 0 To CountString(String$," ")-1
    PokeC(*Buffer+n*SizeOf(Character), Val(StringField(String$, n+1, " ")))
  Next
 
  Key$ = LSet(Key$, 32)
 
  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$ = "Teststring"
Key$ = "variabler Schlüssel"

AES$ = EnAES(String$, Key$)
Plain$ = DeAES(AES$, Key$)

Debug String$
Debug AES$
Debug Plain$

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

Re: AES - En/Decode... variabler Schlüssel

Verfasst: 18.07.2012 09:41
von STARGÅTE
dann müsste das aber in der Hilfe geändert werden:
*InitialisierungsVektor
Der InitialisierungsVektor ist ein zufälliger Datenblock, welcher für das Initialisieren der Verschlüsselung verwendet wird, um ein Knacken beim Dekodieren zu verhindern (wird nur bei Verwendung des #PB_Cipher_CBC Modus benötigt). Seine Größe hängt vom Parameter 'Bits' ab: 16 Bytes für 128 Bit-Verschlüsselung, 24 Bytes für 196 Bit und 32 Bytes für 256 Bit.

Re: AES - En/Decode... variabler Schlüssel

Verfasst: 18.07.2012 17:07
von Christian+
Ja das sollte geändert werden bringt einem so nur durcheinander.
Der IV wird nur für den ersten Block gebraucht da AES im CBC Modus immer vor dem verschlüsseln den 16 Byte Block mit dem Vorgänger 16 Byte Block oder falls es den nicht gibt eben mit dem 16 Byte IV verknüpft damit auch bei gleichem Inhalt die Blöcke verschlüsselt nicht gleich aussehen. Deswegen ist auch egal was für ein IV man nimmt nach 16 Byte ist die Entschlüsselung wieder fehlerfrei auch wenn der IV falsch war. Die 24 und 32 Byte für den IV die in der Hilfe angegeben werden sind nicht sinnvoll da dennoch nur die ersten 16 genutzt werden da der IV komplett unabhängig vom Schlüssel ist kein Plan wie da der Satz entstanden ist dass die Größe vom Parameter Bits abhängt.