Neden iki ssh açık anahtarım aynı başlangıçta?


25

Sunucumdaki yetkili_keys dosyasını, aldığım yeni dizüstü bilgisayarın genel anahtarı ile güncelliyordum ve bu iki genel anahtarın aynı şekilde başladığını öğrendiğimde şaşırdım:

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

Hikaye nedir AAAAB3...vb? Bazıları çevrimiçi arama yaparken, diğerlerinin de aynı şekilde başladığını görüyorum. Algoritmayı veya versiyonunu açıklar mı?


1
Buna değer, birkaç yıl boyunca 7 anahtar AAAAB3NzaC1yc2EAAAA
ürettim

Yanıtlar:


24

Bu aslında bunun ne tür bir anahtar olduğunu tanımlayan bir başlık. RFC 4253’ün Genel Anahtar Algoritması bölümüne bakarsanız, bunu RSA anahtarları için görebiliriz.

"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.

Aslında, Base64'ün "B3NzaC1yc2E" dizesini çözmesi durumunda, ASCII'ye "ssh-rsa" olarak çevrildiğini göreceksiniz. Muhtemelen "AAAA" bir çeşit başlığı temsil eder, böylece uygulama anahtarı işlemeye başlamak için veri akışında tam olarak nerede olduğunu bilir.


Bu, RFC'ye bağlantı da dahil, söylediklerime oldukça benziyor.
larsks

@larsks: Görünüşe göre ben hala benim yazarken, gönder düğmesine basıyorsun.
Scott Pack

15

SSH ortak anahtar formatı RFC 4253'te belgelenmiştir ve burada bir şekilde özetlenmiştir . PEM kodlanmış veriler birkaç (uzunluk, veri) çiftten oluşur ve ilk çift, ssh-rsaveya gibi bir şey olacak olan algoritma adını kodlar ssh-dsa.

Bu, tüm ssh anahtarları için ortak anahtar verilerinin ilk bölümünün benzer olacağı anlamına gelir.


2

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. uint32Uzunluğ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-rsadö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!)

AAABAQYukarı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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.