给定一个私钥,是否有可能派生出它的公钥?

无论我通过阅读各种资料来理解,公私密钥对都是不对称encryption的基础,也是select两个素数(大致是你的私钥)和乘以它们(大致是你的公钥)看来如果你知道私钥就可以生成一个公钥。 这是正确的,或者我错了什么?

[编辑]

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

这取决于密码系统。

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

公钥由模数n和公开(或encryption)指数e组成。 私钥由模数n和必须保密的私钥(或解密)指数d组成。

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

对于椭圆曲线Diffie-Hellman ,私钥是d,公钥dG(G也是公开的),因此也是微不足道的。

在大多数不对称的encryption系统实现中,唯一保证的事实就是你无法从公钥中find私钥。 相反,在大多数情况下,从私钥中find公钥是微不足道的。

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

 openssl rsa -in private.pem -pubout -out public.pem 

误导的是术语:“私钥”是指两种不同的概念,无论您是在说理论还是在谈论实际的实现:

  • 理论私钥是与(e,n)完全对称(math)关系的夫妻(d ,n) 。 如果你正在比较这些,不能从另一个计算。
  • 实际的私钥(例如openssl实现)指的是一个包含(d,n)的文件但也包含了一些用于解码速度目的的重要中间值。 除此之外,公钥e的理论上“未知”部分通常按照惯例固定为公共值(在openssl中默认是0x10001 ,虽然可以改变,但强烈build议只保留非常特定的值 )。 因此从私钥中推断公钥(e,n)是不重要的,原因不止一个。

这取决于algorithm,以及“私钥”的含义。

RSA私钥通常以“中国剩余定理”的forms存储。 例如,PKCS#1中定义的RSAPrivateKey结构被许多其他encryption标准重新使用。 这种forms包括两个秘密数字,通常用pq表示,从中计算总数。 用总体和私人指数来快速计算公开指数。

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

在任何公钥密码系统中,公钥在math上与私钥相关。 这很简单。

公钥是在私钥生成的时候生成的,私钥在将来的任何时候都可以轻易的重新获得公钥。

走另一条路是不可行的。 给定一个公钥,派生私钥并不容易。 这就是为什么我们可以安全地与其他人共享公钥。 如果你有足够的时间/ CPU周期,你可能会蛮横的,但可能更容易等待数字攻击的关键。

对于OpenSSH和ssh-keygen的具体情况, 是的,您可以

ssh-keygen -y

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


一般来说,这取决于algorithm和你私钥的标签。 但是,任何明智的实现都将在秘密文件中包含完整的信息(公钥和私钥)。

是的,访问私钥可以生成公钥

公钥是模数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,公钥指数计算是“无聊”乘法,公开指数在规范中,或者使用扩展欧几里德algorithm,如果标准e不够好。 给定公钥,私钥的计算需要发现d(RSA问题)或者p,q(因子分解,请参见数字域筛选以获得最佳algorithm)。 在合理的条件下,这些问题被certificate是等价的[破译RSA一般等同于保理,D. Aggarwal和U. Maurer,2008]

对私钥是什么有一个误解。 私钥只是(d,n)对,只有这样,除非可以假设公开指数是65537,几乎所有rsa密钥都是这种情况,否则从它生成公钥是不可行的。

如果由于任何原因,公开指数是一个更大的数字,您不能从私人公钥创build公钥。

也就是说,存储为pem文件的“私钥”的值不仅仅是私钥,还包含主要因素(等等),因此,从它生成公钥很容易。

这在理论上是可能的,但是对于大键来说在计算上是不可行的。