2017-11-21 24 views
0

Ich habe eine Java-Anwendung, die AES-256-OCB tut. Dazu wird die BouncyCastle Crypto Library verwendet. Wie es ist, verwendet es die Standard-JCA-Schnittstelle, aber dafür muss eine spezielle Richtliniendatei installiert werden, um Schlüsselgrößen von mehr als 128 Bit zu ermöglichen.OCB-Modus in Bouncy Castle Lightweight API

Dies ist in unserer Umgebung ungeeignet, und es scheint mir, dass wir in der Lage sein können, dies zu umgehen, indem wir BouncyCastles eigene leichte API verwenden. Ich bin jedoch etwas verwirrt von dieser API, und ich war neugierig, wie ich tatsächlich eine Chiffre als AES/OCB/NoPadding instanziiere.

Ich bin normalerweise ziemlich gut beim Lesen der Dokumentation, aber BouncyCastle's ziemlich umfangreiche Optionen haben mich ein bisschen verwirrt.

Wie kann ich ein BlockCipher-Objekt für den 256-Bit-OCB-Modus ohne Padding mithilfe der BouncyCastle Lightweight-API instanziieren und zum Verschlüsseln und Entschlüsseln von Daten verwenden? Ich habe bereits den Schlüssel, IV und Daten als byte[] s.

+0

auf Stackoverflow Sie wirklich erwartet, es zu versuchen auf eigene Faust zu geben, und wenn etwas lässt Sie nicht in der Lage dann fortfahren können Sie eine bestimmte Frage zu diesem Ding fragen. Natürlich können Sie mit den Klassen OCBBlockCipher und AESEngine beginnen und von dort fortfahren. –

+1

(1) Oracle Java seit 9 (veröffentlicht Aug) und 8u151/152 (Okt) hat Richtlinie unbegrenzt automatisch (> 128, aber es gibt kein AES> 256). (2) Die LWAPI-Testklasse 'org.bouncycastle.crypto.test.OCBTest' hat einige ziemlich einfache (und gut bekannte) Beispiele. –

+0

Bearbeitet, um den Tippfehler zu korrigieren - bedeutet 128-Bit. – Jonas

Antwort

0

Hier ist, was ich beim Lesen von BouncyCastle Testcode kam. Es scheint zu funktionieren, obwohl ich die Ergebnisse nicht mit irgendwelchen Testvektoren verglichen habe.

Aufruf mit encrypt = true für die Verschlüsselung, encrypt = false für die Entschlüsselung. Setzen Sie tagLen auf die gewünschte Länge des AEAD-Tags in Bit (z. B. tagLen = 128). Legen Sie die Anzeige optional für die zugehörigen Daten zur Überprüfung fest, oder lassen Sie null zum Überspringen. Gibt ein korrektes Byte-Array des resultierenden Chiffretextes oder Klartextes zurück.

protected static byte[] processCipher(boolean encrypt, int tagLen, byte[] keyBytes, byte[] iv, byte[] in, byte[] ad) throws IllegalStateException, InvalidCipherTextException { 
    KeyParameter key = new KeyParameter(keyBytes); 
    AEADParameters params = new AEADParameters(key, tagLen, iv); 
    AEADBlockCipher cipher = new OCBBlockCipher(new AESEngine(), new AESEngine()); 
    cipher.init(encrypt, params); 

    byte[] out = new byte[cipher.getOutputSize(in.length)]; 
    if(ad != null) cipher.processAADBytes(ad, 0, ad.length); 
    int offset = cipher.processBytes(in, 0, in.length, out, 0); 
    offset += cipher.doFinal(out, offset); 

    return out; 
} 
Verwandte Themen