我正在使用获取的新笔记本电脑的公共密钥更新服务器上的authorized_keys文件,但惊讶地发现两个公共密钥开始相同:
# key 1
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ....
#
# key 2
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ....
这是什么故事AAAAB3...
?通过一些在线搜索,我发现其他键也以相同的方式启动。它可以解释算法或版本或其他内容吗?
我正在使用获取的新笔记本电脑的公共密钥更新服务器上的authorized_keys文件,但惊讶地发现两个公共密钥开始相同:
# key 1
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ....
#
# key 2
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ....
这是什么故事AAAAB3...
?通过一些在线搜索,我发现其他键也以相同的方式启动。它可以解释算法或版本或其他内容吗?
Answers:
这实际上是一个标头,用于定义这是哪种密钥。如果您查看RFC 4253的“公钥算法”部分,则可以看到RSA密钥
“ ssh-rsa”密钥格式具有以下特定编码:
string "ssh-rsa" mpint e mpint n
这里的“ e”和“ n”参数形成签名密钥blob。
实际上,如果您对Base64解码字符串“ B3NzaC1yc2E”,则会看到该字符串转换为ASCII的“ ssh-rsa”。大概“ AAAA”代表某种报头,因此应用程序可以知道确切地在数据流中的何处开始处理密钥。
在按照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:但是blob似乎也包含字符串
"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。这些数字的编码方式如下(尾随上方偏移)
'\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
AAAAB3NzaC1yc2EAAAA
所以我猜想它是某种常见的算法类型/版本标识符...