公開鍵暗号方式をもっと身近に使う。
ssh は公開鍵暗号方式なのは頭でわかっていてもどうも、いまいち身近に感じられない。
公開鍵暗号方式なんだから、公開鍵で暗号化して秘密鍵で復号化したいじゃん
ssh 公開鍵で暗号化する
ssh の公開鍵なら「公開」しているので、相手に暗号化文字列を送るには最適 また受け取った側も、暗号文を自分の秘密鍵で復号化できるので、便利。
ssh 公開鍵を PCKS8に変換
相手のopenssh公開鍵をPCKS8に変換する。
ssh-keygen -f sekisui.keys -e -m PKCS8 > takuya.pkcs8
公開鍵で文字列を暗号化
暗号化したい文字列を入れたファイルを作る。
cat - > mytext-file.txt やるきでろー
あとは、これをOpenSSLのコマンドにかけて暗号化する。
openssl rsautl -encrypt \ -pubin -inkey takuya.pkcs8 \ -in mytext-file.txt \ -out myEncrypted-file.txt
公開鍵の交換が面倒?
そうですね、公開鍵のやり取りが面倒ですね。相手から公開鍵を送ってもらってハッシュ値を貰わないと・・・
github を使うと便利
github は公開鍵を登録しているはずなので、相手のgithub から公開鍵を取り出せばイイ
https://github.com/takuya.keys
github のssh の公開鍵は、一行に1件入ってる形式なので、このままでは暗号化には使えない。
curl https://github.com/takuya.keys | head -n1 > takuya.key
復号化する
復号化は openssl rsautl で行います。
openssl rsautl -decrypt \ -inkey /Users/takuya/.ssh/id_rsa \ -in /Users/takuya/Desktop/encryted.txt \ -out decyped.txt
これで復号化出来ます。
使い所が難しい
SSHの公開鍵で暗号化出来る文字列のサイズは非常に小さい。(元の秘密鍵のサイズに依存するが、1kbでも厳しい
使えるのはパスフレーズぐらい。大きめのファイルは暗号化出来ない。
あいてが、秘密をチャント持っている
あいてが、openssl コマンドを使える状態にある。
opensslコマンドの引数が長くて覚えにくい。
など、ちょっと導入ハードルが高いのが実際のところ。
まぁ、公開鍵暗号方式の学習にはちょうどいいんじゃないかと思いました。
追記
キーの長さと暗号化出来るサイズについて
1024 bit の秘密鍵の場合 88 bit は padding 1024-88 = 936 bit が鍵の長さ 936/8 = 117 byte
ということで、1024 の鍵の場合は117 バイトまで暗号化可能。
鍵の長さが2048の場合 (1024*2-88)/8 = 245 byte になる。ってことかな?鍵の長さ変わったらpadding長も変化するなら計算あわないけど。。。
参考資料
相手のssh公開鍵を使って便利に暗号化する方法 - Qiita
openssl - Convert RSA public key to RSA DER - Stack Overflow