openssl - 生成 rsa 密钥对 - 公钥

信息安全 openssl
2021-09-05 10:35:15

我正在尝试使用以下命令生成 RSA 1024 密钥对(公共/私有)

openssl genrsa -des3 -out server.key 1024

在 server.key 文件中,只有 RSA 私有块存在,那么公钥到哪里去了?

2个回答

RSA 私钥格式包括所有公共元素。当您获得私钥时,您实际上同时拥有私钥和公钥。

这在PKCS#1(领先的 RSA 标准)中有所描述;私钥格式是一个编码的 ASN.1 结构,其中包含:

  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
  }

公钥实际上包含在私钥结构中的模数公钥指数中,如上所示。


现在你的问题可能是:“如果我想要‘单独’的公钥怎么办?”

OpenSSL 存在于 X.509 世界中。X.509中,公钥不作为独立值存在;并且没有单独的公钥的标准文件格式。应用程序应该使用它在证书中找到的公钥。这在SSL/TLS协议(这是 OpenSSL 的主要支持目标)中非常明显:当客户端发送其公钥时,它会将其作为证书发送。因此,如果您想要文件中的公钥,请安排将其存储在证书中(可能是自签名的)。带有标志的 OpenSSL req子命令可以提供帮助。-x509

当然,每条规则都有例外,所以也有一种方法可以“只”从私钥中获取公钥;这就是@uwotm8 在他的回答中显示的内容。但是,生成的公钥如下所示:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDzYY+BpIuKouSnoemSwHwC25uW
Xc0zX1gl8NtG5UQP2U4Lda0s5XbBJm4O2W+RkOgR1f1d5cGOXRPd6Q9ntw3MYQv6
ubsMRZUaOT4vCpykWfPi/VfsQEPlWHw2pulYAyumx/sw8tX5i9NC2e2bY4eWwo22
BELyXpNdoGozSje8PQIDAQAB
-----END PUBLIC KEY-----

在任何地方都不能真正使用,因为这是一种非标准格式。

(从技术上讲,这是一个出现在 X.509 证书中的SubjectPublicKeyInfo元素,但它不应该出现在 X.509 证书之外。)

公钥需要从私钥派生。试试这个命令:

openssl rsa -in server.key -pubout