使用RSA私钥生成公钥?

我不太明白这个问题:

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

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

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

RSA私钥中是否包含该和?还是公钥?

714193 次浏览
openssl genrsa -out mykey.pem 1024

实际上会产生一个公私钥对。这个pair存储在生成的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

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

A.1.2 RSA私钥语法

RSA私钥用ASN.1类型
RSAPrivateKey: < / p >

  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公钥中信息的严格超集。

在这段代码中,我们首先创建的是RSA密钥,它是私有的,但它也有一对公钥,所以要获得实际的公钥,我们只需这样做

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

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

寻找SSH公钥的人…

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

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

此公钥格式与OpenSSH兼容。将公钥附加到remote:~/.ssh/authorized_keys,你就可以开始了


SSH-KEYGEN(1)中的docs

ssh-keygen -y [-f input_keyfile]

可能是该选项将读取私有的OpenSSH格式文件,并将OpenSSH公钥打印到标准输出。

公钥并不像某些人认为的那样存储在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所做的

使用以下命令:

  1. < p > 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. < p > openssl rsa -in mycert.pem -pubout > mykey.txt

    writing RSA key
    
  4. 如果你检查同一个文件位置,一个新的公钥mykey.txt已经创建。

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

要使用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

来剖析私人的内容。pem由openssl命令生成的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(公共指数),因此可以从私有密钥生成/提取/导出公共RSA密钥。pem RSA私钥。其余5个组件用于加速解密过程。事实证明,通过预先计算并存储这5个值,可以将RSA解密速度提高4倍。没有这5个组件,解密也可以工作,但如果手边有它们,解密速度会更快。加速算法基于中国剩余定理

是的,私人。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

RSA私钥的这种结构是由PKCS # 1 v1.5推荐作为替代(第二个)表示的。PKCS # 1版本标准将e和d指数从替代表示中完全排除。PKCS # 1 v2 .v2.2通过可选地包含更多与crt相关的组件,建议进一步更改替代表示。

公开查看内容。pem public RSA key执行如下命令(此处输出截断为标签):

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


Modulus             - n
Exponent (public)   - e

这里没有惊喜。就像之前说的,是(n, e)对。

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

首先简要回顾一下RSA密钥生成。

  1. 随机选择两个大小合适的可能质数(p和q)。
  2. 两个质数相乘得到模量(n)。
  3. 选择一个公共指数(e)。
  4. 用质数和公共指数做一些数学运算,以生成私有指数(d)。

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

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

然而:

  1. 实用的私钥格式几乎总是存储超过n和d的数据。
  2. E通常不是随机选取的,而是使用少数几个已知值中的一个。如果e是一个众所周知的值,你知道d,那么通过试错很容易求出e。

在大多数实际的RSA实现中,你可以从私钥中获得公钥。建立一个基于RSA的密码系统是可能的,而这是不可能的,但这不是做的事情。

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

openssl genrsa -out mykey.pem 1024

然后发布公钥:

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

openssl rsa -in mykey.pem -pubout -out mykey.pub
< p > DSA,EC加密密钥具有相同的特性: 如:< / p >
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密码名

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

很容易看到这些信息:

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

您将看到私钥文件包括质数和所有其他信息,而公共文件只包括模数和公共指数。