Por que minhas duas chaves públicas ssh têm o mesmo começo?

25

Eu estava atualizando o arquivo allowed_keys no meu servidor com a chave pública do novo laptop que recebi e fiquei surpreso ao descobrir que as duas chaves públicas começaram da mesma forma:

# key 1
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ....
#
# key 2
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ....

Qual é a história, AAAAB3...etc? Com algumas pesquisas on-line, vejo que outras teclas também começam da mesma forma. Isso explica o algoritmo, a versão ou algo assim?

Gabe Durazo
fonte
1
Pelo que vale a pena, eu tenho 7 chaves geradas ao longo de alguns anos, em vários computadores, e todas elas começam, AAAAB3NzaC1yc2EAAAAentão acho que é algum tipo de identificador de tipo / versão de algo comum ...
fukawi2

Respostas:

24

Este é realmente um cabeçalho que define que tipo de chave é essa. Se você verificar a seção Algoritmo de chave pública do RFC 4253 , podemos ver que, para chaves RSA

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.

De fato, se você Base64 decodificar a sequência "B3NzaC1yc2E", verá que ela será traduzida para ASCII como "ssh-rsa". Presumivelmente, o "AAAA" representa algum tipo de cabeçalho para que o aplicativo possa saber exatamente onde exatamente no fluxo de dados iniciar o processamento da chave.

Scott Pack
fonte
Isso parece notavelmente semelhante ao que eu disse, incluindo o link para o RFC.
Larsks
@larsks: Aparentemente, você clica em enviar enquanto eu ainda estava escrevendo o meu.
Scott Pacote
15

O formato da chave pública SSH está documentado na RFC 4253 e resumido aqui . Os dados codificados PEM consistem em vários pares (comprimento, dados) e o primeiro par codifica o nome do algoritmo, que será algo como ssh-rsaou ssh-dsa.

Isso significa que a parte inicial dos dados da chave pública de todas as chaves ssh será semelhante.

larsks
fonte
2

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
Nick T
fonte