AES/CFB8

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
R4z0r1989
Beiträge: 521
Registriert: 12.06.2005 18:06
Kontaktdaten:

AES/CFB8

Beitrag von R4z0r1989 »

Hallo liebe Community,

ich habe entweder ein Problem das meine Fähigkeiten übersteigt,
oder aber mir muss wer das brett vorm Kopf mal runternehmen.

Und zwar weiß ich wie man mit AES ver- und entschlüsselt aber ich bräuchte(auch wenn ichs lieber vermeiden würde),
die möglichkeit das ganze mit CFB8 zu erledigen.

Kurz und knapp: Ist es ohne größeren Aufwand möglich oder muss ich das von Grund auf neu schreiben?
Hoffe es war verständlich.

Schon mal Danke für jede Antwort eurerseits.

MFG R4z0r1989
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: AES/CFB8

Beitrag von cxAlex »

Zumindest mit den PB - AES Funktionen wirst du wohl nicht weiterkommen, diese unterstützen nur die Modi CBC und EBC. CFB, obwohl sehr ähnlich CBC würde die Verwendung als Strom - Verschlüsselung erlauben, ist aber leider nicht implementiert. Eventuell ein Feature - Request im englischen Forum?

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
Christian+
Beiträge: 213
Registriert: 13.07.2008 10:05
Computerausstattung: Windows 8.1 Pro
AMD Phenom II X4 955 @ 3.2 GHz
4GB RAM
NVIDIA GeForce GTX 660

Re: AES/CFB8

Beitrag von Christian+ »

Nun ja du musst dir den CFB Modus wohl selber bauen den gibt es in PureBasic nicht aber du sollest dabei auf den AES ECB Modus von PureBasic zurückgreifen können damit sollte das dann relativ einfach gehen. Du musst dann ja nur noch die Stromverschlüsselung basierend auf der vorhanden Blockverschlüsselung umsetzen.

Edit1:
So ich habe mich mal an meine Kryptographie Vorlesung zurück erinnert und etwas herumprobiert so sollte das gehen, hoffe das hilft dir weiter:
Edit2: Code entfernt da nun eine bessere Variante existiert
Zuletzt geändert von Christian+ am 14.03.2013 11:19, insgesamt 1-mal geändert.
Windows 8.1 Pro 64Bit | AMD Phenom II X4 955 @ 3.2 GHz | 4GB RAM | NVIDIA GeForce GTX 660
Christian+
Beiträge: 213
Registriert: 13.07.2008 10:05
Computerausstattung: Windows 8.1 Pro
AMD Phenom II X4 955 @ 3.2 GHz
4GB RAM
NVIDIA GeForce GTX 660

Re: AES/CFB8

Beitrag von Christian+ »

So ich hab mal meinen Code für eine AES Verschlüsselung im CFB8 Modus noch ein wenig optimiert falls ihn mal noch jemand anders braucht.

Code: Alles auswählen

EnableExplicit

Structure CFB8Data
  *IV
  *EncodedIV.Ascii
  Cipher.i
EndStructure

Procedure.i StartAESCFB8Cipher(*Key, *IV = 0, Bits.i = 256)
  Protected *Cipher.CFB8Data = AllocateMemory(SizeOf(CFB8Data))
  *Cipher\IV = AllocateMemory(16)
  *Cipher\EncodedIV = AllocateMemory(16)
  *Cipher\Cipher = StartAESCipher(#PB_Any, *Key, Bits, *Cipher\IV, #PB_Cipher_Encode | #PB_Cipher_ECB)
  If *IV > 0 : CopyMemory(*IV, *Cipher\IV, 16) : Else : RandomData(*Cipher\IV, 16) : EndIf
  ProcedureReturn *Cipher
EndProcedure

Procedure AddAESCFB8CipherBuffer(*Cipher.CFB8Data, *InputMemory.Ascii, *OutputMemory.Ascii, Size.i, Mode.i = #PB_Cipher_Encode)
  Protected Max.i = *InputMemory + Size
  While *InputMemory < Max
    AddCipherBuffer(*Cipher\Cipher, *Cipher\IV, *Cipher\EncodedIV, 16)
    *OutputMemory\a = *InputMemory\a ! *Cipher\EncodedIV\a
    MoveMemory(*Cipher\IV+1, *Cipher\IV, 15)
    If Mode = #PB_Cipher_Decode : PokeA(*Cipher\IV+15, *InputMemory\a) : Else : PokeA(*Cipher\IV+15, *OutputMemory\a) : EndIf
    *InputMemory+1
    *OutputMemory+1
  Wend
EndProcedure

Procedure FinishAESCFB8Cipher(*Cipher.CFB8Data)
  FinishCipher(*Cipher\Cipher)
  FreeMemory(*Cipher\IV)
  FreeMemory(*Cipher\EncodedIV)
  FreeMemory(*Cipher)
EndProcedure

;Beispiel

Define *Key, *IV, String.s, AESCFB8Cipher.i, *Memory, *EncodedMemory, *DecodedMemory

*Key = AllocateMemory(32) : RandomData(*Key, 32)

*IV = AllocateMemory(16) : RandomData(*Key, 16)

String.s = "Hallo Welt! Dies ist ein Beispiel ;-)" + "Hallo Welt! Dies ist ein Beispiel ;-)" + "Hallo Welt! Dies ist ein Beispiel ;-)" + "Hallo Welt! Dies ist ein Beispiel ;-)" + "Hallo Welt! Dies ist ein Beispiel ;-)"

*Memory = AllocateMemory(StringByteLength(String, #PB_Ascii) + 1)
PokeS(*Memory, String, -1, #PB_Ascii)
Debug PeekS(*Memory, -1, #PB_Ascii)

AESCFB8Cipher = StartAESCFB8Cipher(*Key, *IV, 256)
*EncodedMemory = AllocateMemory(MemorySize(*Memory))
AddAESCFB8CipherBuffer(AESCFB8Cipher, *Memory, *EncodedMemory, MemorySize(*Memory), #PB_Cipher_Encode)
FinishAESCFB8Cipher(AESCFB8Cipher)
Debug PeekS(*EncodedMemory, -1, #PB_Ascii)

AESCFB8Cipher = StartAESCFB8Cipher(*Key, *IV, 256)
*DecodedMemory = AllocateMemory(MemorySize(*EncodedMemory))
AddAESCFB8CipherBuffer(AESCFB8Cipher, *EncodedMemory, *DecodedMemory, MemorySize(*EncodedMemory), #PB_Cipher_Decode)
FinishAESCFB8Cipher(AESCFB8Cipher)
Debug PeekS(*DecodedMemory, -1, #PB_Ascii)

FreeMemory(*Memory)
FreeMemory(*EncodedMemory)
FreeMemory(*DecodedMemory)

FreeMemory(*Key)
FreeMemory(*IV)
Windows 8.1 Pro 64Bit | AMD Phenom II X4 955 @ 3.2 GHz | 4GB RAM | NVIDIA GeForce GTX 660
Antworten