この記事

2つのツールを使ってみたので、その使い方をメモしておきます。

minisign

minisignはEd25519の暗号アルゴリズムを使ってファイル署名が出来るツールです。Cで書かれています。
zigはこのツールを使って配布をしているようです。

ここで言う「署名」とは、例えばfoo.pngを配布するとして、「これは正真正銘私が作った内容と相違ないですよ」というのを信頼させる方法のことです。
例えば絵描きの「Aさん」が自分のイラストサイトでfoo.pngを配布しているのですが、それを見た「Bさん」がAさんのfoo.pngを改鋳した贋作を配布したとします。
署名ツールは、Aさんだけが持っている「秘密鍵」と「ファイルの内容」を元に「署名」を作成します。使う側のCさんはBさんのサイトを見ましたが、これはAさんのオリジナルなのかを調べたくなりました。この状況において、「Aさん」が「公開鍵はこれですよ」と公に宣言しているので、Cさんはfoo.pngが「Aさんが主張するオリジナルな内容なのか」を判定できます。そういうことをやる為のツールです。
なお、minisignの場合はファイルそのものに何かを埋め込むわけではないので、公開鍵の宣言とセットでそのファイルに対応した.minisigファイルなるものを配布します。この材料を組み合わせて、Cさんは、Aさんの提供する情報を元に検証できるようになります。

ということで、使ってみましょう。

minisign -G # キーペアを作成。秘密鍵は~/.minisign/minisign.keyに置かれる
echo aaaaaaaaaaaaa > test.txt
minisign -Sm test.txt # 署名
cat minisign.pub # 公開鍵のIDを確認
minisign -Vm ./test.txt -P xxxxxxxxxxxxxxxxxxxxxxxxxxxx # 検証
# -> Signature and comment signature verified

適当にtest.txtの内容を1文字bとかにしてみます。すると…

minisign -Vm ./test.txt -P XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
# -> Signature verification failed

ということで、中身違うわよって言われる訳ですね。

age

ageはファイル暗号化ツールです。Goで書かれています。
ここでいう「暗号化」とは、「Aさんのみが解読可能なデータを作成する」ことを指します。
例えば、BさんやCさんがAさんに手紙を送るが、「封筒の中身は絶対に郵便屋さんに見られたくない」という時に、AさんがBさんやCさんに予め「公開鍵」を言っておきます。それでBさんやCさんは「手紙を暗号化」します。それは、Aさんのみが持っている「秘密鍵」でしか開けられないので、中身は「郵便屋さん」は見れません。
あるいは、Aさんだけに留まるなら、「自分だけが開けられる秘密の引き出し」みたいなものを作れます。そういう目的の為のものです。

ということで、使ってみましょう。

age-keygen -o ./age.pkey # 秘密鍵を作成。この中身に公開鍵の値もメモされている
echo aaaaaaaaaaa > test.txt
# ファイルを公開鍵で暗号化する。 注: オプション順序は重要
age -o test.txt.age -r ageXXXXXXXXXXXXXXX -e ./test.txt
# 秘密鍵を使い、暗号化されたファイルの中身を復号  注: オプション順序は重要
age -o ./test_readable.txt -i ./age.pkey -d ./test.txt.age

基本は上記のような形です。

続いて、「復号できる人」を増やしたパターンです。 usr1さんとusr2さんが読めるシチュエーションは以下のようにして実現できます。

age-keygen -o ./usr1.pkey
age-keygen -o ./usr2.pkey
age -o test.txt.age -r ageXXXXXXXXXXXXXXXXXXXXXX -r ageYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY  -e ./test.txt
age -o test.usr1.txt -i ./usr1.pkey -d ./test.txt.age
age -o test.usr2.txt -i ./usr2.pkey -d ./test.txt.age

ageは秘密鍵ではなく、単なる「パスワード付き暗号化ファイル」を作成できます

age -p password.txt > password.txt.age # パスワードを入力して暗号化
age -o readable.txt -d ./password.txt.age # パスワードがあっていれば復号できる

よって「秘密鍵」を「パスワード付きで暗号化」すれば、「パスフレーズが必要で暗号化されたファイル」を作成できます。(正確には使う時にパスワードが必要な秘密鍵を作成する)

age-keygen | age -p > age.pkey
age -o test.txt.age -r ageXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -e ./test.txt
age -o test.readable.txt -i ./age.pkey -d ./test.txt.age

これらのツールの良さ

実はこういったことが出来るメジャーなツールがあります。GnuPGです。 が、gpgって色々コマンドあるんですよね。全く覚えられない。 更にはgpgがUbuntuとかだと入ってるの古いし、かといっていい感じの野良リポジトリも見つからず、色々面倒な側面があります。WindowsやMacなら問題ないのですが、Linuxはmakeしろよという中々億劫さです。
これらはクラスプラットフォームですし、なによりシングルバイナリで導入が楽です。軽量で良いと思いました。

…とはいえいつ使うか私には需要が何もない気がしますが、公開鍵方式の改めての復習にもなり、良いツールに巡り会えたと思いました。