为什么我的两个ssh公钥具有相同的开头?


25

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

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

这是什么故事AAAAB3...?通过一些在线搜索,我发现其他键也以相同的方式启动。它可以解释算法或版本或其他内容吗?


1
值得一提的是,在几年的时间里,我在各种计算机上生成了7个密钥,而且它们全都以它们开头,AAAAB3NzaC1yc2EAAAA所以我猜想它是某种常见的算法类型/版本标识符...
fukawi2

Answers:


24

这实际上是一个标头,用于定义这是哪种密钥。如果您查看RFC 4253的“公钥算法”部分,则可以看到RSA密钥

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

 string    "ssh-rsa"
 mpint     e
 mpint     n

这里的“ e”和“ n”参数形成签名密钥blob。

实际上,如果您对Base64解码字符串“ B3NzaC1yc2E”,则会看到该字符串转换为ASCII的“ ssh-rsa”。大概“ AAAA”代表某种报头,因此应用程序可以知道确切地在数据流中的何处开始处理密钥。


这似乎与我所说的非常相似,包括指向RFC的链接。
larsk

@larsks:显然你在我还在写我的时候就点击了提交。
Scott Pack

15

SSH公钥格式记录在RFC 4253中,并在此处进行了一些概述。PEM编码的数据由多个(长度,数据)对组成,第一对编码算法名称,该名称将类似于ssh-rsassh-dsa

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


2

在按照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。这些数字的编码方式如下(尾随上方偏移)

  • 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.