ECDSA 私钥格式的区别

信息安全 SSH 钥匙 ecdsa
2021-08-17 18:36:34

我有两个私有 ssh 密钥,一个最初是用 ssh-keygen 创建的,另一个是用 python 脚本创建的。它们应该是相同的,但是一个用于身份验证,另一个不用于身份验证。

在使用https://keytool.online/分析它们之后,在以 OpenSSH 格式比较它们时似乎存在一个细微差别。

解释:

1) 复制ECDSA 选项卡中https://keytool.online/中的两个密钥:

密钥 1(使用 ssh-keygen 创建)

-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIBaYCj/CjZjq9aYehcvyejxqx5WVJ3OnfNbBq2+7iKyJoAoGCCqGSM49
AwEHoUQDQgAE1Rcx8Zo84aqSWqT/7i5NN7p+PI6dRfGdFFJapfcBlMhMjFsJkrxh
vncLphHuZHBoEILRMKf7hfVJ+tMwHMxQMA==
-----END EC PRIVATE KEY-----

键 2(使用 python 创建)

-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgFpgKP8KNmOr1ph6F
y/J6PGrHlZUnc6d81sGrb7uIrImhRANCAATVFzHxmjzhqpJapP/uLk03un48jp1F
8Z0UUlql9wGUyEyMWwmSvGG+dwumEe5kcGgQgtEwp/uF9Un60zAczFAw
-----END PRIVATE KEY-----

2) 以 OpenSSH 格式查看它们:

密钥 1(使用 ssh-keygen 创建,OpenSSH 格式)

-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAaAAAABNl
Y2RzYS1zaGEyLW5pc3RwMjU2AAAACG5pc3RwMjU2AAAAQQTVFzHxmjzhqpJapP/u
Lk03un48jp1F8Z0UUlql9wGUyEyMWwmSvGG+dwumEe5kcGgQgtEwp/uF9Un60zAc
zFAwAAAAsGt4wBFreMARAAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAy
NTYAAABBBNUXMfGaPOGqklqk/+4uTTe6fjyOnUXxnRRSWqX3AZTITIxbCZK8Yb53
C6YR7mRwaBCC0TCn+4X1SfrTMBzMUDAAAAAgFpgKP8KNmOr1ph6Fy/J6PGrHlZUn
c6d81sGrb7uIrIkAAAASZWNkc2Eta2V5LTIwMTkwOTIwAQIDBAUG
-----END OPENSSH PRIVATE KEY-----

密钥 2(使用 python 创建,OpenSSH 格式)

-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAaAAAABNl
Y2RzYS1zaGEyLW5pc3RwMjU2AAAACG5pc3RwMjU2AAAAQQTVFzHxmjzhqpJapP/u
Lk03un48jp1F8Z0UUlql9wGUyEyMWwmSvGG+dwumEe5kcGgQgtEwp/uF9Un60zAc
zFAwAAAAsFhPTMdYT0zHAAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAy
NTYAAABBBNUXMfGaPOGqklqk/+4uTTe6fjyOnUXxnRRSWqX3AZTITIxbCZK8Yb53
C6YR7mRwaBCC0TCn+4X1SfrTMBzMUDAAAAAgFpgKP8KNmOr1ph6Fy/J6PGrHlZUn
c6d81sGrb7uIrIkAAAASZWNkc2Eta2V5LTIwMTkwOTIwAQIDBAUG
-----END OPENSSH PRIVATE KEY-----

3) 使用您选择的文本差异查看工具。你会注意到一些字符是不同的。它们代表什么?两个键有什么区别?所有域参数似乎都是相同的。

注意区别: 在此处输入图像描述

(密钥不会用于任何重要的事情,只是为了演示这个问题而创建的)

2个回答

(我确信我以前基本上已经回答过这个问题,但我找不到骗子。)

OpenSSL 部分创建并支持两种(或四种,具体取决于您如何计算)私钥的 PEM 格式。

您的第一个文件BEGIN EC PRIVATE KEY(没有Proc-type,DEK-Info内部)是特定于一种算法 EC 的“传统”或“传统”格式。它包含由 SECG 的 SEC1定义的格式的私钥,也可作为rfc5915 使用,然后编码/包装为“PEM”,即带有换行符和标题/拖尾行的 base64。

您的第二个文件,带有BEGIN PRIVATE KEY,是“新”(大约从 2000 年开始!)PKCS8 格式,它是通用的并且涵盖了所有算法。实际的 PKCS8 最初由 RSA Labs 发布,自从 RSA 被 EMC 和 Dell 收购后变得越来越难找到,但也可作为rfc5208 使用,再次编码/包装在 PEM 中。这种格式(但不是传统格式)是在 rfc7468 中更新和重新标准化的几种 PEM 格式之一(请参阅第 10 节,即使 TOC 没有正确超链接它!)

尽管格式不同,但它们确实包含相同的密钥:

$ cat se218335.a; openssl pkey -in se218335.a -noout -text
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIBaYCj/CjZjq9aYehcvyejxqx5WVJ3OnfNbBq2+7iKyJoAoGCCqGSM49
AwEHoUQDQgAE1Rcx8Zo84aqSWqT/7i5NN7p+PI6dRfGdFFJapfcBlMhMjFsJkrxh
vncLphHuZHBoEILRMKf7hfVJ+tMwHMxQMA==
-----END EC PRIVATE KEY-----
Private-Key: (256 bit)
priv:
    16:98:0a:3f:c2:8d:98:ea:f5:a6:1e:85:cb:f2:7a:
    3c:6a:c7:95:95:27:73:a7:7c:d6:c1:ab:6f:bb:88:
    ac:89
pub:
    04:d5:17:31:f1:9a:3c:e1:aa:92:5a:a4:ff:ee:2e:
    4d:37:ba:7e:3c:8e:9d:45:f1:9d:14:52:5a:a5:f7:
    01:94:c8:4c:8c:5b:09:92:bc:61:be:77:0b:a6:11:
    ee:64:70:68:10:82:d1:30:a7:fb:85:f5:49:fa:d3:
    30:1c:cc:50:30
ASN1 OID: prime256v1

$ cat se218335.b; openssl pkey -in se218335.b -noout -text
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgFpgKP8KNmOr1ph6F
y/J6PGrHlZUnc6d81sGrb7uIrImhRANCAATVFzHxmjzhqpJapP/uLk03un48jp1F
8Z0UUlql9wGUyEyMWwmSvGG+dwumEe5kcGgQgtEwp/uF9Un60zAczFAw
-----END PRIVATE KEY-----
Private-Key: (256 bit)
priv:
    16:98:0a:3f:c2:8d:98:ea:f5:a6:1e:85:cb:f2:7a:
    3c:6a:c7:95:95:27:73:a7:7c:d6:c1:ab:6f:bb:88:
    ac:89
pub:
    04:d5:17:31:f1:9a:3c:e1:aa:92:5a:a4:ff:ee:2e:
    4d:37:ba:7e:3c:8e:9d:45:f1:9d:14:52:5a:a5:f7:
    01:94:c8:4c:8c:5b:09:92:bc:61:be:77:0b:a6:11:
    ee:64:70:68:10:82:d1:30:a7:fb:85:f5:49:fa:d3:
    30:1c:cc:50:30
ASN1 OID: prime256v1

OpenSSH 几十年前开始使用 OpenSSL 传统格式(RSA 和 DSA 以及 EC),并且ssh-keygen从未升级为编写 PKCS8,尽管它以及sshsshd(和ssh-add)程序可以读取PKCS8,因为它们实际上调用 OpenSSL 库例程处理这两种类型。特别是在提取 pubkey 并对其进行配置之后,我可以使用您的任何一个文件进行身份验证:

$ ssh -i se218335.a localhost echo hi
hi
$ ssh -i se218335.b localhost echo hi
hi

如果您在使用第二个文件时遇到问题并想解决它,您可能会问这个问题。

OpenSSH 密钥的编码只是 base64,因此一旦它们没有密码,您就可以分析内容。

第一个:

$ base64 -d | hexdump -C
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAaAAAABNl
Y2RzYS1zaGEyLW5pc3RwMjU2AAAACG5pc3RwMjU2AAAAQQTVFzHxmjzhqpJapP/u
Lk03un48jp1F8Z0UUlql9wGUyEyMWwmSvGG+dwumEe5kcGgQgtEwp/uF9Un60zAc
zFAwAAAAsGt4wBFreMARAAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAy
NTYAAABBBNUXMfGaPOGqklqk/+4uTTe6fjyOnUXxnRRSWqX3AZTITIxbCZK8Yb53
C6YR7mRwaBCC0TCn+4X1SfrTMBzMUDAAAAAgFpgKP8KNmOr1ph6Fy/J6PGrHlZUn
c6d81sGrb7uIrIkAAAASZWNkc2Eta2V5LTIwMTkwOTIwAQIDBAUG
00000000  6f 70 65 6e 73 73 68 2d  6b 65 79 2d 76 31 00 00  |openssh-key-v1..|
00000010  00 00 04 6e 6f 6e 65 00  00 00 04 6e 6f 6e 65 00  |...none....none.|
00000020  00 00 00 00 00 00 01 00  00 00 68 00 00 00 13 65  |..........h....e|
00000030  63 64 73 61 2d 73 68 61  32 2d 6e 69 73 74 70 32  |cdsa-sha2-nistp2|
00000040  35 36 00 00 00 08 6e 69  73 74 70 32 35 36 00 00  |56....nistp256..|
00000050  00 41 04 d5 17 31 f1 9a  3c e1 aa 92 5a a4 ff ee  |.A...1..<...Z...|
00000060  2e 4d 37 ba 7e 3c 8e 9d  45 f1 9d 14 52 5a a5 f7  |.M7.~<..E...RZ..|
00000070  01 94 c8 4c 8c 5b 09 92  bc 61 be 77 0b a6 11 ee  |...L.[...a.w....|
00000080  64 70 68 10 82 d1 30 a7  fb 85 f5 49 fa d3 30 1c  |dph...0....I..0.|
00000090  cc 50 30 00 00 00 b0 6b  78 c0 11 6b 78 c0 11 00  |.P0....kx..kx...|
000000a0  00 00 13 65 63 64 73 61  2d 73 68 61 32 2d 6e 69  |...ecdsa-sha2-ni|
000000b0  73 74 70 32 35 36 00 00  00 08 6e 69 73 74 70 32  |stp256....nistp2|
000000c0  35 36 00 00 00 41 04 d5  17 31 f1 9a 3c e1 aa 92  |56...A...1..<...|
000000d0  5a a4 ff ee 2e 4d 37 ba  7e 3c 8e 9d 45 f1 9d 14  |Z....M7.~<..E...|
000000e0  52 5a a5 f7 01 94 c8 4c  8c 5b 09 92 bc 61 be 77  |RZ.....L.[...a.w|
000000f0  0b a6 11 ee 64 70 68 10  82 d1 30 a7 fb 85 f5 49  |....dph...0....I|
00000100  fa d3 30 1c cc 50 30 00  00 00 20 16 98 0a 3f c2  |..0..P0... ...?.|
00000110  8d 98 ea f5 a6 1e 85 cb  f2 7a 3c 6a c7 95 95 27  |.........z<j...'|
00000120  73 a7 7c d6 c1 ab 6f bb  88 ac 89 00 00 00 12 65  |s.|...o........e|
00000130  63 64 73 61 2d 6b 65 79  2d 32 30 31 39 30 39 32  |cdsa-key-2019092|
00000140  30 01 02 03 04 05 06                              |0......|

第二个:

$ base64 -d | hexdump -C
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAaAAAABNl
Y2RzYS1zaGEyLW5pc3RwMjU2AAAACG5pc3RwMjU2AAAAQQTVFzHxmjzhqpJapP/u
Lk03un48jp1F8Z0UUlql9wGUyEyMWwmSvGG+dwumEe5kcGgQgtEwp/uF9Un60zAc
zFAwAAAAsFhPTMdYT0zHAAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAy
NTYAAABBBNUXMfGaPOGqklqk/+4uTTe6fjyOnUXxnRRSWqX3AZTITIxbCZK8Yb53
C6YR7mRwaBCC0TCn+4X1SfrTMBzMUDAAAAAgFpgKP8KNmOr1ph6Fy/J6PGrHlZUn
c6d81sGrb7uIrIkAAAASZWNkc2Eta2V5LTIwMTkwOTIwAQIDBAUG
00000000  6f 70 65 6e 73 73 68 2d  6b 65 79 2d 76 31 00 00  |openssh-key-v1..|
00000010  00 00 04 6e 6f 6e 65 00  00 00 04 6e 6f 6e 65 00  |...none....none.|
00000020  00 00 00 00 00 00 01 00  00 00 68 00 00 00 13 65  |..........h....e|
00000030  63 64 73 61 2d 73 68 61  32 2d 6e 69 73 74 70 32  |cdsa-sha2-nistp2|
00000040  35 36 00 00 00 08 6e 69  73 74 70 32 35 36 00 00  |56....nistp256..|
00000050  00 41 04 d5 17 31 f1 9a  3c e1 aa 92 5a a4 ff ee  |.A...1..<...Z...|
00000060  2e 4d 37 ba 7e 3c 8e 9d  45 f1 9d 14 52 5a a5 f7  |.M7.~<..E...RZ..|
00000070  01 94 c8 4c 8c 5b 09 92  bc 61 be 77 0b a6 11 ee  |...L.[...a.w....|
00000080  64 70 68 10 82 d1 30 a7  fb 85 f5 49 fa d3 30 1c  |dph...0....I..0.|
00000090  cc 50 30 00 00 00 b0 58  4f 4c c7 58 4f 4c c7 00  |.P0....XOL.XOL..|
000000a0  00 00 13 65 63 64 73 61  2d 73 68 61 32 2d 6e 69  |...ecdsa-sha2-ni|
000000b0  73 74 70 32 35 36 00 00  00 08 6e 69 73 74 70 32  |stp256....nistp2|
000000c0  35 36 00 00 00 41 04 d5  17 31 f1 9a 3c e1 aa 92  |56...A...1..<...|
000000d0  5a a4 ff ee 2e 4d 37 ba  7e 3c 8e 9d 45 f1 9d 14  |Z....M7.~<..E...|
000000e0  52 5a a5 f7 01 94 c8 4c  8c 5b 09 92 bc 61 be 77  |RZ.....L.[...a.w|
000000f0  0b a6 11 ee 64 70 68 10  82 d1 30 a7 fb 85 f5 49  |....dph...0....I|
00000100  fa d3 30 1c cc 50 30 00  00 00 20 16 98 0a 3f c2  |..0..P0... ...?.|
00000110  8d 98 ea f5 a6 1e 85 cb  f2 7a 3c 6a c7 95 95 27  |.........z<j...'|
00000120  73 a7 7c d6 c1 ab 6f bb  88 ac 89 00 00 00 12 65  |s.|...o........e|
00000130  63 64 73 61 2d 6b 65 79  2d 32 30 31 39 30 39 32  |cdsa-key-2019092|
00000140  30 01 02 03 04 05 06                              |0......|
00000147

密钥格式在OpenSSH 存储库中进行了描述。

这里的区别在于一个键具有以下字节6b 78 c0 11 6b 78 c0 11,而另一个键具有以下字节58 4f 4c c7 58 4f 4c c7这些字节代表两个相同的随机 32B 整数,用于验证解密的密钥是否真的有效(如果使用了加密)。查看checkint链接文档中的字段。

根据规范(OpenSSH 密钥格式),这两个密钥都是有效的。

有关 PEM 格式的区别,请参阅 dave_thompson_085 的答案。TLDR,其中一个是传统 PEM,另一个是现代 PKCS# 8 格式,包括相同的密钥,OpenSSH 可以理解它们。