問題タブ [aescryptoserviceprovider]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
311 参照

java - c# RijndaelManaged は、同等の Java (AES/CFB8/NoPadding) よりも 10 倍優れています。

C# アプリケーションのパフォーマンスをデバッグしているときに、同等の Java よりもはるかに遅いことに気付きました。調べてみると、問題は暗号化/復号化の方法が原因のようです。

モードを CFB8 に設定し、パディングなしで AES 暗号化を使用する必要があります。Javaの場合、これは私が使用できるので非常に簡単ですCipher.getInstance("AES/CFB8/NoPadding");。C# では、 を使用する必要があることがわかりましたnew RijndaelManaged()。同じキーと同じデータでテストを実行した後の結果は次のとおりです。

ジャワ:

  • 暗号化: 0.402 秒
  • 復号化: 0.480 秒

C#:

  • 暗号化: 4.201 秒
  • 復号化: 3.671 秒

C# 暗号コード:

C# テスト コード:

結果: "AesCrypto.Crypt かかった: 3626"

JAVA 暗号コード:

Java テスト コード:

結果: 「Java 暗号化にかかった時間: PT0.469S」

考えられる解決策:

これをかなり調べたところAesCryptoServiceProvider()、Java の同等物とほぼ同じパフォーマンスを持ち、ほとんど同じ結果が得られたようです。ただし、これの問題は、パディングが必要であるのに対し、Java の等価性ではパディングが必要ないことです。たとえば、これは、「abcdab」を暗号化する場合、「abcd」のみを暗号化し、その結果を返し、残り (「ab」) を内部に保持することを意味します。パディングを使用すると、暗号化された完全な「abcdab」を返すことができますが、Javaではパディングなしで「abcdab」を暗号化できるため、追加のデータが追加され、対称アルゴリズムが非同期になります。

質問

最後に私の質問は、C# の暗号化/復号化プロセスを Java と同じくらい速くするにはどうすればよいかということです。パディングを必要としAesCryptoServiceProviderない可能性がありますか?