5

我正在尝试从我的known_hosts文件中提取一个 ECDSA 公钥,该文件ssh用于验证主机。我有一个下面的例子。

这是我 known_hosts 文件中“127.0.0.1 ecdsa-sha2-nistp256”的条目:

AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBF3QCzKPRluwunLRHaFVEZNGCPD/rT13yFjKiCesA1qoU3rEp9syhnJgTbaJgK70OjoT71fDGkwwcnCZuJQPFfo=

我通过 Base64 解码器运行它来得到这个:

��ecdsa-sha2-nistp256���nistp256���A]2F[rUF=wXʈ'ZSzħ2r`M::WL0rp

所以我假设这些问号是某种分隔符(不,那些是长度)。我认为 nistp256 是使用的椭圆曲线,但最后一个值到底是什么?

根据我一直在阅读的内容,ECDSA 的公钥有一对值 x 和 y,它们代表曲线上的一个点。有什么方法可以从那里提取 x 和 y 吗?

我正在尝试将其转换为 Java 公钥对象,但我需要 x 和 y 才能这样做。

4

2 回答 2

6

并非所有字符都显示,因为它们是二进制的。将 Base64 解码的值写入文件并在十六进制编辑器中打开它。

P256 曲线的公钥应该是一个 65 字节的数组,从值为 4 的字节开始(表示非压缩点)。接下来的 32 个字节是 x 值,接下来的 32 个字节是 y 值。

于 2013-02-08T22:39:15.353 回答
5

这是十六进制的结果:


签名算法:

00 00 00 13
65 63 64 73 61 2d 73 68 61 32 2d 6e 69 73 74 70 32 35 36
(ecdsa-sha2-nistp256)

域参数名称:

00 00 00 08
6e 69 73 74 70 32 35 36
(nistp256)

公钥值:

00 00 00 41
04
5d d0 0b 32 8f 46 5b b0 ba 72 d1 1d a1 55 11 93 46 08 f0 ff ad 3d 77 c8 58 ca 88 27 ac 03 5a a8
53 7a c4 a7 db 32 86 72 60 4d b6 89 80 ae f4 3a 3a 13 ef 57 c3 1a 4c 30 72 70 99 b8 94 0f 15 fa

因此,您首先拥有要使用的数字签名算法的名称,然后是曲线的名称,然后是密钥的公共组件,由未压缩的 EC 点表示。未压缩点以 开头04,然后是 X 坐标(与密钥大小相同),然后是 Y 坐标。

如您所见,所有字段值前面都有四个字节,表示字段的大小。所有值和字段都使用大端表示法。

于 2013-02-09T01:33:33.143 回答