~/.ssh 以下の SSH キーは
秘密鍵は PEM 形式なので OpenSSL でそのまま使えるのだが、
秘密鍵は OpenSSH の独自形式(?)(
RFC4716 形式を1行に展開したような形式) になっているので、
そのままでは OpenSSL で処理出来ない。
このため ssh-keygen -e で PKCS8 形式に export する必要がある。
それぞれの形式に export するには、以下のようにすれば良い。
ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PKCS8 > id_rsa.pub.PKCS8
ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PEM > id_rsa.pub.PEM # これは OpenSSL では使えない???
ssh-keygen -f ~/.ssh/id_rsa.pub -e -m RFC4716 > id_rsa.pub.RFC4716 # これは OpenSSL では使えない
あとは以下のようにすれば RSA による暗号化と復号化が行える。
openssl rsautl -encrypt -inkey ~/.ssh/id_rsa < file > file.encrypted # RSA 秘密鍵に含まれる公開鍵による暗号化
openssl rsautl -encrypt -inkey id_rsa.pub.PEM -pubin < file > file.encrypted # RSA 公開鍵から PEM 形式で export した公開鍵による暗号化 (pubkey が上手く読めない模様)
openssl rsautl -encrypt -inkey id_rsa.pub.PKCS8 -pubin < file > file.encrypted # RSA 公開鍵から PKCS8 形式で export した公開鍵による暗号化
openssl rsautl -decrypt -inkey ~/.ssh/id_rsa < file.encrypted > file.decrypted # RSA 秘密鍵による復号化
公開鍵暗号なので、秘密鍵は相手に渡してはいけない。
従って、まず相手に何らかの方法で公開鍵を渡し、その公開鍵で暗号化してもらったものを、こちらで復号化するという使い方になる。
此方から相手に送る際は、何らかの方法で入手した相手の公開鍵で暗号化する必要がある。
公開鍵の受け渡しは、普通は man in middle で改竄されるところまで心配する必要はないはずなのでメールか web で渡せば十分だろう。
どうしても心配なら電話等で fingerprint を確認すればなんとかなるはず。
また、公開鍵暗号である RSA は遅いので、実用的には AES 等の共通鍵暗号で暗号化して、RSA でその共通鍵を暗号化するという使い方になる。
あと rsautl に対応する dsautl, ecutil 等のサブコマンドが見当たらなかったので DSA と ECDSA による encrypt/decrypt する方法は要調査。
pkeyutl は RSA は通るけど DSA と EC はなぜか上手くいない。鍵の作り方が悪いのか???
追記: 2015-03-18
DSA と ECDSA は電子署名の規格なので、公開鍵による暗号化と復号化 (encrypt, decrypt) は出来ない模様。
署名と検証 (sign, verify) は問題なく出来た。
openssl pkeyutl #
EC ALGORITHM では sign, verify で ECDSA と derive で ECDH をサポートしているとの事。
以下のようにすると ECDH により同じ値が得られる。
openssl pkeyutl -derive -inkey my_ecdsa -peerkey your_ecdsa.pub
openssl pkeyutl -derive -inkey your_ecdsa -peerkey my_ecdsa.pub
毎回同じ値しか得られないので、どちらか一方が使い捨ての ec ペアを使えば良いのかな?
追記: 2015-03-23
ECDSA キーペアと AES256 による暗号化スクリプトを書いてみた。
- Gist / kou1okada / ec-aes256.sh
新しく ECDSA キーペアを生成して暗号化した場合、その場で秘密鍵を破棄すると、相手以外には自分も含めて誰も(現状では天文学的な確率でしか)復号出来なくなるはず。
秘密鍵の機密性について担保出来てさえいるなら、普通はそこまでする必要はない筈だけど。
参考: