1

我使用以下命令生成了一个 rsa 2048 密钥对: openssl.exe genrsa -F4 -out key.pem 2048 openssl.exe rsa -text -in key.pem > key.txt

现在我丢失了 key.pem 文件,也丢失了原始格式的 key.txt。但是我有来自文本文件的私有指数和公共指数。这些足以让我的工具套件签署二进制文件然后进行验证。现在我需要使用 openSSL 签名来测试一些东西,但是如何恢复 .pem 格式(key.pem)的私钥。

这是 key.txt 的剩余部分(示例,但有效的密钥对):

私钥:(2048 位)

模数:

00:f3:5a:8f:46:08:11:d8:f7:65:eb:26:8f:e6:fe:
c3:10:c7:52:81:4e:44:89:59:fe:39:a3:55:c6:10:
7f:8c:2d:8e:e9:60:92:f1:c2:b3:9b:3d:0b:cc:b1:
6d:36:b4:d2:31:dd:5b:96:c1:f1:0b:51:2c:77:ee:
2d:53:68:f0:c9:89:c3:a4:1b:90:a1:39:5e:d0:f3:
f1:ec:5b:d3:e9:2d:36:1f:8f:27:e0:90:89:0a:4b:
16:24:e7:35:18:9a:0e:1a:b0:9d:b4:20:b9:2d:cf:
72:59:54:a8:c7:1a:d3:cd:a0:8e:b6:86:6c:47:c5:
b5:de:66:48:5c:cc:63:03:bc:35:ca:8b:0b:23:65:
c0:94:ec:4f:51:67:5c:84:9a:81:ce:cd:52:71:f8:
e8:d1:9b:03:54:ab:e7:38:47:3d:63:f1:ee:26:46:
3f:d8:31:f3:ea:bf:8c:2b:dc:8e:b7:ee:4d:8a:24:
5f:b3:7d:26:45:13:f7:6a:a2:cf:d8:80:1b:0c:30:
d0:06:c3:6b:13:03:74:6b:56:a4:25:f1:90:d4:70:
11:2a:85:9f:92:c9:f0:2e:1c:7d:56:09:ba:de:41:
26:4f:8a:0a:91:78:42:5e:87:6a:2f:51:44:c5:0d:
4b:9d:8b:02:8e:b5:89:82:f9:a1:1b:d7:b9:c6:1d:
d2:61

公共指数:65537(0x10001)

私人指数:

73:e4:bd:f4:e1:24:f6:ca:23:7c:90:99:d9:ad:9c:
62:62:3a:95:a0:1b:9d:ba:01:0b:9c:10:de:49:bf:
24:98:11:c6:6d:1a:ae:0e:46:90:f8:ca:a4:ca:1e:
b3:fd:fb:58:8a:0d:f3:47:1b:af:83:12:05:6f:a5:
a0:62:8a:c1:c0:5d:2e:cb:7d:de:7a:3f:00:8e:1c:
b9:ae:a5:c6:17:a4:fd:f4:a4:4e:1b:27:58:82:97:
e2:2d:46:29:18:3c:fd:52:fd:57:ea:79:a6:2a:74:
4f:bc:b4:c0:55:b3:66:eb:3e:ec:08:2a:8b:27:ca:
4c:47:33:d1:15:f9:55:ae:1f:c6:5c:80:52:0b:b1:
b8:63:2e:59:82:09:3d:68:b1:29:3b:56:5e:e4:e3:
6c:bb:01:c7:f7:a4:2a:20:e7:40:f2:08:d6:3a:e9:
49:3c:15:bc:5d:6b:89:4b:06:60:f5:86:7b:7c:6f:
f2:1a:10:10:f4:df:73:ae:5f:67:d1:a1:99:e4:79:
2d:82:3d:a6:fd:c0:cc:0a:4b:06:f6:96:d5:c0:89:
3b:02:26:a2:ff:e1:e1:fb:2a:6c:cb:4f:ce:8a:c5:
26:4b:70:19:05:87:23:81:68:64:83:65:f4:97:7a:
bf:1e:95:5c:a3:93:64:7a:fa:e7:54:9d:0b:95:0c:
11
4

1 回答 1

2

对 - 所以假设你也知道私有指数和不知道的东西 - 这是可行的;但将需要一些 c 编码来构建正确的结构或肮脏的 hack。我使用的肮脏技巧如下(并且可能并不总是有效;BER 编码中有一些不幸的边缘情况)。

  • 在旁边生成一个类似的密钥。确保长度一致。
  • 以DER格式写出来。
  • 以TXT格式写出来;如上(A)。
  • 观察到 privateExponent 等在转储中是“普通的”(以它们的 ASN1 标头 (BF..) 为前缀)。
  • 将键/值编辑到此文件中;覆盖旧值。
    • 您可以通过查看文本输出“A”找到它们的开始/结束。
    • 并将其替换为您的价值观
  • 使用 openssl ans1parse 来验证您没有犯任何错误。
  • 完成后-您的文件就回来了。

就是这样。适当的 C 代码需要更多的工作。但完全可行。您的 txt 文件包含所有信息 - openssl 中的 RSA/pkey 结构很容易重新填充。

(希望上面不是你真正的关键:)!

于 2012-08-21T12:59:35.447 回答