2016-04-09 4 views
1

Ich benutze bouncy castle library für die Verschlüsselung und Entschlüsselung in C# und ich fragte mich, wie man mit Klartext kleiner als Blockgröße umgehen?Wie behandelt AES/GCM Daten, die kleiner als die Blockgröße sind?

hier ist das, was ich bisher getan haben:

AesFastEngine engine = new AesFastEngine(); 
GcmBlockCipher cipher = new GcmBlockCipher(engine); 
AeadParameters param = new AeadParameters(new KeyParameters(key), 128, iv, null); 
cipher.Init(true, parameters); 

byte[] encData = new byte[plain.Length]; 
cipher.ProcessBytes(plain, 0, plain.Length, encData, 0); 

wenn kleiner als Blockgröße die Klardaten ist es nichts tut.

+3

Sie müssen 'doFinal (..)' auf dem letzten von Ihnen verarbeiteten Datenblock aufrufen. – Robert

+0

AES/GCM benötigt keine Auffüllung, es verwendet CTR (Zähler) -Modus. Wie @Robert sagt, müssen Sie 'doFinal()' aufrufen, um das auth-Tag zu erzeugen. – zaph

Antwort

0

Leider sind die Hüpfburg und Oracle/Java-Implementierungen nicht online. Das heißt, die Online-Eigenschaften der zugrunde liegenden CTR-Modus-Verschlüsselung werden nicht beibehalten. Online bedeutet in diesem Zusammenhang, dass Bytes bei ihrer Ankunft direkt verschlüsselt/entschlüsselt werden. Dies hat möglicherweise damit zu tun, wie die Verschlüsselung gehandhabt wird und wie die Authentifizierungs-Tags gehandhabt werden.

AES-CTR kann auf verschiedene Arten implementiert werden. Sie können entweder den Zähler zuerst verschlüsseln und dann direkt XOR mit Klartext/Chiffretext, wenn es ankommt. Sie können auch zuerst den Klartext puffern und dann, sobald Sie einen vollen Block haben, den Zähler erstellen, verschlüsseln und dann einen ganzen Block Klartext XOR. Dies hatte Vorteile in dem Sinne, dass es anderen Betriebsmodi wie CBC ähnlicher ist. Außerdem müssen Sie den Schlüsselstrom möglicherweise nicht ständig zwischenspeichern.

Das Authentifizierungs-Tag kann auch anders gehandhabt werden. Hier gibt es grundsätzlich drei Möglichkeiten. Sie könnten das Authentifizierungs-Tag einfach als separate Entität zum Chiffretext betrachten. Dadurch können Sie die Online-Eigenschaften des CTR-Modus beibehalten und sollten meiner Meinung nach die bevorzugte Option sein. Sie könnten es auch als Teil des Chiffretextes sehen, aber in diesem Fall verlieren Sie die Online-Eigenschaften während der Entschlüsselung; Sie müssen wissen, wo der verschlüsselte Text endet, bevor Sie mit der letzten Anzahl von Bytes umgehen können, aus denen das Authentifizierungs-Tag besteht. Sie müssten also mindestens die Größe des Authentifizierungs-Tags in Bytes puffern. Schließlich möchten Sie möglicherweise noch während der Entschlüsselung nur Klartextbytes nach Überprüfung der Klartextbytes zurückgeben. In diesem Fall müssten Sie den gesamten Chiffretext puffern und den Klartext auf einmal zurückgeben.

Da die Authentifizierungs-Tag-Probleme nur für die Entschlüsselung sind, ist es wahrscheinlich, dass Bouncy nur aufgrund der Art der CTR-Pufferung puffern wird. Sie müssten tatsächlich doFinal aufrufen - wie Robert bereits in den Kommentaren erwähnt hat -, um den letzten Block des Geheimtextes sowie das Authentifizierungs-Tag abzurufen. Es könnte sein, dass die Verschlüsselung noch nicht durchgeführt wurde, da die Verschlüsselungsroutine auch etwas symmetrisch zur Entschlüsselungsroutine gehalten wird.

Verwandte Themen