その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

相手の GitHub の ID さえ知っていれば暗号化したメッセージを送れる naisho というのを作った

色々な事情があり,秘密のメッセージを送り合う必要性が今年に入ってから多数発生していて,
そのたびに毎度毎度手で暗号化して〜みたいな風にやるのめんどいですね,そうですね,
ということでこの度 naisho というものをこさえました.みんなには内緒ですよ.


これは何かと言うと,やりとりしたい相手の GitHub の ID を指定するだけで

  • その ID のユーザの ssh-rsa の公開鍵を引っ張ってきて
  • その ID のユーザのメールアドレスを引っ張ってきて
  • そのメールアドレスに対して公開鍵で暗号化したメッセージを添付ファイルにしてメールで送りつける

という動きをするコマンドです.
golang で書きたかったというのと golang で書くと便利なのではと思ったので golang で書いてあります.


Wercker で Go のプロジェクトをクロスコンパイルし、GitHub にリリースする - 詩と創作・思索のひろばや,
werckerでgithubにreleaseをdeployするまでの道のり - yuukichiの日記
を参考にすることで、wercker でバイナリをビルドして GitHub Releases に成果物を設置するということも出来ました.
Releases · moznion/naisho · GitHub からお手軽に入手頂けます.


さて使い方としては

$ naisho <Target GitHub ID> <Message>

としてやるだけで,対象の GitHub ID のユーザーに暗号化した Message を添付ファイルにしてメールで送りつける事ができます.
受け取った側は openssl さえ持っていれば良くて,

$ openssl rsautl -decrypt -inkey <Your Secret Key> -in <Attachment>

という感じで,公開鍵と対応している秘密鍵と添付ファイルを指定してやるだけで内容を読むことが出来ます.


中身の仕組みですが,GitHubhttps://github.com/<user-id>.key という所にアクセスすると,
任意のユーザの ssh-rsa 公開鍵の一覧を引っ張ってこれるという機能があるので *1
ここから一番上の公開鍵を引っ張ってきてそれで暗号化しています.
送信先メールアドレスはプロフィールページ (つまりhttps://github.com/<user-id>) に書いてあるメールアドレスを
GitHub API 経由で取得してくることができるのでそれで取ってきています.
従って,当然ですが公開鍵を登録していないユーザや,メールアドレスを公開していないユーザには送ることが出来ません.残念!


使う鍵の鍵長によって暗号化出来るバイト数が変わってきて,

鍵長ビット 暗号化可能バイト
1024bit 117byte
2048bit 246byte
4096bit 502byte
8192bit 1018byte

という感じなので,そこまで長いメッセージは送れないという世界観です (バイト数が溢れると暗号化に際してエラーが出る).

しかしこれは十分な長さです! これで私にクレジットカードの番号や WebMoney のコード等を安全に送り放題ですね!! やりました!!!


今後の予定としてはファイル入力を受け付けられたり,使う公開鍵をインタラクティブに選べたりできたら良いなあとぼんやり思っています.あとエラーメッセージが雑極まりないので直したいですね!
ご利用くださいませ.

*1:ゆくゆくは無くなるらしい……