我真的不明白这个:
根据https://www.madboa.com/geek/openssl/#key-rsa,您可以从私钥生成公钥。
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
我最初的想法是它们是成对生成的。
RSA 私钥是否包含总和?还是公钥?
我真的不明白这个:
根据https://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 目的获取可用的公钥,请使用ssh-keygen:
ssh-keygen -y -f key.pem > key.pub
如果您希望提取用于 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 公钥打印到标准输出。
在大多数生成 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)复制到一个单独的文件中,该文件将成为您的公钥。
公钥并不像某些人认为的那样存储在 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
就是
在此代码中,我们首先创建 RSA 密钥,它是私有的,但它也有一对公钥,因此要获取您的实际公钥,我们只需执行此操作
openssl rsa -in mykey.pem -pubout > mykey.pub
希望你能得到更多信息检查这个
首先快速回顾一下 RSA 密钥的生成。
公钥由模数和公共指数组成。
最小的私钥将由模数和私有指数组成。从已知模数和私有指数到相应的公共指数,没有计算上可行的万无一失的方法。
然而:
因此,在大多数实际的 RSA 实现中,您可以从私钥中获取公钥。有可能建立一个基于 RSA 的密码系统,这是不可能的,但这不是完成的事情。
名为“私钥”的文件包含比单独的私钥更多的信息,它包括生成私钥/公钥对所需的所有数据(素数、模数、指数等)。
并且很容易看到这些信息:
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
您将看到该私钥文件包含素数和所有其他信息,而公共文件仅包含模数和公共指数。
使用以下命令:
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.
如果您检查将有一个由名称创建的文件:mycert.pem
openssl rsa -in mycert.pem -pubout > mykey.txt
writing RSA key
如果您检查相同的文件位置,则会创建一个新的公钥mykey.txt
。
似乎是流行的非对称密码学的一个共同特征;公钥/私钥的生成涉及生成私钥,其中包含密钥对:
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