给定私钥,是否可以派生其公钥?

Hem*_*ant 51 .net encryption cryptography encryption-asymmetric

通过阅读各种材料,无论我理解什么,公钥 - 私钥对都是不对称加密的基础,也是选择2个素数(大致是你的私钥)并乘以它们(大致是你的公钥)的东西,我如果您知道私钥,则可能会生成公钥.这是正确的还是我错了什么?

[编辑]

让我更加困惑的是,只能使用私钥(使用.NET类RSACryptoServiceProvider)将RSA密钥序列化为XML .不确定这个限制是否有意!

vaa*_*aab 48

在大多数非对称加密系统实现中,唯一确保的事实是您无法从公钥中找到私钥.反过来说,在大多数情况下从私钥中找到公钥是微不足道的.

例如,在RSA中,您可以使用以下私钥创建公钥:

openssl rsa -in private.pem -pubout -out public.pem
Run Code Online (Sandbox Code Playgroud)

误导的是术语:"私钥"指的是2个不同的概念,无论你是在谈论理论,还是在谈论实际实现:

  • 理论的私钥是夫妻(d,n)的这股完美对称(数学)的关系(E,N) .如果您要比较这些,则无法从另一个计算.
  • 实际私钥(如在例如OpenSSL实现),是指包含一个文件(d,n)的同时也为解码速度目的的几个重要的中间值.除此之外,公钥e的理论上"未知"部分通常按惯例固定为常用值(0x10001默认情况下为openssl,虽然可以更改,但强烈建议仅遵循非常具体的值) .因此,从私钥中推导出公钥(e,n)是微不足道的,原因不止一个.


sle*_*ske 34

这取决于加密系统.

RSA中,我们(引用维基百科):

公钥由模数n和公共(或加密)指数e组成.私钥由模数n和私有(或解密)指数d组成,必须保密.

现在,如果我们有n和d(私钥),我们只缺少公钥的e.但是e通常相当小(少于三位数),甚至是固定的(常见值为65537).在这些情况下,获取公钥是微不足道的.

对于Elliptic Curve Diffie-Hellman,私钥是d,而公钥dG(G也是公共的),所以它也是微不足道的.

  • @Henno Bransma:你如何计算"p和q使得pq = n"? (3认同)
  • @flarn2006:它_是_乘法 - 但不是你在学校学到的类型,而是椭圆曲线点乘法(https://en.wikipedia.org/wiki/Elliptic_curve_point_multiplication)。与普通乘法不同,椭圆曲线上不可能进行“除法”。 (2认同)

eri*_*son 9

这取决于算法,你的意思是"私钥".

RSA私钥通常存储在"中国剩余定理"表中.例如,RSAPrivateKeyPKCS#1中定义的结构以及许多其他加密标准重用的结构采用这种形式.这种形式包括两个秘密数字通常表示pq,从该欧拉被计算.使用totient和private exponent,可以快速计算公共指数.

在任何情况下,大多数RSA密钥对使用65537作为公共指数,并且模数总是作为私钥的一部分携带.


Mic*_*kis 7

对于私钥是什么存在误解。私钥只是 (d,n) 对,仅此一点,就不可能从它生成公钥,除非您可以假设公共指数为 65537,几乎所有 rsa 密钥都是这种情况。

如果出于某种原因,公共指数是一个较大的数字,则您无法从私有密钥创建公共密钥。

也就是说,作为“私钥”存储到 pem 文件的值不仅仅是私钥,还包含素数因子(除其他外),因此,很容易从中生成公钥。


Ada*_*wes 5

在任何公钥加密系统中,公钥在数学上都与私钥相关。这很简单。

公钥是在生成时从私钥派生出来的,并且在将来的任何时候使用私钥都可以轻松地重新派生公钥。

走另一条路是行不通的。给定公钥并不容易推导出私钥。这就是为什么我们可以安全地与其他人共享公钥。如果你有足够的时间/CPU 周期,你可以暴力破解它,但等待对密钥的数学攻击可能更容易。

  • 您需要totient来轻松地重新推导公钥,但私钥只是私有指数和模数。从该信息中导出 totient 需要对大量数字进行因式分解,并且没有已知的快速算法。 (4认同)