Public-Key

使用 gpg 測試對稱與非對稱加密和解密的速度

  • April 1, 2020

我知道對稱比非對稱更快。

我想對此進行測試,但我的(顯然不正確的)測試顯示相反。

對稱測試:

#!/bin/bash

echo create random 100Mib binary file
head -c 100M /dev/urandom > blob

echo encrypt
time gpg --symmetric --batch --passphrase 123 --output blob.gpg blob

echo decrypt
time gpg --decrypt --batch --passphrase 123 --output blob blob.gpg

非對稱測試(使用 fred 的 4096 位密鑰對,由 gpg 生成):

#!/bin/bash

echo create random 100Mib binary file
head -c 100M /dev/urandom > blob

echo encrypt using public key
time gpg --encrypt --recipient fred --output blob.gpg blob

echo decrypt using private key
time gpg --decrypt --batch --output blob blob.gpg

結果:

encryption : symmetric  : 6.2s
encryption : asymmetric : 5.8s         # I expected this to be > 6.2

decryption : symmetric  : 2.5s
decryption : asymmetric : 1.4s         # I expected this to be > 2.5

有人能發現我的錯誤嗎?

如今,100 MiB 不算什麼。儘管如此,很可能大部分時間都花在了 I/O 操作上,而不是加密/解密上。一旦文件緩沖在 RAM 中,操作將更快地進行。更糟糕的是,在加密過程中,大部分時間都花在了壓縮輸入的過程中——而不是對其進行加密。嘗試-z 0這樣壓縮隨機數據不會花費太多時間:

maartenb@maartens-ryzen:~/Test$ time gpg --symmetric --batch --passphrase 123 --output blob.gpg -z 0 blob
gpg: AES256 encrypted data
gpg: encrypted with 1 passphrase
gpg: handle plaintext failed: General error

real    0m0.686s
user    0m0.670s
sys     0m0.016s
maartenb@maartens-ryzen:~/Test$ rm blob
maartenb@maartens-ryzen:~/Test$ time gpg --decrypt --batch --passphrase 123 --output blob blob.gpg
gpg: AES256 encrypted data
gpg: encrypted with 1 passphrase

real    0m1.056s
user    0m0.965s
sys     0m0.088s

似乎您正在使用基於密碼的加密進行“對稱加密”,而您正在使用未受保護的私鑰進行加密/解密(因為密碼已被記憶體)。

對於基於密碼的加密,您將使用基於密碼的密鑰派生函式或 PBKDF,它具有顯式的工作因子(或迭代計數)來減慢密碼猜測。更多資訊在這裡

現在,如果你查看加密的數據包,你會得到:

maartenb@maartens-ryzen:~/Test$ gpg --list-packets blob.gpg 
gpg: AES256 encrypted data
gpg: encrypted with 1 passphrase
gpg: decryption failed: Bad session key
# off=0 ctb=8c tag=3 hlen=2 plen=13
:symkey enc packet: version 4, cipher 9, s2k 3, hash 2
   salt 4D975A3A5174CD4F, count 65011712 (255)
# off=15 ctb=d2 tag=18 hlen=6 plen=104857656 new-ctb
:encrypted data packet:
   length: 104857656
   mdc_method: 2

注意那裡的s2k 3和相當高的價值count。請注意,我正在使用gpg (GnuPG) 2.2.12.

公鑰/私鑰操作沒有這樣刻意的減速——除非私鑰仍然受密碼保護。


這是公鑰加密的另一個優點:在加密期間,您不會放慢任何速度來保護從具有低熵輸出的源(即您)採樣的密碼片語。

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