J'ai fait une plongée excessive dans le format après avoir suivi les liens de Scott pour les funsies. TLDR:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...
| "ssh-rsa" |exponent| modulus
La RFC4231 spécifie les deux types de données utilisés:
string
: Chaîne binaire de longueur arbitraire. Les chaînes peuvent contenir des données binaires arbitraires, y compris des caractères nuls et des caractères 8 bits. Ils sont stockés comme uint32
contenant sa longueur
mpint
: Représente plusieurs entiers de précision au format complément à deux, stockés sous forme de chaîne, 8 bits par octet, MSB en premier. [...]
RFC4253 sec 6.6 dit que la clé est codée comme suit :
Le format de clé "ssh-rsa" a l'encodage spécifique suivant:
string "ssh-rsa"
mpint e
mpint n
Ici, les paramètres «e» et «n» forment le blob de clé de signature. [Ed: mais le blob semble également contenir la chaîne "ssh-rsa"
...]
La signature résultante est codée comme suit:
string "ssh-rsa"
string rsa_signature_blob
La valeur de 'rsa_signature_blob' est codée comme une chaîne contenant s [Ed: ne sais pas ce qu'est s.] ( Qui est un entier, sans longueur ni remplissage, non signé et dans l'ordre des octets du réseau).
"ssh-rsa"
La chaîne ssh-rsa
est convertie en \x00\x00\x00\x07ssh-rsa
, qui l'encode ensuite AAAAB3NzaC1yc2E=
, donc toutes les clés ssh-rsa doivent commencer par cela.
e
, l'exposant public
Habituellement, quelque chose comme 3, 17, 257, 65537. Ces nombres sont encodés comme ci-dessous (avec le décalage de fin par rapport au dessus)
- 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
Donc, si vous voyez "BAw", votre exposant était 3, ou "DAQAB" = 65537
n
, le module (produit de vos deux nombres premiers secrets, factorisez cela!)
AAABAQ
après ce qui précède signifie que votre longueur de clé est de 2048 bits (et que votre exposant était comme DAQAB en raison du remplissage en base64). Le reste de la base64 est l'exposant, il n'y a rien après.
Autres préfixes de module qui peuvent être courants:
AAAAg
1024 bits, e = 0x10001
AAAQI
: 2048 bits, e = 3
AAAAB3NzaC1yc2EAAAA
donc je suppose que c'est une sorte d'identifiant de type / version d'algo commun ...