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

23

Eu estava atualizando o arquivo authorized_keys no meu servidor com a chave pública para o 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 sobre AAAAB3... etc? Com algumas pesquisas on-line, vejo que outras chaves também começam. Explica o algoritmo ou versão ou algo assim?

    
por Gabe Durazo 26.07.2013 / 02:49

3 respostas

22

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

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.

Na verdade, se você Base64 decodificar a string "B3NzaC1yc2E", verá que ela se traduz em ASCII como "ssh-rsa". Presumivelmente, o "AAAA" representa algum tipo de cabeçalho para que o aplicativo possa saber exatamente onde o fluxo de dados começa a processar a chave.

    
por 26.07.2013 / 03:19
14

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

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

    
por 26.07.2013 / 03:16
0

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
por 12.03.2018 / 23:12