为什么我的两个ssh公钥开头一样?

Gab*_*azo 29 encryption ssh

我正在用我得到的新笔记本电脑的公钥更新我服务器上的 authorized_keys 文件,我惊讶地发现两个公钥开始相同:

# key 1
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ....
#
# key 2
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ....
Run Code Online (Sandbox Code Playgroud)

什么故事AAAAB3...等等?通过一些在线搜索,我发现其他键也开始相同。它是否解释了算法或版本或其他什么?

Sco*_*ack 28

这实际上是一个标头,它定义了这是什么类型的键。如果您查看RFC 4253 的公钥算法部分,我们可以看到 RSA 密钥

“ssh-rsa”密钥格式具有以下特定编码:

 string    "ssh-rsa"
 mpint     e
 mpint     n
Run Code Online (Sandbox Code Playgroud)

这里的 'e' 和 'n' 参数构成了签名密钥 blob。

事实上,如果您对字符串“B3NzaC1yc2E”进行 Base64 解码,您将看到它被转换为 ASCII 为“ssh-rsa”。大概“AAAA”代表某种报头,因此应用程序可以知道数据流中的确切位置以开始处理密钥。


lar*_*sks 15

SSH 公钥格式记录在RFC 4253 中,并在此处进行了一些总结。PEM 编码数据由许多 (length,data) 对组成,第一对编码算法名称,类似于ssh-rsaor ssh-dsa

这意味着所有 ssh 密钥的公钥数据的初始部分将是相似的。


Nic*_*k T 7

在关注 Scott 的搞笑链接后,我对格式进行了一次矫枉过正的深入研究。域名注册地址:

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

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFKy...
           |   "ssh-ed25519"   |   32 byte public key
Run Code Online (Sandbox Code Playgroud)

RFC4231指定了使用的两种数据类型:

  • string: 任意长度的二进制字符串。字符串允许包含任意二进制数据,包括空字符和 8 位字符。

  • mpint:以二进制补码格式表示多个精度整数,存储为字符串,每字节8位,MSB在前。[...]

两种数据类型都以uint32定义即将到来的数据长度开始。因为这通常是矫枉过正,你最终会得到很多 0(例如,“abc”被存储为\x00\x00\x00\x03abc...),它们最终A在 base64 编码的有效负载中以s 的形式运行(... AAAAA2FiYwo

RFC4253 sec 6.6说密钥被编码为:

“ssh-rsa”密钥格式具有以下特定编码:

string    "ssh-rsa"
mpint     e
mpint     n
Run Code Online (Sandbox Code Playgroud)

这里的 'e' 和 'n' 参数构成了签名密钥 blob。[Ed:但 blob 似乎也包含字符串"ssh-rsa"......]

生成的签名编码如下:

string    "ssh-rsa"
string    rsa_signature_blob
Run Code Online (Sandbox Code Playgroud)

'rsa_signature_blob' 的值被编码为一个包含 s 的字符串[编辑:不知道 s 是什么。](这是一个整数,没有长度或填充,无符号,并且在网络字节顺序中)。

更现代的 Ed25519 和 Ed448 密钥在RFC-8709中定义,有两个字段:

  • 常量字符串“ssh-ed25519”(或“ssh-ed448”)
  • 32 字节(或 57 字节)公钥作为字符串

"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 位(并且由于 base64 填充,您的指数类似于 DAQAB)。其余的 base64 内容是指数,之后没有任何内容。

其他可能常见的模数前缀:

  • AAAAg 1024 位,e = 0x10001
  • AAAQI: 2048 位,e = 3