我正在用我得到的新笔记本电脑的公钥更新我服务器上的 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”密钥格式具有以下特定编码:
Run Code Online (Sandbox Code Playgroud)string "ssh-rsa" mpint e mpint n
这里的 'e' 和 'n' 参数构成了签名密钥 blob。
事实上,如果您对字符串“B3NzaC1yc2E”进行 Base64 解码,您将看到它被转换为 ASCII 为“ssh-rsa”。大概“AAAA”代表某种报头,因此应用程序可以知道数据流中的确切位置以开始处理密钥。
lar*_*sks 15
SSH 公钥格式记录在RFC 4253 中,并在此处进行了一些总结。PEM 编码数据由许多 (length,data) 对组成,第一对编码算法名称,类似于ssh-rsa
or ssh-dsa
。
这意味着所有 ssh 密钥的公钥数据的初始部分将是相似的。
在关注 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”密钥格式具有以下特定编码:
Run Code Online (Sandbox Code Playgroud)string "ssh-rsa" mpint e mpint n
这里的 'e' 和 'n' 参数构成了签名密钥 blob。[Ed:但 blob 似乎也包含字符串
"ssh-rsa"
......]生成的签名编码如下:
Run Code Online (Sandbox Code Playgroud)string "ssh-rsa" string rsa_signature_blob
'rsa_signature_blob' 的值被编码为一个包含 s 的字符串[编辑:不知道 s 是什么。](这是一个整数,没有长度或填充,无符号,并且在网络字节顺序中)。
更现代的 Ed25519 和 Ed448 密钥在RFC-8709中定义,有两个字段:
"ssh-rsa"
字符串ssh-rsa
被转换为\x00\x00\x00\x07ssh-rsa
,然后编码为AAAAB3NzaC1yc2E=
,所以所有 ssh-rsa 密钥都应该以此开头。
e
, 公共指数通常类似于 3, 17, 257, 65537。这些数字被编码如下(带有从上面的尾随偏移量)
'\x00\x00\x00\x01\x03'
→AAAABAw
'\x00\x00\x00\x01\x11'
→AAAABEQ
'\x00\x00\x00\x02\x01\x01'
→AAAACAQE
'\x00\x00\x00\x03\x01\x00\x01'
→AAAADAQAB
因此,如果您看到“BAw”,则您的指数为 3,或“DAQAB”= 65537
n
,模数(您的两个秘密素数的乘积,将其分解!)AAABAQ
以上意味着您的密钥长度为 2048 位(并且由于 base64 填充,您的指数类似于 DAQAB)。其余的 base64 内容是指数,之后没有任何内容。
其他可能常见的模数前缀:
AAAAg
1024 位,e = 0x10001AAAQI
: 2048 位,e = 3