无法使用 Puttygen 将 ssh.com 密钥转换为 ppk 格式

无法使用 Puttygen 将 ssh.com 密钥转换为 ppk 格式

我在将私钥从 ssh.com 格式转换为 putty 格式时遇到问题。导入私钥时,出现以下错误。

无法加载私钥(密钥不是以魔法数字开头)。

我无法弄清楚密钥出了什么问题。我生成了另一个示例密钥,它存在同样的问题,但显然没有用处,也没有密码。如果有人能帮助我,我将不胜感激。提前致谢。

---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----
Comment: "[2048-bit rsa, Fri May 16 2014]"
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDe7GR0INPoKwedwq8XjY
CRO/2Zwl9ssRj1vqiF4BtUdP9Dgz79gZIoaOHGKxtTj0cesBkdcrvbU5rGbqidOfn7RPjo
AeX8L817bRbk276PYh823pEnclPlTUBJDzfP5IK1u7Gbp35YlZnEcXFbaMF8vcBQ6tr+/i
R8Z2akeNmDYTW8U9Xi+MPYeXxwSoI9cQrPztqzlkCschhgM1GAthkEjBRGQi4T9DuzwGgF
R0hx+n5TqIHcoMyBZAP/Lq9wEZsmWO/rboqxDNhgaR3ID3zL7mqp7vN9hZ/q19wG4QAZbH
yEExMHkZmwTipk0gUQCPf5AJYAbPrGLuGWqICG+349AgMBAAECggEAIk0tEtpnSPLwD9Qg
VYcyOIbK2bE5NjQU82FUNI9cnTUIfzavh1n756hlzzScVpH2H1B4+NlJ8zBs4SovW0wLvW
BqTWbXYOPpIhwR2QLAEneGdo6uNqvmoWKu6N8E10Ih471fEaSm8hII8FuFVgurNBrNgBX3
PyPTcOoHNvkafRa7Uv89HgoENo1lQRD01bA6Rj7nTIV4L3gffZgHOoxMVmFprLY8GPbPrO
Y9/ecbbFdM5Xd5bN20swJ9ekXJIrhtQl7mgRdvk0tVVbpkb6uAxhPiw4k/+imrNJXk8goK
LJ9Km8DVfIacsqxGg/oQdtQT90Xi/2CE3wYWStUwwqCCoQKBgQD5yqZWe1lwPBj4Bp0Lxb
xXncazi+7tYHNrBaooYD5HEW5t1s5iU6nsd1UtXlOAccjvSAK1Ng7dr7JQz+zdmWFYHsfF
Qh+RwVPoaj4dnJ3EJt7wpcW4jt1B6FFxnXW5A58tRk78qFGTjIJH/DFfVUMsKkESljLjN9
JUkS+c9xVTXQKBgQDkdsnLQF89QbHt2UNm7XhybGV4oJE3FOysTqxzrXY+JAqNUahc2miX
dEU6lcNrM/6g0LrQxgumvhDcMg/bFDqvwDI+qNPiMOJyXLjd6Nhj+UF9xn9w7kXvliLwek
Nb4o37/iF6EsJbZFKAkg4/Qt93eovLgT0wbVQyeJrlybwIYQKBgHHcFqAbD7SiIDuGQDWq
h2RkrbsP0PPw4AtrhJls7VZVssFshZy6SB1ac7//XA6TTyUK7PkO0A3q1VwSuwRzsrSJK0
RWFK/KsOWi7/dteVh842hMF+k9bctqCx2/yXZxGTB4+O4gBzc7d/M6GIM9CSZriEfhoQaD
XmNf3pUs51KdAoGAOn/EKfwgpuHEep+wJ5HUzo+858dNh6oe8/vtIm2fIkg+P3NSRfxS3b
0S4O5qLHAS2gC4ZS7g2uA+FvPmpXUnlcsD0pGON5PG1/uwBnpRtj+jql4CUdthIvjxl1vn
FYcMTiMDVWuqQpaMnYlIhqBL8h753rEIBvdnoMjK+N3P/OECgYA2jMJaFtoKVjA6oUXj56
uDLe09I17VV5mq46HjjMUPlU9HuGF3d5U5a54NMq3beFLiVHdhC1M4s8UWv/vuXgmPrAmo
knD4thxCbu7iuBx5oI9C5zPvBT4hmH3LMVp/iEFO7nmBcSe3PjnaYCn8/LAs38F5oxaTLN
mHTVR7pcw89w==
---- END SSH2 ENCRYPTED PRIVATE KEY ----

答案1

私钥似乎不是 ssh.com 格式——它的标题是假的。

前几个字母MII…解码为字节30 82,这是 DER 格式 ASN.1“序列”的开头——而 SSH.com 在其密钥格式中不使用 ASN.1,但 OpenSSL/OpenSSH 可以,用于未加密的 RSA 密钥。

(但是,如果密钥有密码,则无法通过这种方式识别。另请参阅最后的注释。)

相比之下,SSH.com 密钥最有可能以P2/56…或 字节开头3f 6f f9 eb …。这种事情就是“魔法数字”一词的含义:许多格式可以通过开头的特定字节来识别 - 有时在格式规范中定义,有时只是数据结构的副作用。

因此,如果您忽略文本标头并尝试对主要数据块进行 Base64 解码,您将发现一个 ASN.1 结构,与 OpenSSL 用于其旧式“裸 RSA”格式私钥的结构完全相同。这是 OpenSSH 用于大多数私钥类型的相同格式。

# cat key.txt | sed "/^---- /d; /^Comment:/d" | base64 -d > key.raw

# dumpasn1 key.raw

   0 1212: SEQUENCE {
   4    1:   INTEGER 0
   7   13:   SEQUENCE {
   9    9:     OBJECT IDENTIFIER rsaEncryption (1 2 840 113549 1 1 1)
  20    0:     NULL
         :     }
  22 1190:   OCTET STRING, encapsulates {
  26 1186:     SEQUENCE {
  30    1:       INTEGER 0
  33  257:       INTEGER
         :         00 DE EC 64 74 20 D3 E8 2B 07 9D C2 AF 17 8D 80
         :         91 3B FD 99 C2 5F 6C B1 18 F5 BE A8 85 E0 1B 54
         :         74 FF 43 83 3E FD 81 92 28 68 E1 C6 2B 1B 53 8F
         :         47 1E B0 19 1D 72 BB DB 53 9A C6 6E A8 9D 39 F9
                   [etc.]
 294    3:       INTEGER 65537
[etc.]

# openssl rsa -in key.raw -inform DER -noout -text

Private-Key: (2048 bit)
modulus:
    00:de:ec:64:74:20:d3:e8:2b:07:9d:c2:af:17:8d:
    80:91:3b:fd:99:c2:5f:6c:b1:18:f5:be:a8:85:e0:
    [etc.]
publicExponent: 65537 (0x10001)
privateExponent:
    22:4d:2d:12:da:67:48:f2:f0:0f:d4:20:55:87:32:
    38:86:ca:d9:b1:39:36:34:14:f3:61:54:34:8f:5c:
    [etc.]
[etc.]

如您所见,OpenSSL 将其识别为自己的格式,包含未加密的 RSA 参数。

您可以通过以下方式“恢复”此密钥:

  1. 删除这两----行,然后Comment:删除

  2. -----BEGIN RSA PRIVATE KEY-----在顶部添加

  3. -----END RSA PRIVATE KEY-----在底部添加

  4. 告诉 PuTTYgen 将其导入为OpenSSH 私钥

然而,加密密钥,OpenSSL 期望的标头在某种程度上不同的– 特别是,DEK-Info:标头包含用于加密数据的加密算法和盐值(或者是 IV?)。如果没有它,即使您知道密码,也无法解密密钥。

因此,只有事先删除密钥的密码,上述步骤才会起作用。

答案2

我终于弄清楚了问题出在哪里。显然,密钥的格式称为 F-Secure FSCLM 私钥格式。应用程序文件夹中包含一个密钥生成器应用程序,可用于将密钥转换为 Puttygen 可以读取的正确格式。

相关内容