เหตุใดคีย์สาธารณะสองคีย์ของฉันจึงมีจุดเริ่มต้นเหมือนกัน


25

ฉันกำลังอัปเดตไฟล์ authorized_keys บนเซิร์ฟเวอร์ของฉันด้วยรหัสสาธารณะสำหรับแล็ปท็อปเครื่องใหม่ที่ฉันได้รับและฉันรู้สึกประหลาดใจเมื่อพบว่ากุญแจสาธารณะสองอันเริ่มเหมือนกัน

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

เรื่องราวของAAAAB3...ฯลฯ คืออะไร? เมื่อค้นหาออนไลน์ฉันเห็นว่าปุ่มอื่น ๆ เริ่มต้นเหมือนกัน มันอธิบายอัลกอริทึมหรือรุ่นหรือบางอย่าง?


1
สำหรับสิ่งที่คุ้มค่าฉันมี 7 ปุ่มที่สร้างขึ้นในระยะเวลาไม่กี่ปีในคอมพิวเตอร์หลายเครื่องและพวกมันเริ่มต้นด้วยAAAAB3NzaC1yc2EAAAAดังนั้นฉันจึงเดาว่ามันเป็นตัวระบุชนิด / รุ่นทั่วไปของอัลโก ...
fukawi2

คำตอบ:


24

นี่คือส่วนหัวที่กำหนดว่าเป็นคีย์ชนิดใด หากคุณตรวจสอบส่วนอัลกอริทึมกุญแจสาธารณะของRFC 4253เราจะเห็นว่าสำหรับคีย์ RSA

รูปแบบคีย์ "ssh-rsa" มีการเข้ารหัสเฉพาะดังต่อไปนี้:

 string    "ssh-rsa"
 mpint     e
 mpint     n

นี่คือพารามิเตอร์ 'e' และ 'n' ในการสร้างคีย์ลายเซ็น blob

ในความเป็นจริงถ้าคุณ Base64 ถอดรหัสสตริง "B3NzaC1yc2E" คุณจะเห็นมันแปลเป็น ASCII เป็น "ssh-rsa" สันนิษฐานว่า "AAAA" หมายถึงส่วนหัวบางส่วนเพื่อให้แอปพลิเคชันสามารถรู้ได้ว่าตรงไหนในสตรีมข้อมูลเพื่อเริ่มการประมวลผลคีย์


ดูเหมือนจะคล้ายกับสิ่งที่ฉันพูดอย่างน่าทึ่งรวมถึงลิงก์ไปยัง RFC
larsks

@larsks: เห็นได้ชัดว่าคุณกดส่งในขณะที่ฉันยังคงเขียนของฉัน
Scott Pack

15

รูปแบบที่สำคัญ SSH ประชาชนจะได้บันทึกไว้ในRFC 4253และสรุปค่อนข้างที่นี่ ข้อมูลที่เข้ารหัส PEM ประกอบด้วยจำนวนของ (ความยาว, ข้อมูล) คู่และคู่แรกถอดรหัสชื่อขั้นตอนวิธีการที่เป็นไปได้สิ่งที่ต้องการหรือssh-rsassh-dsa

ซึ่งหมายความว่าส่วนเริ่มต้นของข้อมูลคีย์สาธารณะสำหรับคีย์ ssh ทั้งหมดจะใกล้เคียงกัน


2

ฉันดำน้ำลึกเข้าไปในรูปแบบหลังจากทำตามลิงก์ของ Scott สำหรับเรื่องตลก TLDR:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...
       |  "ssh-rsa"   |exponent|   modulus

RFC4231ระบุสองประเภทข้อมูลที่ใช้:

  • string: สตริงไบนารีความยาวโดยพลการ สตริงได้รับอนุญาตให้มีข้อมูลไบนารีโดยพลการรวมถึงตัวละครโมฆะและตัวอักษร 8 บิต พวกเขาจะถูกเก็บไว้เป็นuint32ความยาวที่มี

  • mpint: แสดงจำนวนเต็มความแม่นยำหลายรายการในรูปแบบที่สมบูรณ์สองจัดเก็บเป็นสตริง 8 บิตต่อไบต์ MSB ก่อน [ ... ]

RFC4253 sec 6.6บอกว่ารหัสถูกเข้ารหัสเมื่อ:

รูปแบบคีย์ "ssh-rsa" มีการเข้ารหัสเฉพาะดังต่อไปนี้:

string    "ssh-rsa"
mpint     e
mpint     n

นี่คือพารามิเตอร์ 'e' และ 'n' ในการสร้างคีย์ลายเซ็น blob [Ed: แต่หยดก็ดูเหมือนจะมีสตริง"ssh-rsa"เช่นกัน ... ]

ลายเซ็นที่ได้รับมีการเข้ารหัสดังนี้:

string    "ssh-rsa"
string    rsa_signature_blob

ค่าของ 'rsa_signature_blob' ถูกเข้ารหัสเป็นสตริงที่มี s [Ed: ไม่ทราบว่า s คืออะไร] (ซึ่งเป็นจำนวนเต็มโดยไม่มีความยาวหรือการเว้นวรรคไม่ได้ลงนามและตามลำดับเครือข่าย)

"ssh-rsa"

สตริงssh-rsaจะถูกแปลงเป็น\x00\x00\x00\x07ssh-rsaซึ่งจะเข้ารหัสAAAAB3NzaC1yc2E=ดังนั้นคีย์ ssh-rsa ทั้งหมดควรเริ่มต้นด้วย

eเลขชี้กำลังสาธารณะ

โดยทั่วไปแล้วจะมีลักษณะเช่น 3, 17, 257, 65537 ตัวเลขเหล่านั้นได้รับการเข้ารหัสดังนี้ด้านล่าง

  • 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

ดังนั้นถ้าคุณเห็น "BAw" เลขชี้กำลังของคุณคือ 3 หรือ "DAQAB" = 65537

n, โมดูลัส (ผลิตภัณฑ์ของสองช่วงเวลาลับของคุณปัจจัยนี้!)

AAABAQหลังจากด้านบนหมายความว่าความยาวของคีย์ของคุณคือ 2048 บิต (และเลขชี้กำลังของคุณเป็นเหมือน DAQAB เนื่องจากฐานรอง 64) ส่วนที่เหลือทั้งหมดของ base64 คือเลขชี้กำลังไม่มีอะไรหลังจากนั้น

คำนำหน้าโมดูลัสอื่น ๆ ที่อาจพบได้ทั่วไป

  • AAAAg 1024 บิต e = 0x10001
  • AAAQI: 2048 บิต e = 3
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.