Public-Key
使用 gpg 測試對稱與非對稱加密和解密的速度
我知道對稱比非對稱更快。
我想對此進行測試,但我的(顯然不正確的)測試顯示相反。
對稱測試:
#!/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
.公鑰/私鑰操作沒有這樣刻意的減速——除非私鑰仍然受密碼保護。
這是公鑰加密的另一個優點:在加密期間,您不會放慢任何速度來保護從具有低熵輸出的源(即您)採樣的密碼片語。