それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ssh公開鍵を使って文字列を暗号化して送る

公開鍵暗号方式をもっと身近に使う。

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

githubssh の公開鍵は、一行に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

http://qiita.com/kunichiko/items/3c0b1a2915e9dacbd4c1