ssh-keygenで生成した鍵を使ってGo言語でencrypt/decryptすることについて調べていた
朝から雨。夕方出かけるまでは家にいることにしたので調べ物を進める。
何をしていたかというと、ssh-keygenコマンドを使うとSSHの認証で使う秘密鍵と公開鍵が生成できる。これを使うと任意のデータをencrypt/decryptできるはずなので、Go言語で試していた。
ハマっていたポイントとしては、ssh-keygenで鍵を生成する際にフォーマットを指定しないとRFC4716のSSH2 public key形式で公開鍵が生成され、これを使う場合ちょっと工夫が必要だ、という所。
どういうことかというと、pkcs8フォーマットを指定しておくと以下のような公開鍵になる。これはGo言語ではx509.ParsePKIXPublicKeyを使うと楽にパースでき、encryptに使うことができる。
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8g7SjDm5MvvCK/ML7k+x
6NhAcnKidcUSBwsbf/8Iv+eW7M8uMjAnKhctiW/qObpkIw+bqAIRF3nncm14pr3/
NZV3LMtYkU7qPN1HY3+HjRxe/v6DaTBITcznATqIHzpJkpU8QZOMJMNbI2zrH5b9
ggtB7S7u3PamQgU0RoD2AQHfFTCcIj5nupJn47DpCOyRMTAFRfMkDD8EW3MyZvHs
d5W20meinXf5b7XpVRUpDhi+/N5sRKyXl5YCjJLX0UNwKDFVhvnCxqiYAh1362xX
I6LFuB+phxoJEBT/yZGPAqs5dyBL/mOAE+ELyk1iFkIqqll5xV9gP6wmln9HqlOl
SwIDAQAB
-----END PUBLIC KEY-----
しかし、フォーマットを指定しないと以下のようなよく見るフォーマットになり(これがRFC4716らしい)、これをGoで扱う場合は加工してrsa.Publickeyを作成する必要があった。
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDyDtKMObky+8Ir8wvuT7Ho2EBycqJ1xRIHCxt//wi/55bszy4yMCcqFy2Jb+o5umQjD5uoAhEXeedybXimvf81lXcsy1iRTuo83Udjf4eNHF7+/oNpMEhNzOcBOogfOkmSlTxBk4wkw1sjbOsflv2CC0HtLu7c9qZCBTRGgPYBAd8VMJwiPme6kmfjsOkI7JExMAVF8yQMPwRbczJm8ex3lbbSZ6Kdd/lvtelVFSkOGL783mxErJeXlgKMktfRQ3AoMVWG+cLGqJgCHXfrbFcjosW4H6mHGgkQFP/JkY8Cqzl3IEv+Y4AT4QvKTWIWQiqqWXnFX2A/rCaWf0eqU6VL r_takaishi@takaishiryou-no-iMac.local
いろいろ調べつつ途中まで書いた所で SSH 公開鍵ユーティリティを Go と Python で作った という記事を発見。exponentとmodulesの扱いについて参考にした。これをインポートして使ってもよさそうだなあ。
検証のためのコードや参考リンクについては以下を参照していただきたい。