みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

SSHの鍵を作ってみた

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

SSHの鍵を作ってみた

投稿記事 by みけCAT » 11年前

みなさん、SSHは便利ですよね!…え?使ったことない?それは人生の何%かはあえて言及しませんが、正の割合損していますよ!

ところで、SSH接続をするときに必ず使うような気がする「鍵」。
鍵作成ソフトでボタンを押してしばらく待ったり、指を動かしまくってしばらく待ったりすると生成されますが、
どのようにして生成されているのでしょうか?

というわけで、今回はその鍵を作ってみました。
まずはTeraTermで鍵を作り、その構造を見てみます。今回はRSAの鍵を対象とします。
RSAの鍵データには、大きく分けて比較的短い「公開鍵」と、比較的長い「秘密鍵」の2種類があります。
どちらもbase64で符号化されているので、まずはデコードしてバイナリエディタで見てみましょう。

公開鍵のフォーマットはRFC4253のSection 6.6に書かれており、RSAなら識別子、e、nを書けばよさそうです。
ここで使用されるデータ型の説明はRFC4251のSection 5にあります。
これを素直に解釈すれば、問題はなさそうです。
ssh_rsa_key_test1.png
SSH公開鍵のデータの構造
この表示に使用しているTSXBIN用マクロ
► スポイラーを表示
というわけで、問題は軽くググっただけではそれっぽいRFCが見つからなかった秘密鍵です。
とりあえずbase64をデコードしてバイナリエディタで開くと、公開鍵に書かれていたnのデータがあり、その下にeらしきデータも見えます。
さらに詳しく見ていくと、

CODE:

0x30 (形式情報?例えばBMPファイルなら"BM"みたいなやつ?)
これ以降のデータサイズ
0x02 0x01 0x00 (よくわからない)
0x02 nのデータ
0x02 eのデータ
(0x02 何かの整数のデータ)×6個
のような形式になっていました。
「何かの整数のデータ」は、nやeのデータと同じような形式だったので、整数と予想できました。
各整数のデータの先頭には、以下のような形式のサイズ情報があり、「これ以降のデータサイズ」も同じ形式のようでした。
  • サイズが0x80未満の場合は、そのまま1バイトで記録
  • サイズが0x80以上の場合は、まず(記録に必要なバイト数|0x80)を記録し、
    次にサイズをそのバイト数のビッグエンディアンで記録
そこで、まずはbase64デコードした秘密鍵のデータをテキストに書き出すプログラムを作りました。
(注:解析したデータを後で反映させたため、データの説明が未知ではなくきちんと書かれている)
► スポイラーを表示
コマンドラインで「使用する素数の」ビット数、公開鍵ファイル、秘密鍵ファイルを指定して実行し、
しばらく待つと名状しがたいSSH鍵のようなものが生成されます。
セキュリティの強度はどうかわかりませんが、VineLinuxとTeraTermを利用した認証の実験には成功しました。

…というわけで、次の目標はこれをJavaScriptに移植することですかね…
JavaScriptに移植すればwebブラウザ上で実行できるだけでなく、サクラエディタのマクロにも乗せられます。
しかし、JavaScriptではGMPは使えない[要出典]ので、自分で多倍長計算を実装しないといけません。
まあ、それはそのうちに。
添付ファイル
gmp_build_failed.png
GMP5.1.3ビルド失敗!?
gmp_build_failed.png (44.16 KiB) 閲覧数: 275 回

Poco
記事: 161
登録日時: 14年前

RE: SSHの鍵を作ってみた

投稿記事 by Poco » 11年前

みけCAT さんが書きました:

CODE:

0x30 (形式情報?例えばBMPファイルなら"BM"みたいなやつ?)
これ以降のデータサイズ
0x02 0x01 0x00 (よくわからない)
0x02 nのデータ
0x02 eのデータ
(0x02 何かの整数のデータ)×6個
のような形式になっていました。
「何かの整数のデータ」は、nやeのデータと同じような形式だったので、整数と予想できました。
多分、ASN.1とかBERとか言われる符号化方式かと。