Eu mergulhei profundamente no formato depois de seguir os links de Scott por diversão. TLDR:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...
| "ssh-rsa" |exponent| modulus
RFC4231 especifica os dois tipos de dados usados:
string
: String binária de comprimento arbitrário. É permitido que cadeias contenham dados binários arbitrários, incluindo caracteres nulos e caracteres de 8 bits. Eles são armazenados como uint32
contendo seu comprimento
mpint
: Representa vários números inteiros de precisão no formato de complemento de dois, armazenados como uma seqüência de caracteres, 8 bits por byte, primeiro o MSB. [...]
RFC4253 sec 6.6 diz que a chave é codificada como:
O formato da chave "ssh-rsa" possui a seguinte codificação específica:
string "ssh-rsa"
mpint e
mpint n
Aqui, os parâmetros 'e' e 'n' formam o blob da chave de assinatura. [Ed: mas o blob também parece conter a string "ssh-rsa"
também ...]
A assinatura resultante é codificada da seguinte maneira:
string "ssh-rsa"
string rsa_signature_blob
O valor para 'rsa_signature_blob' é codificado como uma sequência que contém s [Ed: não sei o que é.] (Que é um número inteiro, sem comprimentos ou preenchimento, sem sinal e na ordem de bytes da rede).
"ssh-rsa"
A string ssh-rsa
é convertida em \x00\x00\x00\x07ssh-rsa
, que codifica para AAAAB3NzaC1yc2E=
, então todas as chaves ssh-rsa devem começar com isso.
e
, o expoente público
Geralmente algo como 3, 17, 257, 65537. Esses números são codificados como abaixo (com o deslocamento à direita acima)
- 3 →
'\x00\x00\x00\x01\x03'
→AAAABAw
- 17 →
'\x00\x00\x00\x01\x11'
→AAAABEQ
- 257 →
'\x00\x00\x00\x02\x01\x01'
→AAAACAQE
- 65537 / 0x10001 →
'\x00\x00\x00\x03\x01\x00\x01'
→AAAADAQAB
Portanto, se você ver "BAw", seu expoente foi 3 ou "DAQAB" = 65537
n
, o módulo (produto de seus dois primos secretos, considere isso!)
AAABAQ
após o exposto acima, significa que o comprimento da sua chave é 2048 bits (e que seu expoente era como DAQAB por causa do preenchimento da base64). Todo o resto do material base64 é o expoente, não há nada depois.
Outros prefixos de módulo que podem ser comuns:
AAAAg
1024 bits, e = 0x10001
AAAQI
: 2048 bits, e = 3
AAAAB3NzaC1yc2EAAAA
então acho que é algum tipo de identificador de tipo / versão de algo comum ...