Tôi đã tìm hiểu sâu về định dạng sau khi theo các liên kết của Scott cho các cuộc vui. TLDR:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...
| "ssh-rsa" |exponent| modulus
RFC4231 chỉ định hai loại dữ liệu được sử dụng:
string
: Chuỗi nhị phân có độ dài tùy ý. Các chuỗi được phép chứa dữ liệu nhị phân tùy ý, bao gồm các ký tự null và các ký tự 8 bit. Chúng được lưu trữ dưới dạng uint32
chứa chiều dài của nó
mpint
: Đại diện cho nhiều số nguyên chính xác ở định dạng bổ sung của hai, được lưu dưới dạng chuỗi, 8 bit trên mỗi byte, MSB trước. [...]
RFC4253 giây 6.6 cho biết khóa được mã hóa là:
Định dạng khóa "ssh-rsa" có mã hóa cụ thể sau:
string "ssh-rsa"
mpint e
mpint n
Ở đây, các tham số 'e' và 'n' tạo thành blob khóa chữ ký. [Ed: nhưng blob dường như cũng chứa chuỗi "ssh-rsa"
...]
Chữ ký kết quả được mã hóa như sau:
string "ssh-rsa"
string rsa_signature_blob
Giá trị cho 'rsa_signature_blob' được mã hóa dưới dạng một chuỗi chứa s [Ed: không biết s là gì.] (Là một số nguyên, không có độ dài hoặc phần đệm, không dấu và theo thứ tự byte mạng).
"ssh-rsa"
Chuỗi ssh-rsa
được chuyển đổi thành \x00\x00\x00\x07ssh-rsa
, sau đó mã hóa thành AAAAB3NzaC1yc2E=
, vì vậy tất cả các khóa ssh-rsa sẽ bắt đầu với điều đó.
e
, số mũ công cộng
Thông thường một cái gì đó như 3, 17, 257, 65537. Những số đó được mã hóa như bên dưới (với phần bù ở phía trên)
- 3 →
'\x00\x00\x00\x01\x03'
→AAAABAw
- 17 →
'\x00\x00\x00\x01\x11'
→AAAABEQ
- 256 →
'\x00\x00\x00\x02\x01\x01'
→AAAACAQE
- 65537 / 0x10001 →
'\x00\x00\x00\x03\x01\x00\x01'
→AAAADAQAB
Vì vậy, nếu bạn thấy "BAw", số mũ của bạn là 3 hoặc "DAQAB" = 65537
n
, mô-đun (sản phẩm của hai số nguyên tố bí mật của bạn, yếu tố này!)
AAABAQ
sau đây có nghĩa là độ dài khóa của bạn là 2048 bit (và số mũ của bạn giống như DAQAB vì đệm cơ sở64). Toàn bộ phần còn lại của cơ sở64 là số mũ, không có gì sau đó.
Các tiền tố mô đun khác có thể phổ biến:
AAAAg
1024 bit, e = 0x10001
AAAQI
: 2048 bit, e = 3
AAAAB3NzaC1yc2EAAAA
vì vậy tôi đoán đó là một loại định danh phiên bản / loại algo phổ biến ...