Seite 1 von 2

AES Crypter [Vereinfachung]

Verfasst: 16.08.2009 12:39
von cxAlex
Servus.

Ich hab mir hier einen kleinen Aufsatz auf den PB AES Crypter geschrieben. So ist er für mich (und vielleicht auch für andere) besser/einfacher zu verwenden.

Es wurden gleich einige Abfragen eingebaut um Fehler zu vermeiden (Speicher < 16 Bytes, falsche Bitzahl, falscher Mode).

Code: Alles auswählen

; ------------------------------------------------------------------------------------
; Aufsatz für den AES - Encoder
; Author: Alexander Aigner
; PB 4.4b1 +
; ------------------------------------------------------------------------------------

; ------------------------------------------------------------------------------------
; Internal
; ------------------------------------------------------------------------------------

Structure AES_Vector
  a.a[0]
EndStructure

Structure AES_Data
  *Encoded
  *Decoded
  EncodedLenght.i
  DecodedLenght.i
  *Key
  *Vector.AES_Vector
  Mode.a
  Bits.w
  LastAction.a
EndStructure

Enumeration
  #AES_Encode
  #AES_Decode
EndEnumeration

; ------------------------------------------------------------------------------------
; Public
; ------------------------------------------------------------------------------------

; Verschlüsselungsstärken
Enumeration
  #AES_128
  #AES_256
EndEnumeration

; AES - Crypter Initialisieren
Procedure AES_Init(Key$, Seed, Mode = #PB_Cipher_CBC, Bits = #AES_256)
  Protected i, *AES.AES_Data = AllocateMemory(SizeOf(AES_Data))
  With *AES
    
    ; Vektor initialisieren
    \Vector = AllocateMemory(16)
    RandomSeed(Seed)
    For i = 1 To 15
      \Vector\a[i] = Random(255)
    Next
    
    ; Schlüssel initialisieren
    \Key = AllocateMemory(StringByteLength(Key$) + SizeOf(Character))
    PokeS(\Key, Key$)
    
    ; Mode setzen
    If Mode = #PB_Cipher_CBC
      \Mode = #PB_Cipher_CBC
    Else
      \Mode = #PB_Cipher_ECB
    EndIf
    
    ; Bits setzen
    If Bits = #AES_256
      \Bits = 256
    Else
      \Bits = 128
    EndIf
    
    ProcedureReturn *AES
  EndWith
EndProcedure

; AES - Crypter Deinitialisieren
Procedure AES_Deinit(*AES.AES_Data, FreeMem = #False)
  With *AES
    FreeMemory(\Vector)
    FreeMemory(\Key)
    If FreeMem
      If \Encoded
        FreeMemory(\Encoded)
      EndIf
      If \Decoded
        FreeMemory(\Decoded)
      EndIf
    EndIf
    FreeMemory(*AES)
  EndWith
EndProcedure

; AES - Verschlüsseln
Procedure AES_Encode(*AES.AES_Data, *Mem, MemSize)
  Protected *tMem, FreeMem
  With *AES
    If MemSize<16 ; Speicher muss mind. 16 Bytes groß sein
      *tMem = AllocateMemory(16)
      CopyMemory(*Mem, *tMem, MemSize)
      MemSize = 16
      FreeMem = #True
    Else
      *tMem = *Mem
    EndIf
    ; Verschlüsseln
    \Encoded = AllocateMemory(MemSize)
    \EncodedLenght = AESEncoder(*tMem, \Encoded, MemSize, @\Key, \Bits, \Vector, \Mode)
    If FreeMem ; Tempspeicher ev. freigeben
      FreeMemory(*tMem)
    EndIf
    \LastAction = #AES_Encode
  EndWith
EndProcedure

; AES - Entschlüsseln
Procedure AES_Decode(*AES.AES_Data, *Mem, MemSize)
  With *AES
    ; Entschlüsseln
    \Decoded = AllocateMemory(MemSize)
    \DecodedLenght = AESDecoder(*Mem, \Decoded, MemSize, @\Key, \Bits, \Vector, \Mode)
    \LastAction = #AES_Decode
  EndWith
EndProcedure

; Speicher holen
Procedure AES_GetMem(*AES.AES_Data)
  With *AES
    If \LastAction = #AES_Encode
      ProcedureReturn \Encoded
    ElseIf \LastAction = #AES_Decode
      ProcedureReturn \Decoded
    EndIf
  EndWith
EndProcedure

; Speichergröße holen
Procedure AES_GetMemSize(*AES.AES_Data)
  With *AES
    If \LastAction = #AES_Encode
      ProcedureReturn \EncodedLenght
    ElseIf \LastAction = #AES_Decode
      ProcedureReturn \DecodedLenght
    EndIf
  EndWith
EndProcedure





; Test

Define myAES, Text$

Text$ = "Hallo Welt"


; Initialisieren
myAES = AES_Init("geheim", 666)

; Verschlüsseln
AES_Encode(myAES, @Text$, Len(Text$))

; Verschlüsselte Daten:
Debug PeekS(AES_GetMem(myAES))

; Entschlüsseln:
AES_Decode(myAES, AES_GetMem(myAES), AES_GetMemSize(myAES))

; Entschlüsselte Daten:
Debug PeekS(AES_GetMem(myAES))

; Deinitialisieren:
AES_Deinit(myAES, #True)
Gruß, Alex

Verfasst: 16.08.2009 13:09
von milan1612
Sehr gut, das macht es wirklich einfacher für mich :allright:

Verfasst: 04.09.2009 00:18
von Agent
Nabend.

Bin gerade auf den Code gestoßen. Beim Ausführen kommt der Fehler

Code: Alles auswählen

Zeile 12: Struktur nicht gefunden: a
PB 4.31.

Ansonsten: Genau das was ich suche! Einfach und gut :-)

Verfasst: 04.09.2009 03:43
von STARGÅTE
Nun schreibst du schon deine Version mit ein deinen Beitrag und dann siehst du das im code nicht ?

Code: Alles auswählen

; ------------------------------------------------------------------------------------ 
; Aufsatz für den AES - Encoder 
; Author: Alexander Aigner 
; PB 4.4b1 + 
; ------------------------------------------------------------------------------------
.a ist neu in 4.4

Verfasst: 04.09.2009 09:41
von cxAlex
Und wo ist das Problem? Da steht doch das man mindestens PB 4.4b1 braucht?

//Edit: Ah, hab den Post vor Stargate nicht gesehen. Sry, dann ist das hinfällig..

Verfasst: 04.09.2009 12:19
von jojo1541
Danke ür den Code, ist schön anzuwenden. :)

Verfasst: 04.09.2009 12:40
von Little John
Ich habe mir das jetzt nicht im Einzelnen angesehen. Aber wenn die Benutzung von AES in PB so komplziert ist, sollte das wohl auch noch in PB selbst vereinfacht werden.

Gruß, Little John

Verfasst: 05.09.2009 15:47
von Agent
....verdammt....

wer lesen kann ist klar im Vorteil :freak:

Re: AES Crypter [Vereinfachung]

Verfasst: 19.10.2009 03:10
von haggi
Hallo,

erst mal danke für deinen Code!

ich habe aber nun das Problem, dass ich es nicht in einer datei speichern und abrufen kann. der code wird teilweise falsch geladen aus der datei (da er nen absatz interpretiert) oder den code nicht mehr sauber rekonstruiert.


ich hoffe ihr könnt mir da n bisschen helfen


gruß

haggi

Re: AES Crypter [Vereinfachung]

Verfasst: 31.07.2011 21:02
von ts-soft
:allright: Schöner Code, aber mit einem Schönheitsfehler:

Wenn ich mehrere Dateien mit dem selben Schlüssel hintereinander ver- oder entschlüsseln möchte, dann möchte
ich ja nicht jedes mal AES_Deinit() und AES_Init() ausführen. Der Encoder oder Decoder sollte also, vor dem
Allokieren des neuen Speichers, den alten erstmal freigeben.

Gruß
Thomas