ฉันดำน้ำลึกเข้าไปในรูปแบบหลังจากทำตามลิงก์ของ 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
AAAAB3NzaC1yc2EAAAA
ดังนั้นฉันจึงเดาว่ามันเป็นตัวระบุชนิด / รุ่นทั่วไปของอัลโก ...