web-dev-qa-db-ja.com

なぜAES暗号化は復号化よりも時間がかかるのですか?

いくつかの方法で費やされた時間を調べていたところ、暗号化は復号化よりも時間がかかることがわかりました。これは正しいですか?私はAESを使用しています(encとdecでも同じ手順が行われます)

36
BOB

いくつかの対称ブロック暗号(特にAES、DES、Blowfish、RC5など)は、単一のブロック(AESの128ビットなど)で動作する場合、暗号化と復号化に(測定エラー内で)同じ時間かかります。

ただし、複数のブロックを暗号化/復号化するときに異なるように見える理由はいくつかあります。たとえば、 cipher-block chaining (CBC)の場合、暗号化は順次実行する必要があります(ブロック1を暗号化する前にブロック0を暗号化してから、ブロック2を暗号化する前に...)。ブロック暗号が適用された後、XORステップ(暗号文の前のブロックを使用)が実行されるため)。

以下の図を参照してください(XORは丸で囲まれたプラスwithで示されます)。プレーンテキストの2番目のブロック_p[1]_を暗号化するには、c[1] = AES_Encrypt(p[1] XOR c[0])を使用します。これは、_c[1]_の生成が完了するまで_c[0]_を生成できないことを意味します。

CBC mode encryption

一方、暗号文の2番目のブロックを復号化するには、p[1] = c[0] XOR AES_Decrypt(c[1])を使用します。これは、プレーンテキスト_p[0]_の以前のブロックに依存していないため、完全に並列化できます(マルチコアシステムでより高速に実行できます)。 CBC mode decryption

高速な復号化と暗号化が必要な場合は、暗号化と復号化の両方で並列化できるため、CTRの使用を検討してください。

また、システムのキャッシュが原因で歪んだテストにも注意する必要があります。ディスクからファイルをランダムに読み取って暗号化する場合、ファイルの各チャンクを読み取るのに数ミリ秒かかります。ただし、次にアクセスするときに、ファイルは通常メモリにキャッシュされ、より速くアクセスされます。一方、復号化テストでは、最近ディスクに書き込まれた暗号化されたファイルがメモリ内のキャッシュにある可能性が高く、ディスクからの読み取りによるペナルティは発生しません。


CTRタイミング

_$ time openssl aes-256-ctr -e -salt -pass pass:passwd -in Fedora_64-bit.vmdk -out vmdk.encrypted

real    0m58.217s
user    0m5.788s
sys     0m8.493s
$ time openssl aes-256-ctr -e -salt -pass pass:passwd -in Fedora_64-bit.vmdk -out vmdk.encrypted

real    0m34.780s
user    0m4.800s
sys     0m7.748s
$ time openssl aes-256-ctr -e -salt -pass pass:passwd -in Fedora_64-bit.vmdk -out vmdk.encrypted

real    0m34.989s
user    0m4.120s
sys     0m6.444s
$ time openssl aes-256-ctr -d -salt -pass pass:passwd -in vmdk.encrypted -out decrypted

real    0m35.944s
user    0m4.140s
sys     0m7.008s
_

最初の3つの暗号化は、ディスクキャッシュの効果を示しています。ファイルの最初のアクセスは、その後のアクセスよりもはるかに低速でした。また、CTRの場合、この7.4 G仮想マシンの暗号化と復号化の両方に約35秒かかったことを示しています。 (時折繰り返して、復号化はより速くまたは遅くなります)。

58
dr jimbob