ykrods note

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-modeloopback を指定しておく

    • 環境によっては gpg のプロンプト表示で文字化けするため(詳細は後述)

暗号化・復号手順

暗号化

暗号化は公開鍵とパスフレーズの2つの方法で行えるが、この記事では普段 gpg を利用していない人(私)向けにパスフレーズを用いる。

  1. find-file 等で拡張子 .gpg のバッファを作成する

  2. 好きな秘密にしたいテキストを書いて、通常のファイルと同じように保存

  3. 以下のメッセージが表示されるので、 [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]
    
  4. パスフレーズ・確認 の入力を求められるので、入力する

  5. .gpg ファイルが書き出される

  • cat コマンドなどでファイルを開くと内容が暗号化されていることが確認できる

  • (デフォルトの設定ではパスフレーズがキャッシュされるため、Emacs上でファイルを開き直しても生のテキストが表示される

復号

ファイルを開く際にパスフレーズの入力が求められる。暗号化に使用したパスフレーズを入力すれば内容が復号され表示される。

  • (上述したようにパスフレーズがキャッシュされていない状態)

発展

キャッシュの利用を無効にする

デフォルトの設定ではパスフレーズは gpg-agent にキャッシュされている。

「パスフレーズは毎回入力するようにしないと不安!」という場合、 gpg-agent 側の設定を変更する。設定ファイルは ~/.gnupg/gpg-agent.conf に配置する。

~/.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-modeloopback にすると、メッセージの表示を Emacs 側で行うので文字化けを回避できる

暗号化を GnuPG のコマンドで行うとどういう操作になるのか

# パスフレーズで暗号化
# (パスフレーズ後、そのまま中身のテキストを入力して CTRL+D
$ gpg --output foo.gpg --symmetric

# パスフレーズで復号して結果を標準出力
$ gpg --output - --decrypt foo.gpg

公開鍵 or パスフレーズ

  • 他人にデータを送信する場合はちゃんと公開鍵を使う

  • 自分用のファイルの暗号化で、かつ普段 gpg を使っていない(自分の鍵を持っていない)場合はパスフレーズでもいいように思う

    • (鍵作ったら鍵の管理しないといけないので)

参考

Cryptography Encryption Emacs EasyPG GnuPG

Emacs (EasyPG) で秘密のメモを書く — ykrods note
https://www.ykrods.net/posts/2020/05/10/secret-memo-with-emacs-easypg/

Comments