AES Crypter [Vereinfachung]

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

AES Crypter [Vereinfachung]

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag von milan1612 »

Sehr gut, das macht es wirklich einfacher für mich :allright:
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag 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 :-)
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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..
Zuletzt geändert von cxAlex am 04.09.2009 12:27, insgesamt 1-mal geändert.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Beitrag von jojo1541 »

Danke ür den Code, ist schön anzuwenden. :)
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Little John

Beitrag 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
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag von Agent »

....verdammt....

wer lesen kann ist klar im Vorteil :freak:
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
haggi
Beiträge: 77
Registriert: 04.01.2007 21:54

Re: AES Crypter [Vereinfachung]

Beitrag 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
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 Crypter [Vereinfachung]

Beitrag 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
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
Antworten