Eu fiz um mergulho profundo no formato depois de seguir os links de Scott para diversão. TLDR:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...
| "ssh-rsa" |exponent| modulus
RFC4231 especifica os dois tipos de dados usados:
-
string
:
Cadeia binária de comprimento arbitrário. As cadeias de caracteres podem conter
dados binários arbitrários, incluindo caracteres nulos e 8 bits
personagens. Eles são armazenados como uint32
contendo seu comprimento
-
mpint
:
Representa vários inteiros de precisão no formato de dois complementos,
armazenado como uma string, 8 bits por byte, MSB primeiro. [...]
RFC4253 seg 6.6 diz que a chave está codificada como:
The "ssh-rsa" key format has the following specific encoding:
string "ssh-rsa"
mpint e
mpint n
Here the 'e' and 'n' parameters form the signature key blob. [Ed: but the blob also seems to contain the string "ssh-rsa"
as well...]
The resulting signature is encoded as follows:
string "ssh-rsa"
string rsa_signature_blob
The value for 'rsa_signature_blob' is encoded as a string containing
s [Ed: don't know what s is.] (which is an integer, without lengths or padding, unsigned, and in
network byte order).
"ssh-rsa"
A string ssh-rsa
é convertida para \x00\x00\x00\x07ssh-rsa
, que então 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 final 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
Então, se você ver "BAw", seu expoente era 3, ou "DAQAB" = 65537
n
, o módulo (produto de seus dois primos secretos, fator isso!)
AAABAQ
após o acima, significa que o tamanho da sua chave é 2048 bits (e que seu expoente era como DAQAB por causa do preenchimento de base64). Todo o resto da 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