GnuPG и клиенты PGP в целом обычно шифруют фактические данные с помощью симметричного ключа, называемого "ключом сеанса". Затем ключ сеанса шифруется каждым «ключом получателя» (т. Е. Теми, которые вы указываете с -r / - получателем). Это иногда называют гибридным шифром . Сейчас я считаю, что GnuPG по умолчанию использует 256-битные сеансовые ключи и AES для шифрования незашифрованных данных в этот сеансовый ключ AES-256, а ваши ключи получателя - это ваш RSA / DSA / ECDSA / и т. Д. ассиметричный ключ в этом случае.
Одна из причин, по которой это происходит таким образом, заключается в том, что симметричные криптографические алгоритмы, такие как AES, обычно намного быстрее, чем асимметричные, такие как RSA. Таким образом, GnuPG должен только зашифровать ~ 256 бит (сессионный ключ) с помощью RSA и может использовать AES для шифрования данных (настолько больших, насколько вы хотите!) С помощью этого сессионного ключа. На машинах Intel даже есть встроенная инструкция AES-NI для выполнения некоторых этапов алгоритма аппаратного обеспечения, что делает GnuPG очень быстрым при шифровании / дешифровании данных.
Еще одна причина, по которой вы делаете это таким образом, заключается в том, что он позволяет зашифровывать документы, зашифрованные PGP, нескольким сторонам без необходимости удваивать размер документа. Обратите внимание, что при указании нескольких получателей для зашифрованного документа (например, gpg -ea -r Alice -r Bob -o ciphertext.asc
) зашифрованный документ, который сохраняется (ciphertext.asc), не в 2 раза больше, чем если бы вы только что зашифровали его для Алисы.
См. Также параметр --show-session-key
на справочной странице gpg , чтобы иметь возможность расшифровывать только сессионный ключ, например, чтобы позволить третьей стороне расшифровать зашифрованный для вас документ без необходимости передайте им свой закрытый ключ или данные в открытом виде.