我不太了解这一点:
根据:http : //www.madboa.com/geek/openssl/#key-rsa,您可以从私钥生成公钥。
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
我最初的想法是它们是成对出现的。RSA私钥是否包含总数?还是公钥?
我不太了解这一点:
根据:http : //www.madboa.com/geek/openssl/#key-rsa,您可以从私钥生成公钥。
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
我最初的想法是它们是成对出现的。RSA私钥是否包含总数?还是公钥?
Answers:
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
e
和d
在公共文献)。数学上的任何人都不是私人的,也不是公共的,它们是在创建时随意分配的标签。可以很容易地将它们反向分配。从另一个生成一个是等效的问题。该.pem
格式包含了一大堆的资料,包括两个指数,所以这两个键,对不对?
openssl genrsa
command 创建的私有RSA密钥文件中。但是,不会在同一步骤中创建单独的公共密钥文件。要将私钥文件中的公钥提取到单独的公钥文件中,请使用openssl rsa -in private.pem -pubout -out public.pem
命令。当您以这种方式产生公钥时,它是从私钥文件中提取出来的,而不是计算出来的。请参阅下面的我的答案以获取更多详细信息。
如果您希望提取公钥以用于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的公共密钥输出到stdout。
openssl rsa -in key.pem -pubout -out pubkey.pem
并未被接受,因为它的输出显然是pem格式的公钥。所以我得到了这个错误:“密钥无效。它必须以'ssh-rsa'或'ssh-dss'开头。请检查您是否正在复制密钥的公用部分”。但是会ssh-keygen -y [-f input_keyfile]
生成Github所采用的正确格式。
在大多数生成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公钥中信息的严格超集。
我在下面的回答有点冗长,但是希望它提供了先前回答中所缺少的一些细节。我将从一些相关的陈述开始,最后回答最初的问题。
要使用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.1和v2.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)复制到一个单独的文件中,该文件成为您的公钥。
e
始终是65537 0x010001
。选择公共指数可能是事实,这可能就是为什么在手册页中的原因,几乎所有地方genrsa
都解释为to generate the private key
。公众很明显。
某些人认为,公钥没有存储在PEM文件中。私有密钥文件上存在以下DER结构:
openssl rsa -text-在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
呢
首先,快速回顾一下RSA密钥生成。
公用密钥由模数和公用指数组成。
最小私钥将由模数和私钥指数组成。从已知的模数和私有指数到相应的公共指数,没有从计算上可行的保证方法。
然而:
因此,在大多数实际的RSA实现中,您可以从私钥中获取公钥。在这不可能的情况下,有可能构建基于RSA的密码系统,但这还没有完成。
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.