repl.info

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の扱いについて参考にした。これをインポートして使ってもよさそうだなあ。

動いた動いた、と外の様子を見たら雪に変わっていた

検証のためのコードや参考リンクについては以下を参照していただきたい。