RSA 鍵ペアを使って任意の文字列を暗号化・復号する


はじめに

ある文字列を気軽に暗号化・復号したい場合に、端末の ~/.ssh 配下にある RSA 鍵ペアを使えばいいのではと思いついたので、調べてみました。


方法


準備

まず公開鍵 ~/.ssh/id_rsa.pub と秘密鍵 ~/.ssh/id_rsa のペアを作成します。

$ ssh-keygen -t rsa -b 4096

ただし出力された公開鍵は ssh.com (SECSH) 形式で OpenSSL では扱えないので、~/.ssh/id_rsa.pub.pem として PEM 形式に変換します。

$ ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PKCS8 > ~/.ssh/id_rsa.pub.pem


暗号化

佐倉杏子 という文字列を公開鍵で暗号化して、出力されたバイナリを 16 進数文字列に変換します。

$ echo '佐倉杏子' | openssl rsautl -encrypt -pubin -inkey ~/.ssh/id_rsa.pub.pem | xxd -p | tr -d '\n'

19901805998070d3ae93f59ad3caa0ae63dac078736779a3dbfad76c152a02e9729c2c3f43fd45db5b98c8141345b63d601afe16808705f1b6a911282cd99bc7a2a44a2c5437f6bb45b220230a4d156a7ccc29ce2cbcc457f83f741b0b06aca66c77da8e6a634bb57723076ae9c17c1cf2d80cdbf29aa3846e2d446bed9ac0879b4c60973b6414d91c6309c570857459d5f474ad3edeb3d8b358e43d7484061558b20ea341a864e67559970c1925677a740ed454fd20d654230698cbdeb9cde1647100078ec3903d53bc41001983a5a246e1095860b2c6c082e417c4e8dadef98b67e97fd1e2503f6d42cae1ca7e582aa1b3f864395281ca01f4b53070c2395da984b71044bb1b664cddf288fb41584eec7011b9f8b5f5097c2ad84d65251fe856306743b7c6fdb7d9cc7f1cc1fe1e4a060a3551550c6a853b05199fd9a40dbbee63ad9bd1e3d6808c99ab50ae344c17c0e2188227f8da25c033161dd5d3394b3157fd75aa71c82475f62c023254b9b58b230928abef8bee4ff227cd5697113cc0c805599b949f79811120e1bad2e51756817eb532727bcd5aa844fe2780dfbc53ecd0875138ed9ae65c3fa91455a5c3b3d252d06bb5f9dc5459f68c1f66d1f136a3e6608ab744e1dbddde73b5fa00ca1c52906544f5e01c2e7e57b262c7b2309bbef0cae3095687b62565f44e8698822e5b309e18284b66081e036224838eaf


復号

16 進数文字列をバイナリに変換し、それを秘密鍵で復号します。

$ ENCRYPTED=19901805998070d3ae93f59ad3caa0ae63dac078736779a3dbfad76c152a02e9729c2c3f4b98c8141345b63d601afe16808705f1b6a911282cd99bc7a2a44a2c5437f6bb45b220230a4d156a7ccc29ce2cbcc457f83f741b0b06aca66c77da8e6a634bb57723076ae9c17c1cf2d80cdbf29aa3846e2d446bed9ac0879b4c60973b6414d91c6309c570857459d5f474ad3edeb3d8b358e43d7484061558b20ea341a864e67559970c1925677a740ed454fd20d654230698cbdeb9cde1647100078ec3903d53bc41001983a5a246e1095860b2c6c082e417c4e8dadef98b67e97fd1e2503f6d42cae1ca7e582aa1b3f864395281ca01f4b53070c2395da984b71044bb1b664cddf288fb41584eec7011b9f8b5f5097c2ad84d65251fe856306743b7c6fdb7d9cc7f1cc1fe1e4a060a3551550c6a853b05199fd9a40dbbee63ad9bd1e3d6808c99ab50ae344c17c0e2188227f8da25c033161dd5d3394b3157fd75aa71c82475f62c023254b9b58b230928abef8bee4ff227cd5697113cc0c805599b949f79811120e1bad2e51756817eb532727bcd5aa844fe2780dfbc53ecd0875138ed9ae65c3fa91455a5c3b3d252d06bb5f9dc5459f68c1f66d1f136a3e6608ab744e1dbddde73b5fa00ca1c52906544f5e01c2e7e57b262c7b2309bbef0cae3095687b62565f44e8698822e5b309e18284b66081e036224838eaf

$ echo -n $ENCRYPTED | xxd -r -p | openssl rsautl -decrypt -inkey ~/.ssh/id_rsa
佐倉杏子


参考