GPGの署名とは (2021/12/26)

PGPとは?

PGPとは、物凄くざっくり言うと、公開鍵と秘密鍵を使ってファイルを暗号化したりすることができるものです。

暗号化の手順

署名について話す前に、暗号化はどのように行われているかをいいます。
1. ファイルを受け取る人が秘密鍵と公開鍵のペアを専用ソフト(GPGなど)を使って作る
2. 公開鍵をファイルを送信する人ファイルを受け取る人公開鍵だけを送る
3. ファイルを送信する人が公開鍵を使ってファイルを暗号化する
4. ファイルを受取先に送信する
5. 受け取る人が秘密鍵を使って復号化する
!!! info 復号化とは

復号化とは、暗号化されたファイルをもとに戻すことです。 !!! hint 公開鍵と秘密鍵

公開鍵は、ファイルの暗号化はできるけど、復号化はできません。 逆に、秘密鍵はファイルの復号化ができます。 つまり、公開鍵はその名の通り公開してもなにも差し支えありません。 ただし、秘密鍵はその名の通り公開したり友人に教えたりするのは一切NGです。 そこだけは気を付けましょう。

署名とは

では本題に入りましょう。 署名とは、秘密鍵を持っている本人しか作れない暗号化されたメッセージ、またはそれを作ることです。
これを使うと、このメッセージは本人が書いたことを証明できるので、本人確認などに最適です。
これは暗号化とは逆で、秘密鍵を持っている人しか暗号化できません。
!!! danger 秘密鍵を公開すると

秘密鍵を公開すると、次のことが起こります。 ・勝手に暗号化されたファイルを解読できる ・秘密鍵を持っている本人になりすますことができる なので、絶対に公開はしてはいけません。

Linuxでの操作方法

gpgのインストール

sudo apt install gpg gnupg

鍵を作る

gpg --full-gen-key
ご希望の鍵の種類を選択してください:
   (1) RSA と RSA (デフォルト)
   (2) DSA と Elgamal
   (3) DSA (署名のみ)
   (4) RSA (署名のみ)
  (14) カードに存在する鍵
あなたの選択は? 1
RSA 鍵は 1024 から 4096 ビットの長さで可能です。
鍵長は? (3072) 4096
要求された鍵長は4096ビット
鍵の有効期限を指定してください。
         0 = 鍵は無期限
      <n>  = 鍵は n 日間で期限切れ
      <n>w = 鍵は n 週間で期限切れ
      <n>m = 鍵は n か月間で期限切れ
      <n>y = 鍵は n 年間で期限切れ
鍵の有効期間は? (0)0
鍵は無期限です
これで正しいですか? (y/N) y
GnuPGはあなたの鍵を識別するためにユーザIDを構成する必要があります。

本名: (登録する名前、本名以外でも可。)
電子メール・アドレス: (メールアドレス)
コメント: (その名の通り、コメント。なければそのままEnter。)
次のユーザIDを選択しました:
    "名前 (コメント) <メールアドレス>"

名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? O

たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。
(ここでパスワードが求められるので鍵に設定するパスワードを入力)
たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。
(ここで下のメッセージが出るまでマウスを動かし続ける)
gpg: 鍵35394697FE8D1AFBを究極的に信用するよう記録しました gpg: 失効証明書を '/home/okaits/.gnupg/openpgp-revocs.d/43658C3EB045738D21CA0AC935394697FE8D1AFB.rev' に保管しました。 公開鍵と秘密鍵を作成し、署名しました。

pub rsa4096 2022-02-12 [SC] 43658C3EB045738D21CA0AC935394697FE8D1AFB uid okaits7534 (okaits7534's Sub key.) okaits7534+sub@gmail.com sub rsa4096 2022-02-12 [E]

これが出てきたら作成完了です。
<h3>ファイルを署名・暗号化する</h3>
両方とも鍵を持っている前提です。
<h4>署名</h4>
<h5>署名する</h5>
echo "署名したい文" | gpg -sau 鍵に登録したメールアドレス -o signed.asc
signed.ascとして署名したファイルができます。
<h5>署名を検証する</h5>
cat signed.asc | gpg
<h4>暗号化</h4>
<h5>ファイルを持っているひとへ公開鍵を送る(もらう側視点)</h4>
gpg --export -a 鍵に登録したメールアドレス -o public.asc
そうするとカレントディレクトリにpublic.ascが出てくるのでメールなどで送ります。
<h5>貰った公開鍵をインポートして暗号化する(送る側視点)<h4>
```bash
gpg public.asc
gpg -ear 受取人のメールアドレス ファイル名
ファイル名.ascがカレントディレクトリに出てくるので送ります。

暗号化されたファイルを復号化する
gpg ファイル名.asc