使用RSA私钥生成公钥?

我不太明白这个:

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

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

我最初的想法是,他们一起生成一对。 RSA私钥是否包含和? 或公钥?

 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公钥的用户

如果你正在寻找提取OpenSSH使用的公共密钥,你将需要有点不同的公钥

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

这个公钥格式与OpenSSH兼容。 附加公共密钥到remote:~/.ssh/authorized_keys ,你会很好去


来自SSH-KEYGEN(1)文档SSH-KEYGEN(1)

 ssh-keygen -y [-f input_keyfile] 

-y这个选项将读取一个私有的OpenSSH格式文件,并将一个OpenSSH公钥输出到标准输出。

RSA私钥包含生成公钥所需的所有信息。 在大多数格式,包括openssl的私钥被表示为一个PKCS#1 RSAPrivatekey对象或其一些变种:

A.1.2 RSA私钥语法

一个RSA私钥应该用ASN.1types表示
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公钥中信息的严格超集。

公钥并不像有些人想象的那样存储在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所做的

在这个代码中,首先我们创buildRSA密钥,它是私有的,但它也有一对公钥,所以为了得到你的实际公钥,我们只需要这样做

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

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

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

要使用RSAalgorithmencryption某些东西,您需要模数和encryption(公共)指数对(n,e)。 那是你的公钥。 要使用RSAalgorithm解密某些东西,您需要模数和解密(私有)指数对(n,d)。 那是你的私钥

要使用RSA公开密钥encryption某些东西,可以将明文作为一个数字并将其提升到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个组件在那里加速解密过程。 事实certificate,通过预先计算并存储这5个值,可以将RSA解密速度提高到4倍。解密将在没有这5个组件的情况下工作,但如果您拥有这些组件,可以更快地完成解密。 加速algorithm基于中国剩余定理 。

是的,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 

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

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

 openssl rsa -in public.pem -text -pubin -noout Modulus - n Exponent (public) - e 

这里没有什么惊喜。 它只是(n,e)对,如承诺。

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

 Use the following commands: 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. If you check there will be a file created by the name : mycert.pem 3. openssl rsa -in mycert.pem -pubout > mykey.txt writing RSA key 4. If you check the same file location a new public key : mykey.txt will be created.