Mengapa kunci publik dua ssh saya memiliki awal yang sama?

25

Saya sedang memperbarui file official_keys di server saya dengan kunci publik untuk laptop baru yang saya dapatkan dan saya terkejut menemukan bahwa dua kunci publik mulai sama:

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

Apa ceritanya AAAAB3...dll? Dengan beberapa pencarian online, saya melihat kunci orang lain juga mulai sama. Apakah ini menjelaskan algoritme atau versi atau sesuatu?

Gabe Durazo
sumber
1
Untuk apa nilainya, saya memiliki 7 kunci yang dihasilkan selama beberapa tahun, di berbagai komputer, dan mereka semua mulai dengan AAAAB3NzaC1yc2EAAAAjadi saya kira itu semacam pengidentifikasi jenis / versi algo yang umum ...
fukawi2

Jawaban:

24

Ini sebenarnya adalah header yang mendefinisikan jenis kunci ini. Jika Anda memeriksa bagian Algoritma Kunci Publik RFC 4253 kita bisa melihatnya untuk kunci RSA

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.

Bahkan, jika Anda Base64 decode string "B3NzaC1yc2E" Anda akan melihatnya diterjemahkan ke dalam ASCII sebagai "ssh-rsa". Agaknya "AAAA" mewakili semacam header sehingga aplikasi dapat mengetahui di mana tepatnya dalam aliran data untuk mulai memproses kunci.

Scott Pack
sumber
Ini tampaknya sangat mirip dengan apa yang saya katakan, termasuk tautan ke RFC.
larsks
@ larsks: Rupanya kamu menekan kirim saat aku masih menulis milikku
Scott Pack
15

Format kunci publik SSH didokumentasikan dalam RFC 4253 , dan dirangkum di sini . Data yang dikodekan PEM terdiri dari sejumlah (panjang, data) pasangan, dan pasangan pertama meng-encode nama algoritma, yang akan menjadi sesuatu seperti ssh-rsaatau ssh-dsa.

Ini berarti bahwa bagian awal dari data kunci publik untuk semua kunci ssh akan serupa.

larsks
sumber
2

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 uint32berisi 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-rsadikonversi 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!)

AAABAQsetelah 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
Nick T
sumber