Seite 1 von 1

AES InitialisierungsVektor

Verfasst: 04.08.2010 11:34
von Christian+
In der der Pure Basic Hilfe steht:
'*InitialisierungsVektor' ist ein zufälliger Datenblock, welcher für das Initialisieren der Verschlüsselung verwendet wird, um ein Knacken beim Dekodieren zu verhindern (wird nur bei Verwendung des #PB_Cipher_CBC Modus benötigt). Seine Größe hängt vom Parameter 'Bits' ab: 16 Bytes für 128 Bit-Verschlüsselung, 24 Bytes für 196 Bit und 32 Bytes für 256 Bit.
Allerdings dachte ich bei AES sei dieser immer 16 Byte und ich konnte auch nicht feststellen das mehr genutzt wird habe ich da jetzt irgendeinen Denkfehler oder stimmt die Hilfe nicht?
mfg Christian+

Re: AES InitialisierungsVektor

Verfasst: 22.08.2010 20:24
von Christian+
Scheint ja keiner was dazu zu wissen war meine Formulierung des Problems so schlecht oder hat sich damit noch keiner beschäftigt ich denke ja mal nicht das ich der einzige bin der die AES Befehle verwendet. Um das jetzt noch mal aufzugreifen die Hilfe besagt ja wie schon geschrieben folgendes:
'*InitialisierungsVektor' ist ein zufälliger Datenblock, welcher für das Initialisieren der Verschlüsselung verwendet wird, um ein Knacken beim Dekodieren zu verhindern (wird nur bei Verwendung des #PB_Cipher_CBC Modus benötigt). Seine Größe hängt vom Parameter 'Bits' ab: 16 Bytes für 128 Bit-Verschlüsselung, 24 Bytes für 196 Bit und 32 Bytes für 256 Bit.
Da zumindest meinen Information nach AES normal immer eine Blocklänge von 128 Bit hat und damit einen InitialisierungsVektor von 16 Byte verwendet wofür auch spricht dass die Daten zum verschlüsseln mindestens 16 Byte also 128 Bit haben müssen habe ich das mit den verschiedenen Längen des InitialisierungsVektor jetzt noch mal getestet.
Der InitialisierungsVektor dient ja dazu dass die verschlüsselten Daten selbst bei gleichem Passwort immer anders sind. Folgender Quellcode erstellt nun drei Speicherbereiche 16, 24, 32 Byte groß die die entsprechende Anzahl Bytes des InitialisierungsVektor enthalten und zeigt an was das Ergebnis ist wenn er zum Verschlüsseln von Daten bei einer Schlüssellänge von 256 Bit also 32 Byte verwendet wird da Pure Basic für Schlüssellänge und InitialisierungsVektor laut Hilfe den gleichen Parameter 'Bits' verwendet müsste nun also auch ein 32 Byte InitialisierungsVektor genutzt werden. Wie der Quellcode zeigt ändert sich aber der verschlüsselte Datenblock nicht egal ob nur 16 Byte oder die laut Hilfe nötigen 32 Byte übergeben werden was dafür spricht das alle weiteren Bytes ab dem 16. Byte Ignoriert werden.
Kann das jemand bestätigen oder einen Fehler in dem Beispielcode finden an dem das liegt denn da ich die AES befehle in einem meiner aktuellen Projekte nutzte will ich da keinen Fehler drin haben und falls es wirklich ein Fehler in der Hilfe ist sollte er ja behoben werden um zukünftig nicht mehr andere zu irritieren.

Code: Alles auswählen

EnableExplicit

Define *IV32, *IV24, *IV16

OpenCryptRandom()

*IV32 = AllocateMemory( 32 )
*IV24 = AllocateMemory( 24 )
*IV16 = AllocateMemory( 16 )

CryptRandomData( *IV32, 32 )

CopyMemory( *IV32, *IV24, 24 )

CopyMemory( *IV32, *IV16, 16 )

CloseCryptRandom()

Define String$ = "Hello this is a test for AES"

Define Key$ = "1234"
Key$ = MD5Fingerprint( @Key$, StringByteLength( Key$ ) )

Define *SourceString = AllocateMemory( Len( String$ ) + 1 )
Define *CipheredString = AllocateMemory( Len( String$ ) + 1 )
Define *DecipheredString = AllocateMemory( Len( String$ ) + 1 )

PokeS( *SourceString, String$, Len( String$ ), #PB_Ascii )
Debug PeekS( *SourceString )

Debug "----------------"

;- IV32
Debug "IV 32 Byte"

AESEncoder( *SourceString, *CipheredString, Len( String$ ), @Key$, 256, *IV32, #PB_Cipher_CBC )
Debug "IV 32 Ciphered: "+PeekS( *CipheredString )
   
AESDecoder( *CipheredString, *DecipheredString, Len(String$), @Key$, 256, *IV32, #PB_Cipher_CBC )
Debug "IV 32 Deciphered: "+PeekS( *DecipheredString )

Debug "----------------"

;- IV24
Debug "IV 24 Byte"

AESEncoder( *SourceString, *CipheredString, Len( String$ ), @Key$, 256, *IV24, #PB_Cipher_CBC )
Debug "IV 24 Ciphered: "+PeekS( *CipheredString )
   
AESDecoder( *CipheredString, *DecipheredString, Len(String$), @Key$, 256, *IV24, #PB_Cipher_CBC )
Debug "IV 24 Deciphered: "+PeekS( *DecipheredString )

Debug "----------------"

;- IV16
Debug "IV 16 Byte"

AESEncoder( *SourceString, *CipheredString, Len( String$ ), @Key$, 256, *IV16, #PB_Cipher_CBC )
Debug "IV 16 Ciphered: "+PeekS( *CipheredString )
   
AESDecoder( *CipheredString, *DecipheredString, Len(String$), @Key$, 256, *IV16, #PB_Cipher_CBC )
Debug "IV 16 Deciphered: "+PeekS( *DecipheredString )

Debug "----------------"

Re: AES InitialisierungsVektor

Verfasst: 22.08.2010 23:59
von Vera
Hallo Christian,

ich werde Dir wohl keine Antwort geben können, da mir dies Thema ziemlich unbekannt ist.
Aber unlängst hat netmaestro zu seinem neusten Tool Windows Cryptor den SourceCode mit veröffentlicht und verwendet darin auch diese Methode. Vielleicht findest Du darin einige Antworten.

Allerdings ist mir jetzt eins aufgefallen: in der Hilfe steht doch 'wird nur bei Verwendung des #PB_Cipher_CBC Modus benötigt' und diesen Modus hast Du in deinem Beispielcode gar nicht aktiviert. Demnach gibt es auch keine Abhängigkeit vom 'Bits'-Parameter.


Gruß ~ Vera

Re: AES InitialisierungsVektor

Verfasst: 23.08.2010 08:24
von Christian+
Danke für den Link dort scheinen immer 32 Byte als InitialisierungsVektor übergeben zu werden wie in der Hilfe gefordert das hilft mir jetzt allerdings nicht viel weiter denn wenn nur 16 Byte genutzt werden ist ja egal ob 32 Byte übergeben werden.
Was das #PB_Cipher_CBC angeht das braucht man nicht anzugeben da es der Standardmodus ist habe es jetzt aber dennoch mal in meinen Quellcode übernommen damit klar ist das auch der passende Modus genutzt wird.

Re: AES InitialisierungsVektor

Verfasst: 23.08.2010 12:03
von Helle
Der Initialisierungs-Vector ist für AES immer 16 Bytes groß, da die Blockgröße ja const. 16 Bytes (128 Bits) beträgt. Er wird auf den 1.Daten-Block (eben immer 16 Bytes) angewand, da kein Vorgänger existiert. Der 2.Datenblock wird dann mit dem Ergebnis vom 1.Datenblock behandelt (bei CBC, daher "Block Chaining", Block-Verkettung). In der PB-Hilfe ist es falsch erläutert.
Gruß
Helle

Re: AES InitialisierungsVektor

Verfasst: 23.08.2010 12:47
von Christian+
@Helle
Danke dann ist mein Problem jetzt gelöst so war mein Verständnis davon bisher auch dann ist das wohl eindeutig ein Fehler der Pure Basic Hilfe.