AESEncoder - CBC-Mode

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
purebas
Beiträge: 127
Registriert: 11.03.2008 23:59
Wohnort: München

AESEncoder - CBC-Mode

Beitrag von purebas »

Ich habe eine Frage zu AESEncoder() im CBC-Mode.
Dort muss ein IV angegeben werden.
Wie muss ich mit diesem IV umgehen?
Wird der IV fest vorgegeben oder muss bei jeder Verschlüsselung immer ein neuer IV gebildet werden.
Ich verstehe nicht, was der IV soll. Eine Art zweites Passwort? Wie wird der IV ausgetauscht? Muss dieser geheim bleiben?
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: AESEncoder - CBC-Mode

Beitrag von Sicro »

Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
purebas
Beiträge: 127
Registriert: 11.03.2008 23:59
Wohnort: München

Re: AESEncoder - CBC-Mode

Beitrag von purebas »

Was ich noch nicht verstehe ist, ob bei jedem Aufruf der IV neu gesetzt werden muss. So wie ich das verstehe muss man den IV nur einmal am Beginn der Verschlüsselung setzen. Wenn ich eine große Datei verschlüsseln möchte, dann generiere ich einen IV, rufe AEScoder einmal mit IV auf. Bei den nächsten Aufrufen gebe ich dann nicht mehr den IV mit. Sehe ich das richtig?

2) Wenn die zu verschlüsselnde Datei wirklich sehr groß wird und der Vorgang einige Zeit in Anspruch nimmt, sollte eine Fortschrittsanzeige angezeigt werden. In diesem Fall - so meine bisherige Idee - rufe ich AEScoder mit sagen wir mal 65k großen Stücken mehrfach auf, solange bis die gesamte Dateien durch ist. Zwischendurch rechne ich die erledigten Prozente aus und aktualisiere die Fortschrittsanzeige.

Wie benutze ich in diesem Fall AESencoder() kryptografisch korrekt? Wie benutze ich AESencoder() in einer entsprechenden Schleife?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: AESEncoder - CBC-Mode

Beitrag von NicTheQuick »

Das ist nicht korrekt. Um häppchenweise zu verschlüsseln musst du StartAESCipher(), AddCipherBuffer() und FinishCipher() benutzen.
Der IV ist der Startwert für die Verschlüsselung. Aus jedem verschlüsselten Paket (z.B. 256 Bit) wird ein neuer IV für das nächste Paket errechnet. Zum Entschlüsseln brauchst du diesen IV natürlich auch. Um den IV zu erstellen, nutzt man am besten CryptRandomData().
Bild
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: AESEncoder - CBC-Mode

Beitrag von ts-soft »

Noch ein Hinweis zur dt. Hilfe: Der IV ist immer 16 Bytes lang und nicht wie bei AESDecoder() in deutsch 16, 24 oder
32 Bytes.
Das ist Quatsch und wurde wohl von André übersehen.

Hab das glaub ich auch schon mal gemeldet, wurde wohl übersehen.
AESDecoder: *InitializationVector hat geschrieben:The InitializationVector is a random data block, used to initialize the ciphering to avoid breach in decoding (only needed when using the #PB_Cipher_CBC mode). Its size is always 16 bytes long. The contents of this data block must match the one which was used when encoding the data.
Nicht verwechseln mit dem Key! Der ist tatsächlich unterschiedlich.
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
Benutzeravatar
purebas
Beiträge: 127
Registriert: 11.03.2008 23:59
Wohnort: München

Re: AESEncoder - CBC-Mode

Beitrag von purebas »

Also:

1. Ich öffne die Datei
2. Mit CryptRandomData() den IV generieren
2. Einmal StartAESCipher(#Cipher, *Schlüssel, Bits, *IV, #PB_Cipher_CBC) aufrufen
3. Schleife mit AddCipherBuffer() bis Datei verarbeitet ist
4. FinishCipher()

Wäre dies das korrekte Schema zur Implementierung?

-

Laufen die genannten Funktionen auf allen Windows- und Linux-Systemen gleich?
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: AESEncoder - CBC-Mode

Beitrag von ts-soft »

zu 2:
Den IV in einem Extra-Code generieren und dann am besten in einer DataSection speichern.
OpenCryptRandom() und CloseCryptRandom() am Anfang und Ende nicht vergessen.

ansonsten haste es verstanden und Linux und MacOS verstehen das auch :wink:
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
Benutzeravatar
purebas
Beiträge: 127
Registriert: 11.03.2008 23:59
Wohnort: München

Re: AESEncoder - CBC-Mode

Beitrag von purebas »

ts-soft hat geschrieben:zu 2:
Den IV in einem Extra-Code generieren und dann am besten in einer DataSection speichern.
Was meinst du mit "in einem Extra-Code generieren" und was mit "in einer DataSection speichern"?
Was soll damit bezweckt werden?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: AESEncoder - CBC-Mode

Beitrag von NicTheQuick »

Den IV schreibt man einfach an den Anfang der verschlüsselten Datei. Der muss nicht geheim gehalten werden. Und am besten erstellt man für jedes Verschlüsseln einen neuen IV. Vor dem Entschlüsseln muss man den IV natürlich händisch auslesen und dann normal die restlichen Daten entschlüsseln.
Bild
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: AESEncoder - CBC-Mode

Beitrag von ts-soft »

Ein Extra Programm nutzen, um den IV zu generieren und den dann in Deinem Haupcode (sind hoffentlich 2, für Encode und
Decode) zu nutzen.

Code: Alles auswählen

OpenCryptRandom()
Define *IV = AllocateMemory(16)
CryptRandomData(*IV, 16)
CloseCryptRandom()
ShowMemoryViewer(*IV, 16)
Jetzt den angezeigten Code in DataSection, als Hex oder Byte Werte und dann per ?start übergeben.

Code: Alles auswählen

DataSection
  start:
  Data.b $FF, $AB usw.
EndDataSection
Voll funktionierenden Code bitte selber schreiben :lol:
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