2016-07-23 25 views
1

Verwendet die Standardtechnik mit einem RSA-Schlüssel/Paar, dessen öffentlicher Schlüssel einen zufälligen 16-Byte-Schlüssel verschlüsselt, der meine Daten mit AES/CBC/PKCS5Padding verschlüsselt. Ich benutze Hüpfburg für meine Bedürfnisse Ich muss Ströme von meist großen Daten (512 MB +) verschlüsseln. Auf laufenden Leistungstests, um den Overhead der Verschlüsselung zu verstehen, sehe ich, dass Verschlüsselung fast 30-40% teurer ist als unverschlüsselte Daten. Wird das erwartet?Java AES/CBC/PKCS5Padding Stream-Verschlüsselungsleistung im Vergleich zu keiner Verschlüsselung

Beispielcode

public InputStream encryptStream(InputStream streamToEncrypt, byte[] key, byte[] iv, byte[] encryptedKey // 256 bytes) { 

     final Cipher cipher = getCipher(Cipher.ENCRYPT_MODE, key, iv); 
     byte[] civ = cipher.getIV(); 
     ... 
     ByteArrayInputStream ivEncryptedKeyStream = new ByteArrayInputStream(ivEncryptedKeyArray); 
     CipherInputStream encrypted = new CipherInputStream(streamToEncrypt, cipher); 

     return new SequenceInputStream(ivEncryptedKeyStream, encrypted); 
    } 

anderswo

InputStream encryptedStream = ...encryptStream(plainStream, key, iv, encKey); 
IOUtils.copyLarge(encryptedStream, outputStream); 

Ich habe um mit Java Server args gespielt; bestätigt, dass der AES-NI-Befehlssatz eingeschaltet ist usw. Ich wollte nur eine Idee haben, welchen Overhead ich bei der Verschlüsselung großer Streams erwarten sollte.

EDIT: Korrigierte Informationen, dass ich Bouncycastle nur für die Schlüsselpaar-Generation verwenden. Für die AES-Verschlüsselung mit SunJCE als Sicherheitsanbieter.

+1

Haben Sie überprüft, ob Ihre Java-Version AES-NI verwendet? Siehe [AES-NI-Grundeinstellungen standardmäßig aktiviert?] (Http://stackoverflow.com/questions/23058309/aes-ni-intrinsics-enabled-by-default) – Robert

+0

Vielen Dank. Ich habe mit diesen Argumenten versucht und sehe eine sehr leichte Leistungssteigerung mit dem -server arg hinzu. Ich werde mehr darüber nachdenken. – sunny

Antwort

3

Die Idee, Bouncy Castle für alles zu verwenden, was bereits in der Oracle Java API ist, entgeht mir. AES-NI wird nicht für Bouncy aktiviert, da Bouncy eine Software ist, nur Bibliothek. Java wird die AESFastEngine nicht durch Hardware-Anweisungen ersetzen. Verwenden Sie einfach die Oracle-Implementierung, wenn Sie Geschwindigkeit haben möchten.

Wie für den Overhead: Ja, Overhead sollte erwartet werden. Wie groß der Prozentsatz im Vergleich zu anderen Berechnungen ist, hängt natürlich von der Maschine und der Leistung der anderen Berechnungen ab. 40% könnten jedoch eine vernünftige Erwartung sein.

Hinweise:

  • die neuesten Java-Versionen auch CPU-Anweisungen für BigInteger Operationen verwenden, so dass auch RSA-Operationen möglicherweise beschleunigen;
  • mit PKCS # 1 Padding für Java und/oder AES CBC macht Ihren Chiffretext anfällig für Padding Orakelangriffe (falls diese anwendbar sind, zum Beispiel in Transportprotokollen);
  • Stellen Sie sicher, dass Sie ein ausreichend großes Testset verwenden, die JIT-Kompilierung und -Optimierung kann relativ spät einsetzen.
+0

Danke für das Hinweis, ich habe die Info korrigiert. Ich verwende die Oracle Java API zur Verschlüsselung der Streams. Ich werde große Test-Sets ausprobieren, aber ich sehe sofort den Unterschied sagen zwischen einer Stichprobe von 10 vs 10000 Dateien von je 3MB. Bei meinem Test für 10000 Dateien beträgt der Leistungseinfluss etwa 30%. Als nächstes werde ich versuchen, Benchmarks mit größeren Dateien zu erstellen, aber in der Theorie würden größere Dateien größere Auswirkungen haben oder wären sie nicht wichtig? – sunny

+1

@sunny Nein, solange Sie keine andere VM verwenden, ist der Leistungsvorteil wahrscheinlich gering. 30 GB scheint schon viel zu testen, der Code wird dann optimiert. Es könnte einige Auswirkungen auf den Schlüsselumbruch und den AES-Schlüsselplan geben, aber das wird Ihre Ergebnisse wahrscheinlich nicht allzu sehr beeinflussen. –

+0

Beachten Sie, dass dies einer der wenigen Orte ist, an denen ich anstelle von Java eine optimierte C- oder C++ - Routine verwenden würde.Crypto in Java ist relativ langsam im Vergleich zu nativem Code, sogar mit Intrinsics. Im Vergleich zu Skriptsprachen ist es natürlich unglaublich schnell. –