回答:
これは実際には、これがどの種類のキーであるかを定義するヘッダーです。RFC 4253の公開鍵アルゴリズムのセクションをチェックアウトすると、RSA鍵について確認できます。
「ssh-rsa」キー形式には、次の特定のエンコーディングがあります。
string "ssh-rsa" mpint e mpint n
ここで、「e」および「n」パラメータは署名キーblobを形成します。
実際、Base64で文字列「B3NzaC1yc2E」をデコードすると、「ssh-rsa」としてASCIIに変換されます。おそらく「AAAA」は何らかの種類のヘッダーを表しているため、アプリケーションはデータストリームのどこでキーの処理を開始するかを正確に知ることができます。
スコットのファンシーへのリンクをたどった後、私はこのフォーマットを深く掘り下げました。TLDR:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...
| "ssh-rsa" |exponent| modulus
RFC4231は、使用される2つのデータ型を指定しています。
string
:任意の長さのバイナリ文字列。文字列には、ヌル文字や8ビット文字を含む任意のバイナリデータを含めることができます。それらはuint32
その長さを含むとして保存されます
mpint
:2の補数形式の複数の精度の整数を表し、1バイトあたり8ビット、MSBファーストの文字列として格納されます。[...]
RFC4253 sec 6.6では、キーは次のようにエンコードされています。
「ssh-rsa」キー形式には、次の特定のエンコーディングがあります。
string "ssh-rsa" mpint e mpint n
ここで、「e」および「n」パラメータは署名キーblobを形成します。[Ed:ただし、blobには文字列も含ま
"ssh-rsa"
れているようです...]結果の署名は次のようにエンコードされます。
string "ssh-rsa" string rsa_signature_blob
'rsa_signature_blob'の値は、sを含む文字列としてエンコードされます[Ed:sが何であるか分からない。](整数で、長さやパディングなし、符号なし、ネットワークバイト順)。
"ssh-rsa"
文字列ssh-rsa
はに変換され\x00\x00\x00\x07ssh-rsa
、次ににエンコードされるAAAAB3NzaC1yc2E=
ため、すべてのssh-rsaキーはそれで始まる必要があります。
e
、公開指数通常、3、17、257、65537のようなものです。これらの数値は、以下のようにエンコードされます(上からの末尾オフセット付き)
'\x00\x00\x00\x01\x03'
→→AAAABAw
'\x00\x00\x00\x01\x11'
→→AAAABEQ
'\x00\x00\x00\x02\x01\x01'
→→AAAACAQE
'\x00\x00\x00\x03\x01\x00\x01'
→→AAAADAQAB
したがって、「BAw」と表示された場合、指数は3、または「DAQAB」= 65537でした。
n
、モジュラス(2つの秘密の素数の積、これを因数分解します!)AAABAQ
上記の後は、キーの長さが2048ビットであることを意味します(また、base64のパディングのために指数はDAQABのようでした)。base64の残りの部分はすべて指数であり、後は何もありません。
一般的な他のモジュラスプレフィックス:
AAAAg
1024ビット、e = 0x10001AAAQI
:2048ビット、e = 3
AAAAB3NzaC1yc2EAAAA
私はそれを推測しているので、共通のアルゴ種類/バージョン識別子のいくつかの種類の...