我正在研究PHP的非對稱加密。爲什麼openssl_pkey_new比gpg快得多?
在我的初步測試我注意到,openssl_pkey_new
生成密鑰比gpg --gen-keys
在命令行上MUCH更快。在每種情況下,這是針對相同長度的RSA密鑰。
我的第一個猜測是,OpenSSL庫中的隨機數生成並不安全。
這是原因嗎?我能信任openssl_pkey_new
來生成強大的密鑰嗎?
我正在研究PHP的非對稱加密。爲什麼openssl_pkey_new比gpg快得多?
在我的初步測試我注意到,openssl_pkey_new
生成密鑰比gpg --gen-keys
在命令行上MUCH更快。在每種情況下,這是針對相同長度的RSA密鑰。
我的第一個猜測是,OpenSSL庫中的隨機數生成並不安全。
這是原因嗎?我能信任openssl_pkey_new
來生成強大的密鑰嗎?
有不同的方法來生成RSA密鑰對。如果遵守嚴格的ANSI X9.31要求,密鑰生成將會非常緩慢。
此外,素性測試的速度取決於非常大的整數的快速操作。這些操作的速度可能會有很大差異,例如從Java 8升級到Java 9會使您的2048位密鑰的性能提高一倍。
相比之下,隨機數的產生不應該太重要,除非你用盡了種子的隨機數發生器。直接使用/dev/random/
也會造成麻煩。但是素數測試可能比RNG使用更多的時間。
最後要注意的是RSA密鑰對生成的時間取決於找到約一半密鑰大小的兩個素數。尋找素數需要不確定的時間量 - 基本上,你幾乎可以立即找到它們,或者你可以花費相當多的時間找到素數。素數分佈相當好,但隨機的起點可能接近素數或離一個更遠。你可能需要測試幾千個密鑰對來平均一些東西。
總而言之,密鑰對生成器的速度並不能告訴您有關隨機數或結果鍵的質量。 ANSI X9.31中的附加測試實際上並不重要。
對OpenSSL的隨機數生成器的分析:http://eprint.iacr.org/2016/367 –
謝謝。我應該使用什麼,理想情況下保持在PHP 7中,而不必安裝任何依賴項。 (我開放給ECC,但似乎無法找到一個整潔的現成解決方案)。 – spraff