GPGを使用してメッセージとファイルを暗号化する

キーの作成、ファイルの暗号化と署名、およびキーサーバーへのキーの送信方法について簡単に説明します。













GPG (GnuPGとも呼ばれる)は、非フリーPGPの無料の代替として作成されました。 GPGは情報の暗号化に使用され、この問題を解決するためのさまざまなアルゴリズム(RSA、DSA、AESなど)を提供します。







GPGは対称暗号化に使用できますが、主にプログラムは情報の非対称暗号化に使用されます。 つまり、対称暗号化では、メッセージを暗号化および復号化するために単一のキーが使用されます(たとえば、どの文字が特定の文字に対応するか)。 非対称暗号化では、パブリックキーとプライベートキーの2つのキーが使用されます。 パブリックは暗号化に使用され、私たちはあなたの友人にそれを与えることができ、プライベートは復号化に使用され、あなたはそれを安全に保つ必要があります。 このスキームのおかげで、秘密鍵の所有者のみがメッセージを復号化できます(メッセージを暗号化した人でも逆の操作を実行できません)。 Wikipediaで非対称暗号化について詳しく読むことができます。







GPGのインストール





Gpg4winをダウンロードしてインストールします。







GNU / Linux

ほとんどのディストリビューションでは、GNU / Linux GPGはすでにインストールされています。 インストールしていない場合は、パッケージマネージャーを使用してgnupg



パッケージをインストールするか、 ソースからコンパイルします。







Android

Androidには、GnuPG for AndroidおよびOpenKeychainプログラムがあります。 GnuPG for Androidの作成者は、OpenKeychainの使用を推奨しています。







OpenKeychain公式ウェブサイト

F-DroidのOpenKeychain

Google PlayのOpenKeychain







GnuPG for Android公式ウェブサイト

GitHubのAndroidソース用GnuPG







リコールしてくれたニックネームソルモンの友人に感謝します!







使用する



ここではLinuxの使用状況のみが表示されます(執筆時点では、GPGの最新バージョンは2.2.6です)







まず、ほとんどのLinuxディストリビューションにgpg



gpg2



2つのバイナリファイルがあることを明確にする価値がありgpg2



。 私が覚えている限りでは、これらは2つの異なるバージョン:1.4.xと2.0.xであり、便利な使用のために、gpgの起動時にgpg2が実行されるようにエイリアスを作成しました。 現在、DebianおよびArch Linuxでは、 /bin/gpg2



/bin/gpg



へのシンボリックリンクであり、このような操作の必要性はなくなりました。 file /bin/gpg2



実行してこれを確認できfile /bin/gpg2









それでは始めましょう!







引数なしでgpgを入力すると、必要なファイルが作成され(まだ作成されていない場合)、暗号化された情報が入力されるのを待ちます。







 user@PC:~$ gpg gpg:   '/home/user/.gnupg' gpg:     '/home/user/.gnupg/pubring.kbx' gpg: :   .  ,     ... gpg:   ...
      
      





キーがある場合は、テキストを入力し、キーの組み合わせCtrl + Dを押して、コンソールでkrakozyabの一部を取得できます。 しかし、これまでのところキーはありません。







キー作成



キーを作成するには、引数 "--full-generate-key"でGPGを実行する必要があります( "--gen-key"でも可能ですが、この場合、いくつかの重要なパラメーターを選択できません)。







UPD:引数--expert



指定してGPGを実行する場合、キータイプの選択ははるかに広くなります。
同志ニキータシウスへの追加をありがとう!







 user@PC:~$ gpg --full-generate-key gpg (GnuPG) 2.2.6; Copyright (C) 2018 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.   : (1) RSA  RSA ( ) (2) DSA  Elgamal (3) DSA (  ) (4) RSA (  )  ?
      
      





 user@PC:~$ gpg --full-generate-key --expert gpg (GnuPG) 2.2.6; Copyright (C) 2018 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Please select what kind of key you want: (1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (sign only) (4) RSA (sign only) (7) DSA (set your own capabilities) (8) RSA (set your own capabilities) (9) ECC and ECC (10) ECC (sign only) (11) ECC (set your own capabilities) (13) Existing key Your selection?
      
      





任意のオプションを選択できますが、3番目または4番目のオプションを選択すると、メッセージとファイルを暗号化できないことに注意してください!







 ...  ? 1   RSA    1024  4096.     ? (2048)
      
      





サイズが2048ビットのRSAキーの場合は十分ですが、最大4096ビットのサイズを選択できます(2048ビットより小さいサイズのキーを使用すると安全ではありません)







 ...     ? (2048) 2048    - 2048     . 0 =   <n> =    - n  <n>w =    - n  <n>m =    - n  <n>y =    - n    ? (0)
      
      





限られたキーの有効期間を選択した場合、キーの有効期限が切れると、キーは無効になります。 有効期限が切れるまでキーを更新できます。







GPGは期限を正しく入力したかどうかを尋ねます。入力した場合は、名前、メールアドレス、メモを入力する必要があります(これはすべてオプションですが、少なくとも1つ指定する必要があります)。







 ...     01  1970 00:00:00 +00  ? (y/N) y GnuPG       .   : Habrahabr User   : habr@habr.com : My own key     : "Habrahabr User (My own key) <habr@habr.com>"  (N), (C), (E); (O)/(Q)?
      
      





ここで編集するか、続行できます。







次に、gpgからパスワードの指定を求められます(メモリを更新し、強力なパスワードを選択するためのルールを読むことをお勧めします)。 Xサーバーを実行している場合は、パスワードを入力する必要があるダイアログボックスが表示されます。 そうでない場合、パスワードはコンソールに直接入力されます。







あなたは窓が好きではない場合

~/.gnupg/gpg-agent.conf



行を追加し~/.gnupg/gpg-agent.conf





pinentry-program /usr/bin/pinentry-tty





Pynentry-これらは同じダイアログボックスです。 ttyバージョン(コンソール)に加えて、いくつかのバージョン(グラフィカル)を試すことができます。

次に、gpg-agentを再起動します。 systemdを使用するシステムでは、これは次のように行われます。

systemd --user reload gpg-agent









 ...     . ,       -   (  ,  ,   );           .  -     -:
      
      





入力されたパスワードは、端末に表示されません。







キーの作成を高速化する役立つヒントもあります。 それに従うことをお勧めしますが、必ずしもそうする必要はありません(つまらないように非常に慎重に)。







 ... -: :     . ,       -   (  ,  ,   );           . gpg: /home/user/.gnupg/trustdb.gpg:    gpg:  5699884482E426AC     gpg:   '/home/user/.gnupg/openpgp-revocs.d' gpg:     '/home/user/.gnupg/openpgp-revocs.d/2BB6803FCF82316969619C155699884482E426AC.rev'.       . pub rsa2048 1970-01-01 [SC] 2BB6803FCF82316969619C155699884482E426AC uid Habrahabr User (My own key) <habr@habr.com> sub rsa2048 1970-01-01 [E]
      
      





この時点で、キーが生成され、 キーチェーンに追加されます。 キーチェーンには多くのキーを含めることができます。 また、この段階で、失効証明書が作成されます-作成されたキーを失効(無効化)できるファイル。 次のように、安全な場所に保管することをお勧めします 攻撃者がアクセスすると、キーを無効にすることができます。







これらの奇妙な最後の行はすべてどういう意味ですか?







rsa -RSA暗号化アルゴリズム。

2048-キーの長さ。

1970-01-01-キーが作成された日付。

2BB680 ... E426AC-キーフィンガープリント。 他の人の公開鍵をインポートするときにチェックする必要があります-両者で同じである必要があります。

uid-識別子(ユーザーID)。

pubおよびsub-キータイプ:







pub-公開鍵。

sub-公開サブキー。

sec-秘密鍵。

ssb-シークレットサブキー。







[SC]および[E] -各キーの目的。 キーを作成すると、暗号化、復号化、署名、および署名検証用に最大4つの暗号キーを取得できます。







S-署名。

C-鍵署名(認証)。 これについては後ほど説明します。

E-暗号化。

A-認証。 たとえば、SSHで使用できます。







メッセージに署名する理由 メッセージがあなたによって書かれ、転送中に変更されなかったことを確認するため。 メッセージが変更された場合、署名の検証中にこれが示されます。







構成



構成ファイルはファイル~/.gnupg/gpg.conf



保存されます

たとえば、構成ファイルの例を次に示します。自分でインストールすることをお勧めします。







 keyid-format 0xlong throw-keyids no-emit-version no-comments
      
      





keyid-format 0xlong



キー識別子の出力形式。 各キーとサブキーには独自の識別子があります。 デフォルトでは表示されず、以前はその短いバージョンが表示されていました。

利用可能な形式:

none



出力しません(デフォルト)。

short



短いエントリ。

0xshort



プレフィックスが「0x」の短いレコード。

long



長いレコード。

0xlong



プレフィックスが「0x」の長いエントリ。







throw-keyids



暗号化されたメッセージにキー情報を含めないでください。 このオプションは、メッセージの受信者を匿名化するのに役立ちます。







no-emit-version



-GPGバージョンを暗号化されたメッセージに埋め込みません。







no-comments



暗号化されたメッセージからすべてのコメントを削除します。







これらはすべて、manページにあるオプションです。 これらは、接頭辞「 --



」なしで構成ファイルに書き込まれます。







コマンドとオプション



最も基本的なもののみを説明します。







--armor





-a



-ASCII(文字)出力を生成します。 暗号化されると、GPGはデフォルトでバイナリ出力を生成します。 このオプションを使用すると、GPGは情報をRadix-64エンコード(Base64のバリエーション)でエンコードします。 このテキスト出力は、たとえば、メッセンジャーまたは電子メールで送信したり、画面に表示したりできます。







--encrypt





-e



メッセージを暗号化します。







--recipient





-r



暗号化に使用するキーを指定します。 情報ユーザー識別子(名前、メール)、キー識別子、キーフィンガープリントを使用できます。







--decrypt





-d-メッセージを復号化します。







--sign





-s



メッセージに署名します。 署名は、メッセージ自体とは別に配置されます。







--clear-sign





--clearsign



メッセージに--clearsign



します。 署名はメッセージとともに保存されます。







--local-user





-u



署名に使用するキーを指定します。 --recipient



オプションに似ていますが、 これは同じものではありません







--verify



署名を検証します。







--list-keys





-k



公開鍵をリストします。







--list-secret-keys





-K



秘密鍵をリストします。







--export



公開キーをファイルにエクスポートし、その後どこかに送信できます。







--import



公開鍵をインポートします。







--edit-key



編集します。







--expert



「エキスパートモード」。













gpg -a -r 0x12345678 -e decrypted.txt > encrypted.gpg





キー0x12345678



使用して、 0x12345678



ファイルをencrypted.gpg



ファイルにencrypted.gpg



ます。 この場合、完成したファイルはバイナリではなくテキストになります。







gpg -r 0x12345678 -d encrypted.gpg > decrypted.txt





キー0x12345678



encrypted.gpg



ファイルを復号encrypted.gpg



し、 0x12345678



ファイルに保存します。







gpg -u 0x12345678 -s message.txt > sign.asc





キー0x12345678



を使用してmessage



ファイルに署名し、 sign.asc



ファイルに署名を保存します。







gpg -r 0x12345678 --clearsign message.txt > message.gpg





0x12345678



のキーでmessage.gpg



ファイルに署名し、 message.gpg



ファイルに署名付きでメッセージを書き込みます。







gpg --verify message.asc message.txt





message.txt



ファイルに書き込まれているmessage.asc



ファイルの署名を確認します。







gpg --import pubkey.gpg





pubkey.gpg



ファイルから公開キーをインポートします。







キーの編集、外部キーへの署名、キーサーバーへのキーの送信



キーはgpg --edit-key <KeyID>



編集されます。

このコマンドを入力すると、次のように表示されます。







 user@PC:~$ gpg --edit-key CCA230DA07929EB7 gpg (GnuPG) 2.2.6; Copyright (C) 2018 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.   . sec rsa2048/CCA230DA07929EB7 : 2018-05-08  :  : SC :  :  ssb rsa2048/7859E2A888E31276 : 2018-05-08  :  : E [  ] (1). Habrahabr User (My own key) <habr@habr.com> gpg>
      
      





help



入力すると、使用可能なコマンドを確認できます。

ここで、さまざまなサブキーを追加し、ユーザー識別子を追加し、他の人の公開キーに署名することもできます。

キーに署名する必要があるのはなぜですか? そのため、署名されたキーの所有者が本人であることを確認できます。 このようにして、いわゆる「信頼のネットワーク」を作成します。 例:アリスはボブの公開鍵に署名し、ボブはチャーリーの公開鍵に署名しました。 アリスがチャーリーの公開鍵を受け取った場合、彼女は彼を信頼することができます。なぜなら、キーはアリスが信頼している人、つまり ボブ。 鍵の署名を取得するために、人々は公開鍵を交換して署名する特別な会議も手配します。







次に、キーサーバーについて説明します。 キーサーバーは、公開キーを格納する特別なサーバーです。 鍵サーバーは、公開鍵を配布するために使用されます。







注意! キーサーバーに送信されたキーは削除できません! キーはサーバーに残ったまま、失効証明書をサーバーにインポートすることによってのみ失効できます。







サーバーに公開鍵を送信します。

gpg --keyserver <URL> --send-keys <KeyID>









サーバーからキー識別子を持つ公開キーを取得します。

gpg --keyserver <URL> --recv-keys <KeyID>









サーバーから主要な更新を取得します。

gpg --keyserver <URL> --refresh-keys









サーバーでキーを見つけます。

gpg --keyserver <URL> --search-keys <UID KeyID>









便宜上、コマンドで登録しないようにgpg.conf



キーサーバーアドレスをgpg.conf



できgpg.conf





keyserver <URL>









GPGの使用が発生する可能性のある場所



Git

GPGを使用してコミットに署名できます。 そのため、コミットを行ったのはあなたであることを確認します。 GitHubでは、公開キーを台無しにすることができ、キーで署名されたコミットにはチェックマークが付きます。









UPD: Gitのドキュメントで GPGを使用するためのGit構成について読むことができます

他のnikitasiusからのGit構成ファイルの例を次に示します。







 [commit] gpgsign = true [user] signingkey = <KeyID> [gpg] program = /bin/gpg
      
      





ディストリビューションおよびその他のファイルをダウンロードする

ディストリビューションのほとんどのインストールイメージは、署名された開発者によって配布されます。 変更した画像をアップロードすると、署名を確認するときに、画像がオリジナルではないことがすぐにわかります。 例は、人気のあるTailsディストリビューションです。







パッケージマネージャー

すべてのパッケージは、変更から保護するために開発者によって署名されています。 パッケージをインストールするときに、これらの署名が検証されます。 これはすべて、ユーザーの介入なしに自動的に行われます。







参照資料



GPGウェブサイト

GPGウィキペディアの記事

情報セキュリティとGPG専用のWebサイト

キーサーバー:

pgp.mit.edu





keyserver.pgp.com










All Articles