ksaitoの日記

日々試したことの覚え書き

GnuGP

移転しました。

自動的にリダイレクトします。

GnuGPは、公開鍵方式で、ファイルに署名をしたり暗号化するためのソフトウェアです。もっともポピュラーな使い方は、メールの暗号化や署名でしょうか。
オープンソースの世界では、リリースする成果物が不正に改竄されていないことが確認できるように開発者が署名したりします。
Windows環境でもCygwinWindows用のバイナリがあります。画面の例は、Cygwin環境で作成した鍵とThunderbird + Enigmailプラグインを使って暗号メールを自分自身に送付して確認したものです。
以下GnuPGの簡単な使い方です。

GnuPGのインストール

Cygwinは、setup.exeからgnupgパッケージを選択するだけです。
Debian環境では、aptからgnupgをインストールします。

$ sudo apt-get install gnupg

鍵の生成

GnuPGは、公開鍵方式なので秘密鍵と公開鍵を生成して、秘密鍵は文字通り自分だけの秘密にする必要があります。公開鍵は、必要な相手に何らかの方法で渡す必要があります。
gpgコマンドの--gen-keyオプションで鍵を作ることができます。このとき入力するパスフレーズの入力を求められるので十分に複雑なフレーズを用いる必要があります。さもないと、なりすましや盗聴といった被害が自分の身に降りかかってくる可能性が高くなります。

$ gpg --gen-key
gpg (GnuPG) 1.4.6; Copyright (C) 2006 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.

Please select what kind of key you want:
   (1) DSA and Elgamal (default)
   (2) DSA (sign only)
   (5) RSA (sign only)
Your selection?
DSA keypair will have 1024 bits.
ELG-E keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
Requested keysize is 2048 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0)
Key does not expire at all
Is this correct? (y/N) y

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

Real name: XXXX
Email address: XXXX@XXXX
Comment: XXXX
You selected this USER-ID:
    "XXXX (XXXX) <XXXX@XXXX>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a Passphrase to protect your secret key.

We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
++++++++++.+++++..+++++.++++++++++.+++++++++++++++.++++++++++++++++++++.+++++.++++++++++..++++++++++++++++++++++++++++++.+++++++++++++++++++++++++.........>+++++..........>.+++++..........<+++++............+++++
++++++++.+++++++++++++++.+++++.+++++..++++++++++.++++++++++++++++++++.+++++++++++++++..+++++.++++++++++++++++++++++++++++++...+++++.+++++>+++++.+++++..........................................................................................>.+++++................................................................................................................................+++++^^^^^
gpg: /home/user/.gnupg/trustdb.gpg: trustdb created
gpg: key XXXXXX marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
pub   1024D/XXXX 2008-01-03
      Key fingerprint = XXXX XXXX XXXX XXXX XXXX  XXXX XXXX XXXX XXXX XXXX
uid                  XXXX (XXXX) <XXXX@XXXX>
sub   2048g/XXXX 2008-01-03

$

ファイルの暗号化

ファイルの暗号化は、gpgコマンドの-aeオプションを使います。-rオプションで鍵を生成したときに指定したReal Nameを指定します。
例えば、誰かが私に暗号化されたメールを送付するには、私から公開鍵を手に入れて下記のようにファイルを暗号化します。暗号化されたtext.ascファイルを私に送付すると、秘密鍵を持っている私だけが複合化できるファイルになるわけです。

$ cat text
plain text
$ gpg -ea -r "XXXX" text
$ cat text.asc
-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.4.6 (GNU/Linux)

hQIOA1KhtR8VEvk8EAf+OavoK9r+5roF/GlQBwpl5TUJHKsqc963fPuXgvZbqm7D
nINuuQPCScV2DeiDPSCtLNHjUtlbiOyxvzydIlMSQlyLnfoANiu+FsEnnibhs4Af
Es6481GnEoUm31JL4hOHI51LhRtT3iqMkzPVlE8gMppMVUfLVY9p+ivQR4DGucLW
WfwSlq14hPTwZW2f8HzS1A231kQABXCSy7R6KGqC4dKgUrk65jEPGss8uAxy0lxu
RfiJBH7iwPlwTYTqevGD2Fj3i8aaa7sNBQE5jPjdetqtRoZCw7L2B7O0ARn+YfTB
rSlTPjsiYJ58p4rwhfOSvO+JTMv043vXbYT9qwS9fQf/fgSBEjTWs4U0LjQAcQvj
zMvsvHMwE5Msc1dDzdOuh4mdvh3MOSpD7lMznWX2C7qdXelRDG8O73dXOsVhGuGm
tGe7FiuJ0bzk6T5r+v5jnfEZNekyBIzWl6sKJUwbCtXiOCaEnrWsoxGW64iQcma3
kc483pTHP3n2nlf7cjFucfbaCEaaTWTAlVXXx1PzHvIHG+gfuJQHnwvK8ntCtSSi
xSNAR6fP0t89qttCl7igA5UOCWOEMRTqqU6WkHPczZ4JF66AngeN+J2sXz09ZRfx
x9y6uAl656LBe88k+rxwoyw3KtHoifMMJT292OL1K2eUfcyLID3NUU1v2Rqt1bae
nNJIAeru5NnATmOVPdgXmUpbzPPO/RXdogpKgU+whEXkKFh5G3M8HiL2f8bJkTZD
yhZzuRENQIDlYk+zg+A/yOHVHnHW4v1hc0/6
=ObSu
-----END PGP MESSAGE-----
$

ファイルの複合化

先ほどのファイルを複合化してみます。

$ gpg -d text.asc

You need a passphrase to unlock the secret key for
user: "XXXX (XXXX) <XXXX@XXXX>"
2048-bit ELG-E key, ID XXXX, created 2008-01-03 (main key ID XXXX)

Enter passphrase:<鍵を生成したときに入力した秘密のパスフレーズを入力する>
gpg: encrypted with 2048-bit ELG-E key, ID XXXX, created 2008-01-03
      "XXXX (XXXX) <XXXX@XXXX>"
plain text
$