Emacs (EasyPG) で秘密のメモを書く¶
Emacs で暗号化されたテキストを扱う方法と、利用にあたっての雑多なメモ
注釈
macOS で確認したため、別の環境では諸々異なることがあるかもしれません
利用シーン¶
テキストファイルを暗号化したい
openssl
でも暗号化できるが、コマンド叩くのも面倒なので楽をしたい
EasyPG を使うと、Emacs 上で手軽にファイルの暗号化・復号ができる
基本的な情報¶
EasyPG は GnuPG の Emacs インターフェイス
GnuPG はデータ・通信の暗号化・署名を行うコマンドラインツール。他人と通信する上で必要となる公開鍵の管理機能も備えている。
注釈
GnuPG の主だった使い方は、「鍵束にデータを送りたい相手の公開鍵を追加して、その鍵でデータを暗号化して相手になんらかの手段で送信」だと思われるが、ここでは単純にローカルのファイルの暗号化・復号機能のみを利用する。
準備¶
EasyPG
Emacs 23 以降、標準でバンドルされている
GnuPG
macOS の場合は homebrew でインストール可能
確認で使ったバージョンは 2.2.11
パスが通っていない場合は カスタム変数
epg-gpg-program
に gpg のパスを指定する
カスタム変数
epa-pinentry-mode
にloopback
を指定しておく環境によっては gpg のプロンプト表示で文字化けするため(詳細は後述)
暗号化・復号手順¶
暗号化¶
暗号化は公開鍵とパスフレーズの2つの方法で行えるが、この記事では普段 gpg を利用していない人(私)向けにパスフレーズを用いる。
find-file
等で拡張子.gpg
のバッファを作成する好きな秘密にしたいテキストを書いて、通常のファイルと同じように保存
以下のメッセージが表示されるので、
[OK]
を選択Select recipients for encryption. If no one is selected, symmetric encryption will be performed. - ‘m’ to mark a key on the line - ‘u’ to unmark a key on the line [Cancel][OK]
パスフレーズ・確認 の入力を求められるので、入力する
.gpg ファイルが書き出される
cat
コマンドなどでファイルを開くと内容が暗号化されていることが確認できる(デフォルトの設定ではパスフレーズがキャッシュされるため、Emacs上でファイルを開き直しても生のテキストが表示される
復号¶
ファイルを開く際にパスフレーズの入力が求められる。暗号化に使用したパスフレーズを入力すれば内容が復号され表示される。
(上述したようにパスフレーズがキャッシュされていない状態)
発展¶
キャッシュの利用を無効にする¶
デフォルトの設定ではパスフレーズは gpg-agent
にキャッシュされている。
「パスフレーズは毎回入力するようにしないと不安!」という場合、 gpg-agent
側の設定を変更する。設定ファイルは ~/.gnupg/gpg-agent.conf
に配置する。
default-cache-ttl 1
# gpg-agent
を利用しない方法もあるようだがうまく動かなかった
ちなみにキャッシュ済みのパスフレーズをクリアしたい場合、以下のコマンドで gpg-agent を終了させる。
$ gpgconf --kill gpg-agent
以下補足および雑記¶
epa-pinentry-mode について¶
gpg のデフォルトのtty 文字エンコーディング(?) が EUC-JP になっており、ターミナルの文字エンコーディング設定と一致していない場合に文字化けが起こる
デフォルトの文字エンコーディングが決まるタイミングは不明(gpg を homebrew でビルドした時?)
実行時に
locale
を参照してエンコーディングが決まるようなことも書いてあるがja_JP.UTF-8
ではうまくいかず、端末の文字エンコーディングを EUC にすると正しく表示されるのでよくわからないgpg の文字エンコーディングの方をutf8に変更する方法もよくわからない
と、諸々よくわからないものの、 epa-pinentry-mode
を loopback
にすると、メッセージの表示を Emacs 側で行うので文字化けを回避できる
暗号化を GnuPG のコマンドで行うとどういう操作になるのか¶
# パスフレーズで暗号化
# (パスフレーズ後、そのまま中身のテキストを入力して CTRL+D
$ gpg --output foo.gpg --symmetric
# パスフレーズで復号して結果を標準出力
$ gpg --output - --decrypt foo.gpg
公開鍵 or パスフレーズ¶
他人にデータを送信する場合はちゃんと公開鍵を使う
自分用のファイルの暗号化で、かつ普段 gpg を使っていない(自分の鍵を持っていない)場合はパスフレーズでもいいように思う
(鍵作ったら鍵の管理しないといけないので)
参考¶
Emacs (EasyPG) で秘密のメモを書く — ykrods note
https://www.ykrods.net/posts/2020/05/10/secret-memo-with-emacs-easypg/