GnuPG anchor.png

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系列で対応している暗号化アルゴリズムは,以下のようなものがある。

  • 公開鍵暗号
    • RSA(1.0.3より)
    • ElGamal
    • DSA
    • ECDH
    • ECDSA
    • EdDSA
  • 共通鍵暗号
    • IDEA(1.4.13/2.0.20より)
    • 3DES
    • CAST5
    • Blowfish
    • AES-128, AES-192, AES-256
    • Twofish
    • Camellia-128, Camellia-192, Camellia-256(1.4.10/2.0.12より)
  • 暗号学的ハッシュ関数
    • MD5
    • SHA-1
    • RIPEMD-160
    • SHA-256, SHA-384, SHA-512, SHA-224
  • 圧縮形式
    • 無圧縮
    • ZIP
    • ZLIB
    • BZIP2

2.2(2.1)系では,楕円曲線暗号(楕円曲線DSA(ECDSA),楕円曲線ディフィー・ヘルマン鍵共有(ECDH),エドワーズ曲線デジタル署名アルゴリズム(EdDSA))に対応している。

Page Top

フロントエンドや統合パッケージ anchor.png

GnuPGはコマンドラインで使用するツールであるが,GUIで操作できるフロントエンドも開発されていて,KMailやEvolutionといった電子メールクライアントに統合されたものや,単独のGUIアプリケーションもある。

  • GUIフロントエンドの例
  • 電子メールクライアントの例
    • Enigmail (Linux/macOS/Windows用,Mozilla ThunderbirdおよびSeamonkey用アドオン)
    • KMailEvolution (Linux用)
  • 統合パッケージ(GnuPGとGUIフロントエンド・電子メールクライアントの一括インストール)
Page Top

他の暗号化通信との違い anchor.png

  1. SSLなどとの違い
    SSL/TLS(Secure Sockets Layer/Transport Layer Security)やSSH(Secure Shell)のポート転送を用いて,メールサーバーとの通信を暗号化することが出来る。
    しかしそれでは,送信後のメールの配送やサーバで保管されるメールについては,暗号化されていないことになる。

    Bcc(Blind Carbon Copy)でメールを送る場合,メールのヘッダに宛先が表示されないが配送自体も暗号化されないし,サーバーで保管された状態のメールは暗号化されていない。

    これに対してPGPやGnuPGでは,必ずしも安全でない通信経路やサーバーを介しても,メッセージが暗号化されていて秘密を守れる。

  2. 暗号化ZIPとの違い
    パスワードつきのZIPファイル(暗号化ZIP)は,そのファイルごとにパスワードが設定される。
    しかし,何らかの理由でパスワードを変更したいと思っても,送付したあとには出来ない。ファイルをいくつも作るとなると,そのパスワードの管理が面倒になる。

    PGPやGnuPGでの暗号化では,鍵(セッション鍵)が受信者の公開鍵で暗号化されている。したがって,その安全性は受信者の鍵の管理に依存することになる。
    受信者の持つ秘密鍵はパスフレーズを入力しないと使用出来ないが,もちろんそのパスフレーズは後でも変更出来る。

    なお,暗号化ZIPでは,一つのファイルに対してパスワードを知っている複数の人が復号できますが,PGPやGnuPGにおいても,複数の利用者が(それぞれの秘密鍵で)ファイルを復号出来るような単一のファイルを作ることは可能。

  3. S/MIMEとの違い
    S/MIME(Secure/Multipurpose Internet Mail Extensions)は,RSA Data Security社が開発したメールの暗号化や署名についての規格(RSA公開鍵暗号方式)で,そのデータフォーマットはPGPやGnuPGとは異なっている。IETFによって標準化されている。
    S/MIMEでは認証局により鍵や証明書が発行される。また認証局では所有者の正当性を保証するための管理を行っている。
    このため,S/MIMEでのデジタル証明書の利用については有料となる。
Page Top

GnuPGをインストール anchor.png

GnuPGはコマンドラインツールです。

GnuPGには3つの系列が存在している。

  • Stable(2.3/2.4) 2系の最新版。初版リリースは2021/04/08
    現在の開発系列。
  • LTS(2.2) 2系の旧版。サポート終了は2024/12/31の予定
    現在のサポート系列で楕円曲線暗号など新機能を実装している。バージョン2.2.0で安定版となった。(2017/08/28)
  • Legacy(1,4) 旧版
    旧来のスタンドアロン版。古いシステムや組み込み用途に適している。初版リリースは,2004/12/16だった。

これから使用する場合には,LTSStableをインストールします。

Page Top

Windowsマシンにインストール anchor.png

コマンドラインで動作する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オプションで,直接指定することも出来るようになっている。

Page Top

Gpg4winをインストールする anchor.png

Gpg4winは,GnuPGやGUIフロントエンド・Microsoft Outlook用のアドインなどを一括インストール出来るパッケージ。
Microsoft OutlookでGnuPGを使用してメールを暗号化したい場合は,このパッケージをインストールすると手っ取り早い。上記のコマンドライン版のGnuPGも含まれているので,コマンドライン版はインストールする必要はないです。

公式サイト から最新版のインストーラーをダウンロードする。

インストールは,ダウンロードしたインストーラーをダブルクリックするだけ。
GpgOLというOutlook用のアドオンがインストールされ,Outlookを再起動するとリボンの右の方にアイコンが表示されていて,公開鍵を使用してメールを暗号化することが簡単に出来るようになる。
また,GpgEXというWindowsのエキスプローラーに統合化された暗号化ツールと,Kleopatraという鍵を管理するツールもインストールされる。

Page Top

Linuxマシンにインストール anchor.png

パッケージ管理ツールからインストールする。

Page Top

暗号化する場合の流れ anchor.png

GnuPGは,以下のような流れで使用する。

  • 暗号化するための公開鍵を取得する
  • 公開鍵を使用して暗号化する
  • 暗号化した情報(ファイル)を送る
  • 情報(ファイル)を受信した人が自分の秘密鍵で複合する

暗号化するためには,鍵が必要になります。
普通は,暗号化してメールを送って欲しい人は公開鍵という種類の鍵を公開鍵サーバーで公開しています。
公開されている公開鍵を取得することが出来れば,その鍵を使用して暗号化することが出来るようになります。

復号化する側は,公開鍵とペアになっている秘密鍵を自分で持っているので,その秘密鍵を使ってデコードします。この秘密鍵は,復号化する人しか持っていないので,メールの暗号化が成立することになります。

GnuPGを使う場合の原則は,次の5つになる。

  • 暗号化には,受信者の公開鍵を使用する。
  • 復号には,受信者の秘密鍵を使用する。
  • 署名には,送信者の秘密鍵を使用する。
  • 署名の検証には,送信者の公開鍵を使用する。
  • 秘密鍵を使用するとき,パスフレーズを入力する。
Page Top

鍵の管理 anchor.png

Page Top

自分の鍵を作成する anchor.png

自分の鍵がまだ無い場合は,新規に鍵を作成する。--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になります。

鍵を作成した時に登録したパスフレーズは,絶対忘れないようにすることと,絶対に漏らさないことが大事。

Page Top

自分の公開鍵を公開する anchor.png

インターネット上にある鍵サーバー(公開鍵サーバ)に自分の公開鍵を登録して,他の人に公開鍵を渡すことが出来ます。
公開鍵をファイルまたはデータ情報として渡しても良いのだが,それだとちょっと面倒になる。
そのために,鍵サーバー(公開鍵サーバ)がサービスされています。注意することは,鍵サーバー(公開鍵サーバ)は,公開鍵のやりとりの利便性を図るものであって,公開鍵そのものの正当性は保証してくれているわけではありません。

鍵サーバー(公開鍵サーバ)に公開鍵を登録するには,--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

とすると,削除できる。

Page Top

公開されている鍵を探す anchor.png

メッセージを暗号化する場合は相手の公開鍵を使用して暗号化します。つまり,相手の公開鍵を入手する必要があります。

公開鍵を直接ファイル等で貰っても良いのだが,上記の公開鍵を管理してくれる鍵サーバーがある。
相手が鍵サーバーに公開している場合は,相手のメールアドレスがだいたいわかっていれば,鍵サーバーを検索出来る。(--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
Page Top

古い鍵を更新する anchor.png

ずいぶん前に作成した鍵が1024bit DSAなので,鍵の信頼性に問題が出ていて,アプリケーションによっては使用できない場合も出てきた。
しょうがないんで,鍵を更新することにした。

まず,更新したい鍵に対して新しい鍵を作成する。gpgのバージョンが新しいものを使って期限とかを設定したい場合はfull-generate-keyを使う。

D:\home\ueno> gpg --full-generate-key
Page Top

新しい鍵が出来たら,古い鍵で新しい鍵にサインする anchor.png

古い鍵を作った人が,新しい鍵を作ったよってことがちゃんと証明できるように署名をする。

D:\home\ueno> gpg -u XXXXXXXXXXXXXX --sign-key YYYYYYYYYYYYY
Page Top

古い鍵を無効にする anchor.png

D:\home\ueno> gpg -o yuji-old.revoke --gen-revoke XXXXXXXXXXXXXX
D:\home\ueno> gpg --import yuji-old.revoke
Page Top

鍵サーバに登録する anchor.png

古い鍵をrevoke(無効)したので,その情報を鍵サーバーに送信する。

D:\home\ueno> gpg --keyserver pgp.mit.edu --send-keys XXXXXXXXXXXXXX

新しい鍵も登録する。

D:\home\ueno> gpg --keyserver pgp.mit.edu --send-keys YYYYYYYYYYYYY
Page Top

古い鍵を削除する anchor.png

手元にある古い鍵を削除。

D:\home\ueno> gpg --delete-secret-and-public-keys XXXXXXXXXXXXXX
Page Top

鍵を別のPCに移す anchor.png

何らかの理由で別のPCに鍵を移す必要がある場合は,以下のようにする。

Page Top

鍵がある側 anchor.png

  • 公開鍵のエクスポート
    $ gpg -o hogehoge.key --export hogehoge
  • 秘密鍵のエクスポート
    $ gpg -o hogehoge_sec.key --export-secret-key hogehoge
  • 公開鍵の信用情報エクスポート
    $ gpg --export-ownertrust > hogehoge.trust
Page Top

鍵の移動先 anchor.png

  • 公開鍵のインポート
    $ gpg --import hogehoge.key
  • 秘密鍵のインポート
    $ gpg --import --allow-secret-key-import hogehoge_sec.key
  • 公開鍵の信用情報インポート
    $ gpg --import-ownertrust hogehoge.trust
Page Top

有効期限の更新 anchor.png

鍵の有効期限が切れていた場合は,期限を変更することが出来る。

まず期限が切れている鍵のIDを調べてメモする。
鍵のIDがわかったら,その鍵の期限を変更する。

$ gpg --edit-key [鍵のID]
gpg> key [NUM]                          <-- 操作対象のキー番号を指定する。NUMを省略した場合はマスターキーになる
gpg> expire                             <-- 次のプロンプトで有効期限を指定出来る
gpg> save
gpg> exit 

expireで,0を指定すると無期限,数字で日数,またはその後にw,m,yの単位を入力することにより週,月,年の単位で指定する事ができる。
例えば,1yと入力する事により一年間有効にする事が出来る。

これで鍵の有効期限の更新作業が出来る。

Page Top

代用的な公開鍵サーバー anchor.png

昔は多くのPGP公開鍵サーバーがあったが,有名なところも含めていろいろと閉鎖されている。
また,公開鍵サーバーは,公開鍵のやりとりの利便性を図る目的で運営されており,鍵そのものの正当性は保証してはいないことに注意する。

通常は1日毎にすべての公開鍵サーバーで同期されるので,どこか1箇所を利用するようにする。

GnuPGでは,デフォルトで使用する公開鍵サーバーをgpg.confで設定している。(Windowsマシン:C:/Users/<ユーザー>/AppData/Roaming/gnupg,Linuxマシンでは,~/.gnupg)

keyserver hkp://keys.gnupg.net

このように設定されている。変更したい場合は,以下のリストからどれかを設定すれば良い。

動作しているPGP公開鍵サーバー

nameurlport
MIT PGP Public Key Serverhkp://pgp.mit.edu11371
PGP Public Keyserverhttp://pgp.nic.ad.jp11371/80
OpenPGPkeyserverhkp://keys.gnupg.net11371
SKS OpenPGP Key serverhkp://pool.sks-keyservers.net11371
OpenPGPkeyserverhttp://minsky.surfnet.nl11371
Page Top

GnuPGでファイルをパスワード(共通鍵暗号)で暗号化・復号化する方法 anchor.png

とりあえず簡単にパスワードを指定してファイルを暗号化したい場合でも,GnuPGでファイルを暗号化することが出来ます。

> gpg --symmetric ファイル

または

> gpg -c ファイル

とします。

例えば,

> gpg --symmetric hello.txt
or
> gpg -c hello.txt
Page Top

メール文書を暗号化 anchor.png

メールなどでは,そのメール文書の受取人の公開鍵を使って暗号化して,その受取人しか復号化することが出来ないようにします。

> gpg --encrypt --recipient 受取人のメールアドレス メール文書のファイル名

暗号化すると,メール文書のファイル名.gpgという暗号化されたバイナリファイルが作成される。

メールに貼り付ける場合にはテキストファイルにする必要がある。

> gpg --encrypt --armor --recipient 受取人のメールアドレス メール文書のファイル名

とすれば,メール文書のファイル名.ascという暗号化されたテキストファイルが作成される。

もし,受取人と自分の両方で復号化出来るようにするには,

> gpg --encrypt --recipient 受取人のメールアドレス --recipient 自分のメールアドレス メール文書のファイル名

とすると,自分の秘密鍵でも復号化出来ることになります。

Page Top

暗号方式を指定してファイルを暗号化 anchor.png

GnuPGの設定ファイル~/.gnupg/gpg.confcipher-algo AES256と暗号方式を追加するか,コマンド実行時に--cipher-algoオプションで指定します。

例:暗号方式を指定してファイルを暗号化

> gpg --cipher-algo AES256 --symmetric hello.txt
Page Top

暗号時にパスフレーズを標準入力から取得する anchor.png

暗号時にパスフレーズを標準入力から指示する場合は,--passphrase-fd 0オプションを使います。

> gpg --batch --passphrase-fd 0 --symmetric hello.txt < password.txt
Page Top

圧縮方式を指定して暗号化する anchor.png

圧縮方式を指定するには,--compress-algoオプションを使用します。

> gpg --compress-algo zlib --symmetric hello.txt

主に使用される圧縮方式は以下のようなものがある。

--compress-algo none
圧縮なし
--compress-algo zip
zip
--compress-algo zlib
zlib, gzip
--compress-algo bzip2
bzip2
Page Top

ファイルを復号化する anchor.png

ファイルを復号化する場合は,以下のようにします。

> gpg hello.txt.gpg
もしくは
> gpg -d hello.txt.gpg
Page Top

標準入力からパスワードを取り込んで復号化する anchor.png

複合時パスフレーズを標準入力から指示する場合は,--passphrase-fd 0オプションを使います。

> gpg --batch --passphrase-fd 0 hello.txt.gpg < password.txt
Page Top

暗号方式一覧 anchor.png

gpgが対応している暗号方式を確認する場合は,以下のようにします。

> gpg --version
...
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
        CAMELLIA128, CAMELLIA192, CAMELLIA256
Page Top

対応している圧縮方式一覧 anchor.png

gpgが対応している圧縮方式を確認する場合は,以下のようにします。

> gpg --version
...
Compression: Uncompressed, ZIP, ZLIB, BZIP2

新しくコメントをつける

題名
ゲスト名
投稿本文
より詳細なコメント入力フォームへ

トップ   凍結 差分 バックアップ 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
Counter: 588, today: 2, yesterday: 0
最終更新: 2022-08-13 (土) 15:09:06 (JST) (618d) by yuji