USBメモリにデータを入れて持ち運ぶ場合、なんの対策もしていないと「USBメモリの紛失」がそのまま「データ流出」につながります。これを防ぐ1つ方法は、予めファイルを暗号化した状態で保存しておくことです。本ページでは、GnuPG というツールを使った暗号化及び復号手順について説明します。
目次
1. GnuPG とは?
GnuPG (The GNU Privacy Guard) は「鍵」を作成・管理する機能に加え、その鍵を利用してファイルを暗号化したり署名したりすることができるフリーソフトウェア(無償で利用できます)で、GNUプロジェクト が開発しています。もともとRFC4880 (OpenPGP Message Format) という仕様があり、これを実装したツールになります。1999年から開発されている歴史あるソフトウェアです。
基本的にはコマンドラインツールですが、Windows 用のGUIアプリケーション Gpg4win も用意されています。
本ページでは、コマンドラインツールをメインに説明しますが、時間があれば Gpg4win での操作も追加したいと思っています。
2. インストール
Ubuntu / Debian の場合
以下のコマンドでインストールできます。
$ sudo apt install gpg
Windows の場合
Gpg4win から Gpg4win をダウンロードしてインストールします。
3. 準備作業
本ページでは、Ubuntu 18.04 LTS (WSL) のターミナルエミュレータでのコマンド例を紹介します。
鍵の生成
まず、自分の鍵を作っておく必要があります。
$ gpg --gen-key
画面に表示されたメッセージに従っていけばよいですが、その中で「本名」と「電子メール・アドレス」が聞かれますので入力します(これらが、コマンドパラメータに出てくる user-id や name となります)。
この操作により、「秘密鍵」と「公開鍵」のペアが作成されます。
暗号化(及び復号)と鍵の関係
暗号化(復号)と鍵の関係は以下になります。
- ファイルの 暗号化 には、公開鍵 が必要です。
- 暗号化されたファイルの 復号 には、秘密鍵 が必要です。
これを踏まえて、鍵の運用には大きく2パターンが考えられます。
(パターン1) 1つの鍵ペアを使う方法
最初に1つの鍵ペアのみを生成しておき、自宅や仕事場の全てにおいてこの鍵ペアを利用する方法です。この方法であれば、
- 移動先がどこかは気にせず、たった1つの公開鍵でファイルを暗号化して USBメモリに保存
- 移動する
- 移動先で復号する
が実現できます。
この場合、最初に秘密鍵をいろいろな場所に持って行かなければいけませんが、秘密鍵とデータを一緒に持って行くのは危険です。そのため、一番はじめは秘密鍵だけを各場所に持って行き、それが無事に完了したら初めてその鍵の利用を開始するというのが安全です。
また、1組の鍵ペアを使い回すのが危険だと思えば、用途に応じて何種類か使い分けてもよいと思います。
(パターン2) 場所毎に異なる鍵ペアを用意して使う方法
それぞれの場所毎で異なる鍵ペアを生成する方法です。
- 移動先で生成された公開鍵を使ってファイルを暗号化して、USBメモリに保存
- 移動する
- 移動先に付いたら、その場所の秘密鍵で復号する
というのを場所毎に相互に行います。
こちらは、「データと移動先が固定される」という不便さがありますが、その分パターン1より安全です。
※ 鍵をコピーして持って行くには、「エクスポート」と「インポート」という操作を使います(後述)。
GnuP に保存されている鍵の表示
公開鍵の一覧表示
$ gpg -k
実行例
$ gpg -k
/mnt/c/Users/foobar/.gnupg/pubring.kbx
------------------------------------
pub rsa3072 2019-02-20 [SC] [有効期限: 2021-02-19]
537X6DX05XB1X0CXAC2421425XA5X54X5BX68X8X
uid [ 究極 ] foobar <foobar@example.com>
sub rsa3072 2019-02-20 [E] [有効期限: 2021-02-19]
</foobar@example.com>
“pub” が、public (公開) という意味を表しています。
秘密鍵の一覧表示
$ gpg -K
実行例
$ gpg -K
/mnt/c/Users/foobar/.gnupg/pubring.kbx
------------------------------------
sec rsa3072 2019-02-20 [SC] [有効期限: 2021-02-19]
537X6DX05XB1X0CXAC2421425XA5X54X5BX68X8X
uid [ 究極 ] foobar <foobar@example.com>
ssb rsa3072 2019-02-20 [E] [有効期限: 2021-02-19]
</foobar@example.com>
“sec” が、secret (秘密) という意味を表しています。
公開鍵のフィンガープリントを表示
公開鍵のフィンガープリント(指紋)とは、その鍵の指紋であり、「鍵が本物かどうか」を判断するためのものです。鍵をエクスポートしたりインポートする際には、フィンガープリントを見てその鍵で間違いがないか確かめましょう。
公開鍵のフィンガープリントを表示するには、--fingerprint
オプションを使います。
$ gpg --fingerprint name
実行例
$ gpg --fingerprint foobar
/mnt/c/Users/foobar/.gnupg/pubring.kbx
------------------------------------
pub rsa3072 2019-02-20 [SC] [有効期限: 2021-02-19]
537X 6DX0 5XB1 X0CX AC24 2142 5XA5 X54X 5BX6 8X8X ← フィンガープリント
uid [ 究極 ] foobar <foobar@example.com>
sub rsa3072 2019-02-20 [E] [有効期限: 2021-02-19]
</foobar@example.com>
-k
オプションによる表示とほとんど同じですが、フィンガープリントの部分が4文字ずつスペースが入っているので多少見やすくなっています。
鍵の削除
秘密鍵を削除するには、--delete-secret-keys
オプションを使います。
$ gpg --delete-secret-keys fingerprint
公開鍵を削除するには、--delete-keys
オプションを使います。
$ gpg --delete-keys fingerprint
鍵のエクスポート
公開鍵のエクスポート
$ gpg -o public-key-file -a --export name
-o
: ここに指定したファイル名に公開鍵がエクスポートされます。-a
: ASCIIでの出力になります(テキストファイルになります)- name: エクスポートする鍵の名前(鍵を生成した時に入力した「本名」や「メールアドレス」です)
秘密鍵のエクスポート
$ gpg -o private-key-file -a --export-secret-key name
パスフレーズの入力が必要です。
引数については、公開鍵のエクスポートと同様です。
鍵のインポート
公開鍵のインポート
$ gpg --import public-key-file
フィンガープリントの確認をお忘れなく。
秘密鍵のインポート
$ gpg --import private-key-file
※ 秘密鍵をインポートすると、公開鍵も同時にインポートされるようです。
公開鍵をインポートした場合の注意点
公開鍵を別のPCに持っていってインポートした場合、その公開鍵を使って暗号化を行おうとすると「There is no assurance this key belongs to the named user」という警告が表示されることがあります。
この場合は、その公開鍵に trust (信用) の設定を行いましょう。
$ gpg --edit-key name
gpg> trust ← trust と入力して Enterキーを押します
1 = I don't know or won't say
2 = I do NOT trust
3 = I trust marginally
4 = I trust fully
5 = I trust ultimately
m = back to the main menu
Your decision? 5 ← 5 を入力してEnterキーを押します
Do you really want to set this key to ultimate trust? (y/N) y ← y を入力してEnterキーを押します
gpg> quit
これ以降、gpg -k
コマンドを実行すると [ultimate] (日本語の場合は、[究極] )と表示されるようになります。
4. 暗号化の手順
基本的に GnuPG は「ファイル」を暗号化するツールであるため、「ディレクトリ(フォルダ)」ごと暗号化したい場合は、あらかじめ tar や zip でファイルの形にしておきます。
データを受け取る側の公開鍵を使ってファイルを暗号化する
$ gpg -r name -ea 暗号化したいファイル
暗号化したファイルを復号できるのは、ここで使った公開鍵とペアの秘密鍵を持っているユーザのみです。
- ファイル名の末尾に「.asc」が追加されたファイルが作成されます(暗号化されています)
-r
オプション: ファイルを受け取るユーザ(の公開鍵)を指定します-e
オプション: 公開鍵を使った暗号化を行います-a
オプション: ASCII形式のファイルを生成します(テキストエディタで開けるファイルになります)
5. 復号の手順
暗号化されたファイルを復号するには、-d
オプションを使います。
$ gpg -o 出力ファイル -d 暗号化ファイル
6. Gpg4win を使う場合
Gpg4win を使うと、ここまで コマンドを使って説明してきた作業を GUI 上で行うことができます。本ページのコマンドがざっと見た後で、Gpg4win を使うとどの操作がどのコマンドに対応しているのかが分かりやすいのではないかと思います。時間があれば、Gpg4win での操作についても本ページで説明を追加していきたいなと思っています。
7. GnuPG の注意点
GnuPG には「公開鍵サーバ」というサーバが存在しており、そこに公開鍵を登録すると全世界に向けてその公開鍵が公開されます。誰かから自分宛てのファイルを暗号化して貰う際に、その相手はその公開鍵サーバから自分の公開鍵をダウンロードして貰えばよいので便利ではあります。しかし、一度登録してしまうとその公開鍵をサーバから削除させることができない仕様になっているため、この公開鍵サーバを利用することは全くお勧めできません。
相手に自分の公開鍵を渡す場合は、メールに添付して渡すなどの方法で問題ないですので、自分で渡しましょう(公開鍵は「公開」してもよいファイルですので慎重に扱う必要はさほどありません)。