Seite 1 von 1

AES/CFB8

Verfasst: 12.03.2013 22:32
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

Re: AES/CFB8

Verfasst: 12.03.2013 23:11
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

Re: AES/CFB8

Verfasst: 13.03.2013 09:02
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

Re: AES/CFB8

Verfasst: 14.03.2013 11:17
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)