簡體   English   中英

Java AES / CBC / PKCS5Padding流加密性能與無加密相比

[英]Java AES/CBC/PKCS5Padding stream encryption performance compared to no encryption

我使用標准技術使用RSA密鑰/對,其公鑰加密16字節隨機密鑰,使用AES / CBC / PKCS5Padding加密我的數據。 我正在使用充氣城堡滿足我的需求 我需要加密通常大數據流(512MB +)。 在運行性能測試以了解加密的開銷時,我發現加密比未加密的數據貴近30-40%。 這是預期的嗎?

示例代碼

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);
    }

別處

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

我玩過java服務器args; 確認AES-NI指令集已打開等。只是想知道加密大流時我應該期待什么開銷?

編輯:更正了我正在使用bouncycastle只為密鑰對生成的信息。 對於使用SunJCE作為安全提供程序的AES加密。

將Bouncy Castle用於Oracle Java API中的所有內容的想法讓我感到震驚。 由於Bouncy是一個僅限軟件的庫,因此不會為Bouncy啟用AES-NI。 Java不會用硬件指令神奇地替換AESFastEngine。 如果你想要速度,只需使用Oracle實現。

至於開銷:是的,應該預期開銷。 與其他計算相比,百分比有多大取決於機器和其他計算的性能。 但是,40%可能是合理的預期。

筆記:

  • 最新的Java版本也使用CPU指令進行BigInteger操作,這樣也可以加快RSA操作;
  • 使用PKCS#1填充Java和/或AES CBC使您的密文容易受到填充oracle攻擊(如果適用,例如在傳輸協議中);
  • 一定要使用足夠大的測試集,JIT編譯和優化可能會相對較晚。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM