492

我真的不明白这个:

根据https://www.madboa.com/geek/openssl/#key-rsa,您可以从私钥生成公钥。

openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub

我最初的想法是它们是成对生成的。

RSA 私钥是否包含总和?还是公钥?

4

10 回答 10

733
openssl genrsa -out mykey.pem 1024

实际上会产生一个公钥 - 私钥对。该对存储在生成的mykey.pem文件中。

openssl rsa -in mykey.pem -pubout > mykey.pub

将提取公钥并将其打印出来。是一个可以更好地描述这一点的页面的链接。

编辑:在此处查看示例部分。仅输出私钥的公共部分:

openssl rsa -in key.pem -pubout -out pubkey.pem

要为 SSH 目的获取可用的公钥,请使用ssh-keygen

ssh-keygen -y -f key.pem > key.pub
于 2011-03-09T12:50:42.000 回答
311

寻找 SSH 公钥的人...

如果您希望提取用于 OpenSSH 的公钥,则需要以不同的方式获取公钥

$ ssh-keygen -y -f mykey.pem > mykey.pub

这种公钥格式与 OpenSSH 兼容。将公钥附加到remote:~/.ssh/authorized_keys,你会很高兴


来自的文档SSH-KEYGEN(1)

ssh-keygen -y [-f input_keyfile]  

-y此选项将读取私有 OpenSSH 格式文件并将 OpenSSH 公钥打印到标准输出。

于 2013-04-07T17:43:27.063 回答
87

在大多数生成 RSA 私钥的软件(包括 OpenSSL)中,私钥表示为PKCS#1 RSAPrivatekey对象或其一些变体:

A.1.2 RSA 私钥语法

RSA 私钥应该用 ASN.1 类型的
RSAPrivateKey 表示:

  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
  }

如您所见,这种格式有许多字段,包括模数和公共指数,因此是RSA 公钥中信息的严格超集。

于 2011-03-09T12:54:58.017 回答
54

我下面的答案有点冗长,但希望它提供了以前答案中缺少的一些细节。我将从一些相关的陈述开始,最后回答最初的问题。

要使用 RSA 算法加密某些内容,您需要模数和加密(公共)指数对(n,e)。那是你的公钥。要使用 RSA 算法解密某些内容,您需要模数和解密(私有)指数对(n,d)。那是你的私钥。

要使用 RSA 公钥加密某些内容,您将明文视为数字并将其提高到 e 模数 n 的幂:

ciphertext = ( plaintext^e ) mod n

要使用 RSA 私钥解密某些内容,您将密文视为一个数字并将其提升到 d 模数 n 的幂:

plaintext = ( ciphertext^d ) mod n

要使用 openssl 生成私有 (d,n) 密钥,您可以使用以下命令:

openssl genrsa -out private.pem 1024

要使用 openssl 从私钥生成公钥 (e,n) 密钥,您可以使用以下命令:

openssl rsa -in private.pem -out public.pem -pubout

要剖析上面 openssl 命令生成的 private.pem RSA 私钥的内容,请运行以下命令(此处的输出截断为标签):

openssl rsa -in private.pem -text -noout | less

modulus         - n
privateExponent - d
publicExponent  - e
prime1          - p
prime2          - q
exponent1       - d mod (p-1)
exponent2       - d mod (q-1)
coefficient     - (q^-1) mod p

私钥不应该只包含 (n, d) 对吗?为什么有 6 个额外的组件?它包含 e(公共指数),以便可以从 private.pem 私有 RSA 密钥生成/提取/派生公共 RSA 密钥。其余 5 个组件用于加速解密过程。事实证明,通过预先计算和存储这 5 个值,可以将 RSA 解密速度提高 4 倍。如果没有这 5 个组件,解密也可以工作,但如果你手边有它们,它可以更快地完成。加速算法基于中国剩余定理

是的,private.pem RSA 私钥实际上包含所有这 8 个值;当您运行上一个命令时,它们都不会即时生成。尝试运行以下命令并比较输出:

# Convert the key from PEM to DER (binary) format
openssl rsa -in private.pem -outform der -out private.der

# Print private.der private key contents as binary stream
xxd -p private.der

# Now compare the output of the above command with output 
# of the earlier openssl command that outputs private key
# components. If you stare at both outputs long enough
# you should be able to confirm that all components are
# indeed lurking somewhere in the binary stream
openssl rsa -in private.pem -text -noout | less

PKCS#1 v1.5推荐这种 RSA 私钥结构作为替代(第二种)表示。PKCS#1 v2.0标准从替代表示中完全排除了 e 和 d 指数。PKCS#1 v2.1v2.2通过可选地包括更多与 CRT 相关的组件来对替代表示进行进一步的更改。

要查看 public.pem 公共 RSA 密钥的内容,请运行以下命令(此处的输出被截断为标签):

openssl rsa -in public.pem -text -pubin -noout

Modulus             - n
Exponent (public)   - e

这里没有惊喜。正如所承诺的,这只是 (n, e) 对。

现在终于回答了最初的问题:如上所示,使用 openssl 生成的私有 RSA 密钥包含公钥和私钥的组件以及更多。当您从私钥生成/提取/派生公钥时,openssl 会将其中两个组件(e,n)复制到一个单独的文件中,该文件将成为您的公钥。

于 2017-06-04T03:15:38.570 回答
21

公钥并不像某些人认为的那样存储在 PEM 文件中。私钥文件中存在以下 DER 结构:

openssl rsa -text -in mykey.pem

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 rsa -in mykey.pem -pubout就是

于 2014-09-25T21:08:57.277 回答
7

在此代码中,我们首先创建 RSA 密钥,它是私有的,但它也有一对公钥,因此要获取您的实际公钥,我们只需执行此操作

openssl rsa -in mykey.pem -pubout > mykey.pub

希望你能得到更多信息检查这个

于 2012-06-26T17:39:45.550 回答
7

首先快速回顾一下 RSA 密钥的生成。

  1. 随机选择两个适当大小的随机可能素数(p 和 q)。
  2. 将两个素数相乘以产生模数 (n)。
  3. 选择一个公共指数 (e)。
  4. 用素数和公共指数做一些数学运算以产生私人指数(d)。

公钥由模数和公共指数组成。

最小的私钥将由模数和私有指数组成。从已知模数和私有指数到相应的公共指数,没有计算上可行的万无一失的方法。

然而:

  1. 实用的私钥格式几乎总是存储多于 n 和 d。
  2. e 通常不是随机选择的,而是使用少数众所周知的值之一。如果 e 是众所周知的值之一,并且您知道 d,那么通过反复试验很容易找出 e。

因此,在大多数实际的 RSA 实现中,您可以从私钥中获取公钥。有可能建立一个基于 RSA 的密码系统,这是不可能的,但这不是完成的事情。

于 2018-05-11T17:44:11.460 回答
2

名为“私钥”的文件包含比单独的私钥更多的信息,它包括生成私钥/公钥对所需的所有数据(素数、模数、指数等)。

并且很容易看到这些信息:

openssl genrsa -out private.pem 1024   #generate private key file
openssl rsa -in private.pem -text      #view info in the private key file
openssl rsa -in private.pem -pubout -out public.pem  #extract public key to file
openssl rsa -in public.pem -pubin -text  #view info in the public key file

您将看到该私钥文件包含素数和所有其他信息,而公共文件仅包含模数和公共指数。

于 2021-08-21T15:24:09.093 回答
1

使用以下命令:

  1. openssl req -x509 -nodes -days 365 -sha256 -newkey rsa:2048 -keyout mycert.pem -out mycert.pem

     Loading 'screen' into random state - done
     Generating a 2048 bit RSA private key
     .............+++
     ..................................................................................................................................................................+++
     writing new private key to 'mycert.pem'
     -----
     You are about to be asked to enter information that will be incorporated
     into your certificate request.
     What you are about to enter is what is called a Distinguished Name or a DN.
     There are quite a few fields but you can leave some blank
     For some fields there will be a default value,
     If you enter '.', the field will be left blank.
    
  2. 如果您检查将有一个由名称创建的文件:mycert.pem

  3. openssl rsa -in mycert.pem -pubout > mykey.txt

    writing RSA key
    
  4. 如果您检查相同的文件位置,则会创建一个新的公钥mykey.txt

于 2016-09-06T08:00:51.920 回答
0

似乎是流行的非对称密码学的一个共同特征;公钥/私钥的生成涉及生成私钥,其中包含密钥对:

openssl genrsa -out mykey.pem 1024

然后发布公钥:

openssl rsa -in mykey.pem -pubout > mykey.pub

或者

openssl rsa -in mykey.pem -pubout -out mykey.pub

DSA 和 EC 加密密钥具有相同的功能:例如。

openssl genpkey -algorithm ed25519 -out pvt.pem

然后

openssl pkey -in pvt.pem -pubout > public.pem

或者

openssl ec -in ecprivkey.pem -pubout -out ecpubkey.pem

公共部分参与解密,将其作为私钥的一部分保存,可以加快解密速度;它可以从私钥中删除并在需要时计算(用于解密),作为使用密码/密钥/短语加密或保护私钥的替代或补充。例如。

openssl pkey -in key.pem -des3 -out keyout.pem

或者

openssl ec -aes-128-cbc -in pk8file.pem -out tradfile.pem

您可以将第一个参数“aes-128-cbc”替换为任何其他有效的 openssl 密码名称

于 2020-09-24T18:12:52.140 回答