web-dev-qa-db-ja.com

GPGファイルの暗号化が他のAES実装よりもはるかに遅いのはなぜですか?

私が間違っている場合は修正してください:ファイルを暗号化するとき、GPGは1回限りのAES暗号化キーを作成し、RSAを使用してthatキーを暗号化します。これは、大量のデータを処理するときにAESの優れたパフォーマンスを利用するためと考えられます。

それが本当である場合、なぜgpg --encryptは、たとえばp7ZipのAES-256暗号化よりもはるかに遅いのですか?

12
Jon Staryuk

やってみよう...

まず、ランダムなバイトでいっぱいの500 MBytesファイルを作成します。

dd if=/dev/urandom of=/tmp/foo bs=1000000 count=500

次に、GnuPGを使用して暗号化し、そのプロセスにかかる時間を測定します( "keyID"は、使用している公開鍵のUIDです):

time gpg -r "keyID" --cipher-algo AES256 --compress-algo none -o /tmp/bar --encrypt /tmp/foo

私のマシンの合計時間(2.7 GHzのIntel i7、64ビットモード、GnuPG 2.0.22):

3.77s user 0.55s system 99% cpu 4.328 total

つまり、毎秒115メガバイトの暗号化帯域幅です。それほど悪くはありません。もう一度試してみましょうが、今回は圧縮を無効にせずに(つまり、「--compress-algo none "オプション):

20.99s user 0.79s system 98% cpu 22.038 total

これは5倍遅いです。 「遅い」のは暗号化ではなく、圧縮です(ただし、20 MB/sを超えると、多くの用途でかなり高速になる可能性があります)。


115 MB /秒は、AESの「ポータブル」実装と一致しています。 専用AESオペコード (私のi7で利用可能)を使用するコードは、300 MBから400 MB/sまで高速です(AES-NIオペコードのスループットは非常に高いですが、また、無視できないほどのレイテンシがあります。つまり、最高のパフォーマンスには並列処理が必要です。つまり、 CTRモード ; OpenPGP標準 必須 [〜#〜] cfb [〜#〜] 、順次)。

とにかく、優れた機械的ハードディスクは約120 MB/sであり、非常に優れたインターネットアクセス(光ファイバー)は10 MB/sを下回るので、生の暗号化速度は115 MB/sで十分です。

28
Thomas Pornin