【问题标题】:How do I extract the private key components $N$ and $D$ from a private RSA key?如何从 RSA 私钥中提取私钥组件 $N$ 和 $D$?
【发布时间】:2014-09-23 20:40:43
【问题描述】:

我有一个 RSA 私钥,例如——这个:

-----BEGIN RSA PRIVATE KEY-----
MIIBOgIBAAJBAMPMNNpbZZddeT/GTjU0PWuuN9VEGpxXJTAkmZY02o8238fQ2ynt
N40FVl08YksWBO/74XEjU30mAjuaz/FB2kkCAwEAAQJBALoMlsROSLCWD5q8EqCX
rS1e9IrgFfEtFZczkAWc33lo3FnFeFTXSMVCloNCBWU35od4zTOhdRPAWpQ1Mzxi
aCkCIQD9qjKjNvbDXjUcCNqdiJxPDlPGpa78yzyCCUA/+TNwVwIhAMWZoqZO3eWq
SCBTLelVQsg6CwJh9W7vlezvWxUni+ZfAiAopBAg3jmC66EOsMx12OFSOTVq6jiy
/8zd+KV2mnKHWQIgVpZiLZo1piQeAvwwDCUuZGr61Ap08C3QdsjUEssHhOUCIBee
72JZuJeABcv7lHhAWzsiCddVAkdnZKUo6ubaxw3u
-----END RSA PRIVATE KEY-----

此私有 RSA 密钥是使用 OpenSSL 使用以下命令生成的:

openssl genrsa

现在,如何使用此密钥获取用于解密的 $N$ 和 $D$ 的值,以及密钥的格式是什么?

【问题讨论】:

  • 在询问之前阅读文档或使用搜索引擎怎么样?那不是火箭科学。
  • 我在谷歌上搜索找不到太多的原因在这里问..
  • 实际上,这并不是 OpenSSL 特有的。 OpenSSL 使用标准 DER 编码格式(由 PKCS#1 强制),base-64 编码(因为 DER 编码使用所有 256 字节值)。
  • @mikeazo 我可以使用 openssl 工具获取值。我猜问题应该是“RSA 私钥的格式是什么”
  • 另外,这与您的问题没有直接关系,但上述密钥是 512 位 RSA 密钥。这种大小的密钥已被破坏,通常认为每个人都需要至少 1024 位密钥(强烈建议使用 2048 位)。我指出这一点,以防这是您打算使用的密钥大小。如果您要求,OpenSSL 很乐意生成更大的密钥。

标签: rsa openssl


【解决方案1】:

密钥是什么格式的?

这是一个带有 PEM 编码的 RSA 私钥。我相信 PEM 编码来自RFC 1421。剥离 PEM 编码后,有一个 ASN.1/DER 编码的 RSA 私钥。 ASN.1 编码是二进制的,所以它不是人类可读的。 ASN.1 密钥的格式可以在PKCS #1RFC 3447 中找到。

根据 RFC 3447,第 A.1.2 节 RSA 私钥语法,您可以期待以下内容:

  RSAPrivateKey ::= SEQUENCE {
      version           Version,
      modulus           INTEGER,  -- n
      publicExponent    INTEGER,  -- e
      privateExponent   INTEGER,  -- d
      prime1            INTEGER,  -- p
      prime2            INTEGER,  -- q
      exponent1         INTEGER,  -- d mod (p-1)
      exponent2         INTEGER,  -- d mod (q-1)
      coefficient       INTEGER,  -- (inverse of q) mod p
      otherPrimeInfos   OtherPrimeInfos OPTIONAL
  }

您的密钥在我的粘贴板上(Linux 上的剪贴板),所以:

$ pbpaste | openssl rsa -text -noout
Private-Key: (512 bit)
modulus:
    00:c3:cc:34:da:5b:65:97:5d:79:3f:c6:4e:35:34:
    3d:6b:ae:37:d5:44:1a:9c:57:25:30:24:99:96:34:
    da:8f:36:df:c7:d0:db:29:ed:37:8d:05:56:5d:3c:
    62:4b:16:04:ef:fb:e1:71:23:53:7d:26:02:3b:9a:
    cf:f1:41:da:49
publicExponent: 65537 (0x10001)
privateExponent:
    00:ba:0c:96:c4:4e:48:b0:96:0f:9a:bc:12:a0:97:
    ad:2d:5e:f4:8a:e0:15:f1:2d:15:97:33:90:05:9c:
    df:79:68:dc:59:c5:78:54:d7:48:c5:42:96:83:42:
    05:65:37:e6:87:78:cd:33:a1:75:13:c0:5a:94:35:
    33:3c:62:68:29
prime1:
    00:fd:aa:32:a3:36:f6:c3:5e:35:1c:08:da:9d:88:
    9c:4f:0e:53:c6:a5:ae:fc:cb:3c:82:09:40:3f:f9:
    33:70:57
prime2:
    00:c5:99:a2:a6:4e:dd:e5:aa:48:20:53:2d:e9:55:
    42:c8:3a:0b:02:61:f5:6e:ef:95:ec:ef:5b:15:27:
    8b:e6:5f
exponent1:
    28:a4:10:20:de:39:82:eb:a1:0e:b0:cc:75:d8:e1:
    52:39:35:6a:ea:38:b2:ff:cc:dd:f8:a5:76:9a:72:
    87:59
exponent2:
    56:96:62:2d:9a:35:a6:24:1e:02:fc:30:0c:25:2e:
    64:6a:fa:d4:0a:74:f0:2d:d0:76:c8:d4:12:cb:07:
    84:e5
coefficient:
    17:9e:ef:62:59:b8:97:80:05:cb:fb:94:78:40:5b:
    3b:22:09:d7:55:02:47:67:64:a5:28:ea:e6:da:c7:
    0d:ee

...如何使用此密钥获取用于解密的 $N$ 和 $D$ 的值

这应该为你做:

$ pbpaste | /usr/local/ssl/macosx-x64/bin/openssl rsa -noout -modulus
Modulus=C3CC34DA5B65975D793FC64E35343D6BAE37D5441A9C57253024999634DA8F36DFC7D0DB
29ED378D05565D3C624B1604EFFBE17123537D26023B9ACFF141DA49

很遗憾,没有-d-privateExponent 开关。您必须使用其他方法对其进行解析。

【讨论】:

    猜你喜欢
    • 2018-11-27
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 2012-01-02
    • 2023-03-21
    • 2011-11-05
    相关资源
    最近更新 更多