オレオレ証明書の署名付きで暗号化して送る


こんなことをしてみた、の記録。

目的

ファイルを暗号化して送りたい。ただし以下の条件で。

条件

  • パスワードは人が覚えられる程度にしたい(4文字くらい)
  • 暗号化されたファイルはそれなりに暗号強度を保ちたい
  • 複合化した内容が正しいか検証したい(送り先にオレオレ証明書があるとして)
  • 圧縮は事前に済ませておく

です。環境はMac。
いえ、Macでなくてもいいんですけど、手元がMacなので。

方針

そこで、こんなことを考えました。

  • 対象ファイルは一つとしよう。 複数ある場合は、事前にzip化しておけばいいし。

ここでは、適当に10MBのファイルを用意します。

dd if=/dev/random of=./rnd.bin bs=1024 count=10240

rnd.binができました。

パスワードの生成

パスワードは英小文字4文字にしよう。それ以上は覚えられない。

# pwgenが入っていなければいれます
brew install pwgen

pwgen -A0 4 1 > pass.key

パスワードが英小文字4文字程度ではBruteforceされてしまうので、sha256で1000回ストレッチします。
スクリプトでもよいのですが、1000回ストレッチするとちょっと遅かったので、Cでやっつけでこさえます。
ソースはこちら

これで、

./sha 1000

とすることで、1000回のストレッチが可能です。パスワードファイル名(pass.key)と暗号鍵ファイル名(cek.key)は決め打ちです。

暗号化

送り先で検証できるように署名をつけよう。

# 秘密鍵を用意します
openssl genrsa 1024 > private-key.pem
# ダイジェストを取得します
openssl dgst -sha256 -sign private-key.pem rnd.bin > rnd.bin.sig

これで、手元にはrnd.bin と rnd.bin.sigの2つのファイルがあります。

ひとまとめにしよう

なんのひねりもなく、安直にtarします。

tar cvf rnd.bin.tar rnd.bin rnd.bin.sig

これで、対象ファイルはrnd.bin.tar一つだけになりました。

役者がそろったので、暗号化します

openssl aes-256-cbc -e -in rnd.bin.tar -out rnd.bin.encrypted -pass file:./cek.key

これで、相手に渡す暗号化ファイル( rnd.bin.encrypted )ができました。

オレオレ証明書の作成

一緒に渡すオレオレ証明書も作ります。有効期限は3日間です。

openssl req -new -x509 -out oreore.crt -key private-key.pem -days 3

できた oreore.crtを相手に渡して信頼してもらえれば完璧です。

相手に渡すもの

以下の3つです。

  • rnd.bin.encrypted (暗号化された実体)
  • oreore.crt (オレオレ証明書。できれば別経路で事前に渡しておきたいところ)
  • パスワード(英小文字4文字。別手段で。電話とか)

複合化

では、受け取った方の処理です。

パスワードの生成

pass.keyファイルに受け取った英小文字4文字のパスワードを書いて保存します。
暗号化の時と同様に、1000回のストレッチをかけると、暗号化時と同じcek.keyが出来上がります。

./sha 1000

複合化

openssl aes-256-cbc -d -in rnd.bin.encrypted -out rnd.bin.tar -pass file:./cek.key

これで、rnd.bin.tar が出来上がります。

ばらす

tar xvf rnd.bin.tar

これで、rnd.bin と rnd.bin.sig がでてきます。

検証する

最後に、でてきたrnd.binが本当に正しいものかを検証します。

# 公開鍵証明書から公開鍵を取り出します
openssl x509 -in oreore.crt -pubkey -noout > public-key.pem
# 署名検証を行います
openssl dgst -sha256 -verify public-key.pem -signature rnd.bin.sig rnd.bin

Verified OK
とでれば、無事検証されたということです。
Verification Failure
であれば、改ざんされた可能性があります。

めでたし。めでたし。

参考

証明書まわり、大変参考になりました。おもしろい。

おわりに

なりすましには対処できません。そこは許容ということで。
また、実際には各OSごとに証明書を扱う作法があると思いますが、そこは置いておきます。

おわり。