Saya melakukan deep-dive dalam format setelah mengikuti tautan Scott untuk funsies. TLDR:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...
| "ssh-rsa" |exponent| modulus
RFC4231 menentukan dua tipe data yang digunakan:
string
: String biner panjang sewenang-wenang. String diizinkan untuk berisi data biner sewenang-wenang, termasuk karakter nol dan karakter 8-bit. Mereka disimpan sebagai uint32
berisi panjangnya
mpint
: Merupakan beberapa integer presisi dalam format komplemen dua, disimpan sebagai string, 8 bit per byte, MSB pertama. [...]
RFC4253 dtk 6.6 mengatakan kunci disandikan sebagai:
Format kunci "ssh-rsa" memiliki penyandian khusus berikut:
string "ssh-rsa"
mpint e
mpint n
Di sini parameter 'e' dan 'n' membentuk gumpalan kunci tanda tangan. [Ed: tapi gumpalan itu tampaknya juga mengandung string "ssh-rsa"
...]
Tanda tangan yang dihasilkan dikodekan sebagai berikut:
string "ssh-rsa"
string rsa_signature_blob
Nilai untuk 'rsa_signature_blob' dikodekan sebagai string yang berisi [Ed: tidak tahu apa itu.] (Yang merupakan bilangan bulat, tanpa panjang atau bantalan, tanpa tanda, dan dalam urutan byte jaringan).
"ssh-rsa"
String ssh-rsa
dikonversi menjadi \x00\x00\x00\x07ssh-rsa
, yang kemudian dikodekan ke AAAAB3NzaC1yc2E=
, jadi semua kunci ssh-rsa harus dimulai dengan itu.
e
, eksponen publik
Biasanya sekitar 3, 17, 257, 65537. Angka-angka itu disandikan seperti di bawah ini (dengan trailing offset dari atas)
- 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
Jadi, jika Anda melihat "BAw", eksponen Anda adalah 3, atau "DAQAB" = 65537
n
, modulus (produk dari dua bilangan prima rahasia Anda, faktorkan ini!)
AAABAQ
setelah di atas berarti bahwa panjang kunci Anda adalah 2048 bit (dan eksponen Anda seperti DAQAB karena padding base64). Seluruh hal base64 lainnya adalah eksponen, tidak ada apa-apa setelahnya.
Awalan modulus lain yang mungkin umum:
AAAAg
1024 bit, e = 0x10001
AAAQI
: 2048 bit, e = 3
AAAAB3NzaC1yc2EAAAA
jadi saya kira itu semacam pengidentifikasi jenis / versi algo yang umum ...