GnuPGは,暗号化・復号化・署名等を行うための暗号化ソフトウェア。メールの暗号化にも使用できます。
GnuPGの元になったのは,Phil Zimmermannさんが開発したPGP(Pretty Good Privacy)と呼んでいる暗号化ツール。
PGPの最初のバージョンは,1991年に公開された。当時のPhil Zimmermannさんは反核運動家で,政府等の組織からデータやメッセージ(特に電子メール)を保護するための手段としてPGPを開発したみたいで,それをフリーソフトとして公開した。
その後,PGPは改良を重ねていったが,1998年にRFC 2440でOpenPGPとして標準化された。また,特許上の制限や国際政治上の問題も2000年を機に大幅に緩和されPGP を含む多くの暗号製品が本格的に使われるようになった。
GnuPGは,OpenPGPをベースにドイツで生まれた製品。特定の個人・組織が独占することのないようGNUプロジェクトの一環として,現在も開発が行われている。
GnuPGは,特許で制限されている暗号化アルゴリズムを使用していない。
2系列/1.4系列で対応している暗号化アルゴリズムは,以下のようなものがある。
2.2(2.1)系では,楕円曲線暗号(楕円曲線DSA(ECDSA),楕円曲線ディフィー・ヘルマン鍵共有(ECDH),エドワーズ曲線デジタル署名アルゴリズム(EdDSA))に対応している。
GnuPGはコマンドラインで使用するツールであるが,GUIで操作できるフロントエンドも開発されていて,KMailやEvolutionといった電子メールクライアントに統合されたものや,単独のGUIアプリケーションもある。
Bcc(Blind Carbon Copy)でメールを送る場合,メールのヘッダに宛先が表示されないが配送自体も暗号化されないし,サーバーで保管された状態のメールは暗号化されていない。
これに対してPGPやGnuPGでは,必ずしも安全でない通信経路やサーバーを介しても,メッセージが暗号化されていて秘密を守れる。
PGPやGnuPGでの暗号化では,鍵(セッション鍵)が受信者の公開鍵で暗号化されている。したがって,その安全性は受信者の鍵の管理に依存することになる。
受信者の持つ秘密鍵はパスフレーズを入力しないと使用出来ないが,もちろんそのパスフレーズは後でも変更出来る。
なお,暗号化ZIPでは,一つのファイルに対してパスワードを知っている複数の人が復号できますが,PGPやGnuPGにおいても,複数の利用者が(それぞれの秘密鍵で)ファイルを復号出来るような単一のファイルを作ることは可能。
GnuPGはコマンドラインツールです。
GnuPGには3つの系列が存在している。
これから使用する場合には,LTSかStableをインストールします。
コマンドラインで動作するGnuPGのみをインストールします。
下に書いてあるGpg4winをインストールするのように,Microsoft Outlookでも暗号化出来るようにするアドイン等も合わせてインストールしたい場合は,ここでの方法でインストールしないで,下に書いてあるGpg4winをインストールするでインストールした方が1回で済むので手間がかからない。
公式サイト から,windows版のインストラーをダウンロードする。
2系の最新バージョンは2.4.4。
ダウンロードしたインストーラーをダブルクリックして実行する。
[Next]ボタンを3回ぐらいクリックでインストールされる。インストール先は,C:\Program Files (x86)\gnupgになっている。
古いバージョンをデフォルトでインストールしている場合は,上書きインストールされます。
インストーラーにより実行PATHが設定されるため,すぐにコマンドプロンプトから使用できます。
コマンドプロンプトを開いて,
C:\home\yuji>gpg --version gpg (GnuPG) 2.2.23 libgcrypt 1.8.6 Copyright (C) 2020 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Home: C:/home/yuji/.gnupg サポートしているアルゴリズム: 公開鍵: RSA, ELG, DSA, ECDH, ECDSA, EDDSA 暗号方式: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH, CAMELLIA128, CAMELLIA192, CAMELLIA256 ハッシュ: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224 圧縮: 無圧縮, ZIP, ZLIB, BZIP2
のようにすると,実行とバージョンが確認できる。
デフォルトでは,鍵(公開鍵,秘密鍵)などを保存するディレクトリは,Windowsマシンの場合はC:/Users/<ユーザー>/AppData/Roaming/gnupgになる。
Linuxマシン(Unix系)などでは~/.gnupgになる。
これで特に問題はないが,他のフォルダに変更したい場合は環境変数GNUPGHOMEで任意ディレクトリを設定することが出来ます。
また,gpg.exe実行時に--homedirオプションで,直接指定することも出来るようになっている。
Gpg4winは,GnuPGやGUIフロントエンド・Microsoft Outlook用のアドインなどを一括インストール出来るパッケージ。
Microsoft OutlookでGnuPGを使用してメールを暗号化したい場合は,このパッケージをインストールすると手っ取り早い。上記のコマンドライン版のGnuPGも含まれているので,コマンドライン版はインストールする必要はないです。
公式サイト から最新版のインストーラーをダウンロードする。
インストールは,ダウンロードしたインストーラーをダブルクリックするだけ。
GpgOLというOutlook用のアドオンがインストールされ,Outlookを再起動するとリボンの右の方にアイコンが表示されていて,公開鍵を使用してメールを暗号化することが簡単に出来るようになる。
また,GpgEXというWindowsのエキスプローラーに統合化された暗号化ツールと,Kleopatraという鍵を管理するツールもインストールされる。
GnuPGは,以下のような流れで使用する。
暗号化するためには,鍵が必要になります。
普通は,暗号化してメールを送って欲しい人は公開鍵という種類の鍵を公開鍵サーバーで公開しています。
公開されている公開鍵を取得することが出来れば,その鍵を使用して暗号化することが出来るようになります。
復号化する側は,公開鍵とペアになっている秘密鍵を自分で持っているので,その秘密鍵を使ってデコードします。この秘密鍵は,復号化する人しか持っていないので,メールの暗号化が成立することになります。
GnuPGを使う場合の原則は,次の5つになる。
自分の鍵がまだ無い場合は,新規に鍵を作成する。--keygenオプションを使用する。
D:\home\ueno> gpg --generate-key ご希望の鍵の種類を選択してください: (1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (署名のみ) (4) RSA (署名のみ) 選択? 1 SA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048) 要求された鍵長は2048ビット 鍵の有効期限を指定してください。 0 = 鍵は無期限 <n> = 鍵は n 日間で満了 <n>w = 鍵は n 週間で満了 <n>m = 鍵は n か月間で満了 <n>y = 鍵は n 年間で満了 鍵の有効期間は? (0) これで正しいですか? (y/N) y あなたの鍵を同定するためにユーザーIDが必要です。 このソフトは本名、コメント、電子メール・アドレスから 次の書式でユーザーIDを構成します: "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>" 本名: Yuji Ueno 電子メール・アドレス: y-ueno@xxxxx.co.jp コメント: mail for xxxxx Co.,LTD. 次のユーザーIDを選択しました: “Yuji Ueno (mail for xxxxx Co.,LTD.) <y-ueno@xxxxx.co.jp>” 名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? O 秘密鍵を保護するためにパスフレーズがいります。 今から長い乱数を生成します。キーボードを打つとか、マウスを動かす とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で 乱雑さの大きないい乱数を生成しやすくなるので、お勧めいたします。 ......+++++ .+++++ 今から長い乱数を生成します。キーボードを打つとか、マウスを動かす とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で 乱雑さの大きないい乱数を生成しやすくなるので、お勧めいたします。 .+++++ 十分な長さの乱数が得られません。OSがもっと乱雑さを収集 できるよう、何かしてください! (あと75バイトいります) .gpg: 鍵CB547A37を絶対的に信用するよう記録しました 公開鍵と秘密鍵を作成し、署名しました。
作成した公開鍵があることを確認する。--list-keysオプションを使用する。
D:\home\ueno> gpg --list-keys C:/Users/yueno/AppData/Roaming/gnupg/pubring.gpg ------------------------------------------------ pub dsa1024 2012-12-01 [SC] XX870D25014C60E8319983AA6CC87XXYYBCC8D5E uid [ 究極 ] Yuji Ueno (mail for XXXXX Co.,LTD.) <y-ueno@xxxxx.co.jp> sub elg2048 2012-12-01 [E]
秘密鍵があることを確認する。--list-secret-keysオプションを使用する。
D:\home\ueno> gpg --list-secret-keys C:/Users/yueno/AppData/Roaming/gnupg/pubring.gpg ------------------------------------------------ sec dsa1024 2012-12-01 [SC] XX870D25014C60E8319983AA6CC87XXYYBCC8D5E uid [ 究極 ] Yuji Ueno (mail for XXXXX Co.,LTD.) <y-ueno@xxxxx.co.jp> ssb elg2048 2012-12-01 [E]
sec dsa1024 2012-12-01 [SC] というのは秘密鍵で,1024のDSAの鍵です。公開鍵の場合は,pubになります。
鍵を作成した時に登録したパスフレーズは,絶対忘れないようにすることと,絶対に漏らさないことが大事。
インターネット上にある鍵サーバー(公開鍵サーバ)に自分の公開鍵を登録して,他の人に公開鍵を渡すことが出来ます。
公開鍵をファイルまたはデータ情報として渡しても良いのだが,それだとちょっと面倒になる。
そのために,鍵サーバー(公開鍵サーバ)がサービスされています。注意することは,鍵サーバー(公開鍵サーバ)は,公開鍵のやりとりの利便性を図るものであって,公開鍵そのものの正当性は保証してくれているわけではありません。
鍵サーバー(公開鍵サーバ)に公開鍵を登録するには,--send-keysオプションを使うと登録出来る。
D:\home\ueno> gpg --keyserver pgp.mit.edu --send-keys <鍵ID>
もし,間違えて送ってしまったものを削除するには,--gen-revokeで失効証明書を作成して,revoke.ascに保存している場合は,
D:\home\ueno> gpg --keyserver pgp.mit.edu --send-keys <鍵ID> < revoke.asc
とすると,削除できる。
メッセージを暗号化する場合は相手の公開鍵を使用して暗号化します。つまり,相手の公開鍵を入手する必要があります。
公開鍵を直接ファイル等で貰っても良いのだが,上記の公開鍵を管理してくれる鍵サーバーがある。
相手が鍵サーバーに公開している場合は,相手のメールアドレスがだいたいわかっていれば,鍵サーバーを検索出来る。(--keyserverを指定しない場合は,gpg.confのkeyserverが使用される)
D:\home\ueno> gpg --keyserver pgp.mit.edu --search-keys yyyyy@xxxxx.com gpg: data source: https://37.191.226.104:443 (1) Yuji Ueno <yyyyy@xxxxx.com> 2048 bit RSA key XXF0FF212XX364BA, 作成: 2016-01-21 Keys 1-1 of 1 for "yyyyy@xxxxx.com". 番号(s)、N)次、またはQ)中止を入力してください >
鍵が見つかったので,取得してみる。
D:\home\ueno> gpg --recv-keys XXF0FF212XX364BA
これで鍵が取得できる。--list-keysオプションで確認できる。
D:\home\ueno> gpg --list-keys pub rsa2048 2016-01-21 [SC] XX220398D03470AA38747DD9XXF0FF212XX364BA uid [ 究極 ] Yuji Ueno <yyyyy@xxxxx.com> sub rsa2048 2016-01-21 [E]
間違えた時など,消したい場合は,--delete-keysを使う。
D:\home\ueno> gpg --delete-keys XXF0FF212XX364BA
ずいぶん前に作成した鍵が1024bit DSAなので,鍵の信頼性に問題が出ていて,アプリケーションによっては使用できない場合も出てきた。
しょうがないんで,鍵を更新することにした。
まず,更新したい鍵に対して新しい鍵を作成する。gpgのバージョンが新しいものを使って期限とかを設定したい場合はfull-generate-keyを使う。
D:\home\ueno> gpg --full-generate-key
古い鍵を作った人が,新しい鍵を作ったよってことがちゃんと証明できるように署名をする。
D:\home\ueno> gpg -u XXXXXXXXXXXXXX --sign-key YYYYYYYYYYYYY
D:\home\ueno> gpg -o yuji-old.revoke --gen-revoke XXXXXXXXXXXXXX D:\home\ueno> gpg --import yuji-old.revoke
何らかの理由で別のPCに鍵を移す必要がある場合は,以下のようにする。
鍵の有効期限が切れていた場合は,期限を変更することが出来る。
まず期限が切れている鍵のIDを調べてメモする。
鍵のIDがわかったら,その鍵の期限を変更する。
$ gpg --edit-key [鍵のID] gpg> key [NUM] <-- 操作対象のキー番号を指定する。NUMを省略した場合はマスターキーになる gpg> expire <-- 次のプロンプトで有効期限を指定出来る gpg> save gpg> exit
expireで,0を指定すると無期限,数字で日数,またはその後にw,m,yの単位を入力することにより週,月,年の単位で指定する事ができる。
例えば,1yと入力する事により一年間有効にする事が出来る。
これで鍵の有効期限の更新作業が出来る。
昔は多くのPGP公開鍵サーバーがあったが,有名なところも含めていろいろと閉鎖されている。
また,公開鍵サーバーは,公開鍵のやりとりの利便性を図る目的で運営されており,鍵そのものの正当性は保証してはいないことに注意する。
通常は1日毎にすべての公開鍵サーバーで同期されるので,どこか1箇所を利用するようにする。
GnuPGでは,デフォルトで使用する公開鍵サーバーをgpg.confで設定している。(Windowsマシン:C:/Users/<ユーザー>/AppData/Roaming/gnupg,Linuxマシンでは,~/.gnupg)
keyserver hkp://keys.gnupg.net
このように設定されている。変更したい場合は,以下のリストからどれかを設定すれば良い。
動作しているPGP公開鍵サーバー
name | url | port |
MIT PGP Public Key Server | hkp://pgp.mit.edu | 11371 |
PGP Public Keyserver | http://pgp.nic.ad.jp | 11371/80 |
OpenPGPkeyserver | hkp://keys.gnupg.net | 11371 |
SKS OpenPGP Key server | hkp://pool.sks-keyservers.net | 11371 |
OpenPGPkeyserver | http://minsky.surfnet.nl | 11371 |
とりあえず簡単にパスワードを指定してファイルを暗号化したい場合でも,GnuPGでファイルを暗号化することが出来ます。
> gpg --symmetric ファイル
または
> gpg -c ファイル
とします。
例えば,
> gpg --symmetric hello.txt or > gpg -c hello.txt
メールなどでは,そのメール文書の受取人の公開鍵を使って暗号化して,その受取人しか復号化することが出来ないようにします。
> gpg --encrypt --recipient 受取人のメールアドレス メール文書のファイル名
暗号化すると,メール文書のファイル名.gpgという暗号化されたバイナリファイルが作成される。
メールに貼り付ける場合にはテキストファイルにする必要がある。
> gpg --encrypt --armor --recipient 受取人のメールアドレス メール文書のファイル名
とすれば,メール文書のファイル名.ascという暗号化されたテキストファイルが作成される。
もし,受取人と自分の両方で復号化出来るようにするには,
> gpg --encrypt --recipient 受取人のメールアドレス --recipient 自分のメールアドレス メール文書のファイル名
とすると,自分の秘密鍵でも復号化出来ることになります。
GnuPGの設定ファイル~/.gnupg/gpg.confにcipher-algo AES256と暗号方式を追加するか,コマンド実行時に--cipher-algoオプションで指定します。
例:暗号方式を指定してファイルを暗号化
> gpg --cipher-algo AES256 --symmetric hello.txt
ファイルを復号化する場合は,以下のようにします。
> gpg hello.txt.gpg もしくは > gpg -d hello.txt.gpg
複合時パスフレーズを標準入力から指示する場合は,--passphrase-fd 0オプションを使います。
> gpg --batch --passphrase-fd 0 hello.txt.gpg < password.txt
新しくコメントをつける