最近、いくつかの大きなファイルを暗号化する必要があります。 OpenSSLコマンドラインユーティリティを使用するオプションがありますが、GnuPGを使用することを好みます。
GnuPGは--encrypt
オプションを使用して内部でどのように機能しますか?最初に対称鍵を生成し、次に公開鍵で暗号化しますか?それとも、パフォーマンスが重い非対称暗号化だけですか?
最初に対称キーを生成し、次に公開キーを使用して暗号化される場合(非対称)、データを対称的に暗号化するためにどのアルゴリズムを使用しますか?
私が質問している暗号化方法(対称+非対称暗号化)は、「ハイブリッド暗号化」または「セッションキー」を使用する場合があります。
私はそのような情報をどこにも見つけていないため、コードを掘り下げるのは面倒です。
OpenPGPは常にハイブリッド暗号化を適用するため(ファイル/メッセージのサイズに関係なく)、対称暗号化とセッションキーを使用してメッセージを暗号化します。セッション鍵は、1つ以上の公開鍵と非対称暗号化を使用して暗号化されます(受信者ごとに1回)。実際、パスフレーズも追加すると、セッション鍵に対称暗号化が再び使用される可能性があります(パスフレーズと公開鍵を組み合わせて暗号化できるため、パスフレーズまたは一致する秘密鍵でメッセージを復号化できます。 )。
OpenPGPメッセージの(非常に簡略化された)構造は多かれ少なかれ
OpenPGPでのファイルとメッセージの暗号化に違いはありません。ファイル名が添付されていないメッセージは例外です。使用されるパッケージとアルゴリズムはまったく同じものです。
使用されるアルゴリズムについて議論する 少し複雑です であり、GnuPGのバージョン、コンピューターの暗号化で設定された設定、および受信者のキー所有者によって設定された設定に依存します。何が使用されているかを判断する簡単な方法は、gpg --list-packets
は、完全なパケット構造を提供します(RFC 4880を読むと、出力の理解に役立ちます。また、OpenPGPがバックグラウンドでどのように機能するかについて多くのことを学びます)。多くの場合、1つまたは2つ追加します-v
オプションで十分であり、読みやすく理解しやすいテキスト出力を提供します。
これが「ハイブリッド暗号化」です。
ファイル形式は「OpenPGP」と呼ばれ、 RFC 4880 で説明されています。これは「パケット」と呼ばれるサブ要素を持つ構造です。バルクデータ暗号化では 対称暗号化 を使用しますが、対称鍵自体は、 公開鍵暗号化セッション鍵パケット 。
このスキームにより、複数の受信者による効率的な暗号化が可能になります。データは対称鍵で一度暗号化され、その鍵は各受信者の公開鍵で暗号化されます。