質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

Q&A

解決済

2回答

3014閲覧

秘密鍵で少し内容を変更したのに通ってしまいます。

mint.cherry

総合スコア284

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

0グッド

2クリップ

投稿2016/07/26 09:46

なんとなーく通らないだろうなぁと思って遊びで変更しました。

秘密鍵変更前

-----BEGIN RSA PRIVATE KEY----- (略) MAuOMgy7XXTmkAZ2zIO7wdXYeiNhZKeXOffB0VsSMs2VCi0yUKmq -----END RSA PRIVATE KEY-----

秘密鍵変更後(最後の「q」を「a」にしました。)

-----BEGIN RSA PRIVATE KEY----- (略) MAuOMgy7XXTmkAZ2zIO7wdXYeiNhZKeXOffB0VsSMs2VCi0yUKma -----END RSA PRIVATE KEY-----

これで鍵が認証され通ってしまいました。登録したときとまったく同じ内容なら認証が通るのではないのでしょうか…なぜ通ったのでしょうか。

当たり前ですが最後の一文字消したら通らなかったです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

SSHの秘密鍵はPEM形式と言われるフォーマットでかかれています。この形式はバイナリのデータをBASE64でエンコードし、テキストにした物です。そしてこのバイナリデータには、秘密鍵の元にある二つの素数だけでなく、そこからつくられる(暗号処理に使われる)秘密鍵のほか、公開鍵や計算上必要になる値などが含まれています(詳細は参考資料を参照のこと)。つまり、大本の二つの素数さえ壊れていなければ、全て復元可能です。

実際のアプリ(というよりOpenSSL)がこれらのデータの全てを使うというわけではありません。秘密鍵の中にはアプリが参照しない部分も含まれると言うことです。もし、一部だけ違った値になっていても、そこがたまたまアプリで使わない部分だったので、そのまま使えてしまったといことだと思います。

なお、文字を消した場合はBASE64のフォーマットが崩れて正常にデコードできなかったと考えられます。BASE64は4文字でワンセット(足り名分は=で埋める)となっているため、文字を消すと4文字セットが崩れるためデコードに失敗します。(緩い制限をするような実装によってはデコードできる場合がありますが、厳密な場合はエラーになります)

参考資料: ※ OpenSSLとありますが、SSHの秘密鍵と公開鍵もこのOpenSSLと同じ仕組みを使っています。
OpenSSLとPythonでRSA暗号の原理を知る - ももいろテクノロジー
RSA鍵、証明書のファイルフォーマットについて - Qiita

投稿2016/07/26 12:57

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mint.cherry

2016/07/28 03:58

回答ありがとうございます。 使わない部分あるということですね。でも使わないところを1文字消してしまうとフォーマットが崩れて認証できなくなったということですね。
guest

0

それはキーそのものじゃなくて、バイナリのキーをBase64エンコーディングしたものです。Base64は、元データを6bitずつに分解して64種類の文字を使って文字化します。
従って、元データのビット数が6の倍数でない場合は、エンコードされた最後の文字は6bit全部が有効でなくどうでもいいビットが混じっていることになります。
Wikipedia:Base64を見ると、それぞれの文字が表すのは、
'q' : 101010
'a' : 011010
と、下4ビットが同一で、より上位のbitだけが異なります。これが無視されるビットに当たっているのでしょう。
'p' とかにすると、通らないと思います。下4bitが同一の 'K'、'6' あたりも通るはずです。下3bitが同一でも通るかもしれません。

追記:
端数がある場合は、上位ビット側が意味を持つようですね。と言うわけで、上記は間違いでした。すいません。下ビットが一致することからの早合点でした。

投稿2016/07/26 13:24

編集2016/07/26 14:54
otn

総合スコア84505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuba

2016/07/26 13:30

いえ、BASE64文字列の最後が==で終わっていない以上、全ビットが有効と読めます。
otn

2016/07/26 14:30

現象からして、= は省略されているのかと思っていました。
mint.cherry

2016/07/28 03:55

回答ありがとうございます。鍵を新しく変えて、なくなっていますが、おそらく、==はなかったです。ssh-keygenコマンドで作ったものです。
otn

2016/07/28 04:25

間違いを投稿して失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問