Stream-Cipher

java中的快速Salsa20?

  • October 30, 2016

對於 Java,我只知道 Salsa20 的 Bouncy Castle 實現。但是,該版本比 AES-CTR 和 ARC4 慢得多***。***

C 中有很多庫,但是在 Java 中是否有這種流密碼的良好實現?

我懷疑你會在 Java 中找到一個快速的 Salsa20 實現(花了很多時間試圖實現這一點)。

Salsa20 改變了由 16 x 32 位整數組成的 512 位狀態,這意味著不利用 SIMD(在 Java 或其他方式上)的實現可能不會很好 - 有太多獨立的狀態部分無法保留它們在任何通用架構上的通用寄存器中,因此您不可避免地會產生載入/儲存成本,這會降低您的吞吐量。

Java(至少是熱點)在優化所有基本操作(例如內聯、單指令循環等)方面做得很合理,但它不具備動態進行小規模 SIMD 優化的智能。

我嘗試了各種方法來解決這個問題:通過將 32 位整數打包成 64 位長(太多附加指令)來模擬 SIMD;觸發熱點矢量化優化(過多的陣列調整成本),並且沒有找到任何有效的方法。

相比之下:Threefish 512,儘管具有相同的狀態大小,但使用 8 x 64 位字,因此在 64 位 Java 上,整個狀態可以保存在寄存器中,性能約為 AES 速度的 150%。

BouncyCastle Salsa20 實現可以稍微推動一下(通過盡可能多地註冊狀態)以使其比 AES 更快,但與支持 SIMD 的平台上的實現相比,它仍然非常慢。

XSalsa20 和 ChaCha 會有相同的問題,因為它們具有相同的基本結構。

引用自:https://crypto.stackexchange.com/questions/9019