通过阅读各种材料我理解的很少,公钥 - 私钥对是非对称加密的基础,也是选择2个素数(大致是你的私钥)并乘以它们(大致是你的公钥)的东西),如果您知道私钥,我似乎可以生成公钥。这是正确的还是我误会了什么?
[编辑]
让我更加困惑的是,无法使用仅私钥(使用.NET类RSACryptoServiceProvider)将RSA密钥序列化为XML。不确定这种限制是否有意!
答案 0 :(得分:45)
在大多数非对称加密系统实现中,唯一确保的事实是您无法从公钥中找到私钥。反过来说,在大多数情况下,从私钥中查找公钥是微不足道的。
例如,在RSA中,您可以使用以下命令从私钥创建公钥:
openssl rsa -in private.pem -pubout -out public.pem
术语误导的是:“私钥”指的是2个不同的概念,无论您是在谈论理论,还是在谈论实际实施:
0x10001
,尽管可以更改,强烈建议仅坚持very specific values)。因此,从私钥中推断公钥(e,n)是不平凡的,原因不止一个。答案 1 :(得分:32)
这取决于加密系统。
在 RSA 中,我们(引用维基百科):
公钥由模数n和公共(或加密)指数e组成。该 私钥由模数n和私有(或解密)指数d组成 必须保守秘密。
现在,如果我们有n和d(私钥),我们只缺少公钥的e。但是e通常相当小(少于三位数),甚至是固定的(常见值为65537)。在这些情况下,获取公钥是微不足道的。
对于 Elliptic Curve Diffie-Hellman ,私钥是d,公钥dG(G也是公共的),所以它也很简单。
答案 2 :(得分:9)
这取决于算法,以及“私钥”的含义。
RSA私钥通常存储在“中国剩余定理”表格中。例如,PKCS#1中定义并由许多其他加密标准重用的RSAPrivateKey
结构采用这种形式。此表单包含通常表示为p
和q
的两个密码,从中计算出总数。使用totient和private exponent,可以快速计算公共指数。
在任何情况下,大多数RSA密钥对使用65537作为公共指数,并且模数总是作为私钥的一部分携带。
答案 3 :(得分:3)
在任何公钥加密系统中,公钥在数学上与私钥相关。这很简单。
公钥是在生成时从私钥派生的,并且在将来的任何一点都可以使用私钥,可以轻松地重新派生公钥。
走另一条路是不可行的。给定公钥,导出私钥并不容易。这就是我们可以安全地与其他人共享公钥的原因。如果你有足够的时间/ CPU周期,你可以强制它,但可能更容易等待对密钥的数学攻击。
答案 4 :(得分:2)
对于OpenSSH和ssh-keygen的特定情况,是的,您可以:
ssh-keygen -y
此选项将读取私有OpenSSH格式文件并将公钥打印到stdout。
通常,它取决于算法以及您为私钥标记的内容。但是,任何合理的实现都将包括秘密文件中的完整信息(公钥和私钥)。
答案 5 :(得分:2)
对私钥的含义存在误解。私钥只是(d,n)对,除此之外,从它生成公钥是不可行的,除非你可以假设公共指数是65537,几乎所有rsa密钥就是这种情况。 / p>
如果出于任何原因,公共指数是一个较大的数字,则无法从私人指定中创建公钥。
也就是说,该值存储为"私钥" pem文件不仅仅是私钥,还包含主要因素(以及其他内容),因此很容易从中生成公钥。
答案 6 :(得分:1)
是的,访问私钥可以生成公钥
答案 7 :(得分:1)
是的,可以使用私钥获取公钥。可以使用 openssl 来完成。请参考以下命令使用私钥获取公钥。
openssl rsa -in privatekey.pem -pubout
答案 8 :(得分:0)
公钥是模数N(和公共指数e,通常是65537), 私钥由两个素数p,q(和私有指数d,有时也是CRT部分d_p,d_q用于加速)给出 基本上你有N = pq和e d = 1 mod((p-1)(q-1)),你也可以使用CRT计算d_p和d_q 如果标准e不够好,给定私钥,公钥模数的计算是“无聊的”乘法,公共指数是规范的或使用扩展的欧几里德算法计算。 给定公钥,私钥的计算需要找到d(RSA问题)或p,q(因子分解,参见数字字段筛选以获得最佳算法)。在合理的条件下,这些问题被证明是相同的[打破RSA通常相当于保理,D. Aggarwal和U. Maurer,2008]
答案 9 :(得分:-2)
理论上可行,但对于大键,计算上不可行。