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)