Tại sao hai khóa công khai ssh của tôi có cùng một khởi đầu?


25

Tôi đang cập nhật tệp ủy quyền trên máy chủ của mình bằng khóa chung cho máy tính xách tay mới mà tôi nhận được và tôi rất ngạc nhiên khi phát hiện ra rằng hai khóa chung bắt đầu giống nhau:

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

Câu chuyện trên là AAAAB3...gì? Với một số tìm kiếm trực tuyến, tôi thấy rằng các phím khác cũng bắt đầu như vậy. Nó giải thích thuật toán hoặc phiên bản hay cái gì đó?


1
Để biết giá trị của nó, tôi có 7 khóa được tạo trong khoảng vài năm, trên các máy tính khác nhau và tất cả chúng đều bắt đầu bằng AAAAB3NzaC1yc2EAAAAvì vậy tôi đoán đó là một loại định danh phiên bản / loại algo phổ biến ...
fukawi2

Câu trả lời:


24

Đây thực sự là một tiêu đề xác định loại khóa này là gì. Nếu bạn kiểm tra phần Thuật toán khóa công khai của RFC 4253, chúng ta có thể thấy điều đó đối với các khóa RSA

Đị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ý.

Trong thực tế, nếu bạn Base64 giải mã chuỗi "B3NzaC1yc2E", bạn sẽ thấy nó dịch thành ASCII là "ssh-rsa". Có lẽ "AAAA" đại diện cho một số loại tiêu đề để ứng dụng có thể biết chính xác vị trí trong luồng dữ liệu để bắt đầu xử lý khóa.


Điều này có vẻ tương tự như những gì tôi đã nói, bao gồm cả liên kết đến RFC.
larsks

@larsks: Rõ ràng bạn nhấn gửi trong khi tôi vẫn đang viết của tôi.
Scott Pack

15

Định dạng khóa công khai SSH được ghi lại trong RFC 4253 và được tóm tắt phần nào ở đây . Dữ liệu được mã hóa PEM bao gồm một số cặp (độ dài, dữ liệu) và cặp đầu tiên mã hóa tên thuật toán, sẽ giống như ssh-rsahoặc ssh-dsa.

Điều này có nghĩa là phần ban đầu của dữ liệu khóa chung cho tất cả các khóa ssh sẽ tương tự nhau.


2

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 uint32chứ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!)

AAABAQsau đâ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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.