Scott'ın eğlence bağlarını takip ettikten sonra formata derinlemesine daldım. TLDR:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...
| "ssh-rsa" |exponent| modulus
RFC4231 , kullanılan iki veri türünü belirtir:
string
: İsteğe bağlı uzunluklu ikili dize. Dizelerin boş karakterler ve 8 bit karakterler dahil olmak üzere isteğe bağlı ikili verileri içermesine izin verilir. uint32
Uzunluğunu içeren olarak depolanırlar
mpint
: İkili tamamlayıcı biçiminde çoklu dize tam sayılarını temsil eder, dizge olarak depolanır, ilk önce bayt başına 8 bit, MSB. [...]
RFC4253 sn 6.6 , anahtarın şu şekilde kodlandığını söyler:
"Ssh-rsa" anahtar formatı aşağıdaki özel kodlamaya sahiptir:
string "ssh-rsa"
mpint e
mpint n
Burada 'e' ve 'n' parametreleri imza anahtarı blob'unu oluşturur. [Ed: ama blob da ipi içeriyor gibi görünüyor "ssh-rsa"
...]
Oluşan imza aşağıdaki gibi kodlanır:
string "ssh-rsa"
string rsa_signature_blob
'Rsa_signature_blob' değeri, s [Ed: s ne olduğunu bilmiyorum.] İçeren bir dize olarak kodlanır (bu bir tamsayı, uzunluk veya dolgu olmadan, imzasız ve ağ bayt sırasına göre).
"ssh-rsa"
Dize ssh-rsa
dönüştürülür \x00\x00\x00\x07ssh-rsa
, sonra kodlanır AAAAB3NzaC1yc2E=
, böylece tüm ssh-rsa anahtarları bununla başlamalıdır.
e
, genel üs
Genellikle 3, 17, 257, 65537 gibi bir şeydir. Bu sayılar aşağıdakine göre kodlanır (takip eden denge yukarıdan)
- 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
Öyleyse, "BAw" görürseniz üssünüz 3 veya "DAQAB" = 65537
n
, modül (iki gizli asalınızın ürünü, bunu hesaba katın!)
AAABAQ
Yukarıdakilerden sonra anahtar uzunluğunuzun 2048 bit olduğu (ve üssünüzün base64 dolgusu nedeniyle DAQAB'a benzemesi anlamına gelir) anlamına gelir. Base64 malzemesinin geri kalanının tamamı üsteldir, sonra hiçbir şey yoktur.
Ortak olabilecek diğer modül önekleri:
AAAAg
1024 bit, e = 0x10001
AAAQI
: 2048 bit, e = 3
AAAAB3NzaC1yc2EAAAA