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 uint32contendo 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!)
AAABAQapó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
AAAAB3NzaC1yc2EAAAAentão acho que é algum tipo de identificador de tipo / versão de algo comum ...