如果我保留 public 密钥并发布私有密钥怎么办?

What if I keep public key and publish the private one?

据我所知,我必须确保私钥安全并发布 public 密钥,这样任何人都可以使用 public 密钥加密任何数据,我可以解密它使用我自己的私钥(没有人拥有)。

问题是,如果我公开私钥并保留public密钥呢?该算法似乎再次起作用:任何人都使用私钥(已发布)锁定数据,但没有人拥有 public 密钥(由我保管)。

public 键是什么,public 键是什么?哪些安全重要的数据存储在我不应该向任何人展示的私钥上?

根据系统用途,public键可能是'well known'。例如,对于 RSA,public 密钥只是您的模数加上 public 指数 65537,而私钥是模数加上私有指数(这是真正的秘密)。所以知道私钥的人在默认情况下也几乎知道 public 密钥。大多数基于椭圆曲线的系统也是如此。

理论上,可以构建一个 RSA 样式的系统,其中 public 指数也很难确定(比如随机生成的足够多的位值是不可猜测的),在这种情况下,它将是更对称,但这不是通常设置系统的方式。在任何情况下,知道密钥背后的秘密参数(RSA 中的模数因子)的人都可以轻松地从私钥确定 public 密钥或从 public 密钥确定私钥。


在像 Diffie-Hellman 这样的系统中,public 密钥实际上是通过众所周知的算法从私钥派生出来的(除了私钥本身没有其他秘密参数),所以在这种情况下密钥根本不对称,任何知道私钥的人都可以轻松确定 public 密钥。

对于完整的加密+解密(或签名+验证)过程,您始终需要两个密钥。一个用于 encryption/signing,另一个用于 decryption/verifying。你使用哪个键进行哪个操作(原则上)是无关紧要的,只要你使用相应的另一个键进行反向操作即可。

因此,假设您使用 openssl 之类的工具生成密钥对 AB.

在发布其中一个密钥时,我们必须考虑两个方面

  • 数学:从纯数学的角度来看(暂时忽略安全性),你制作哪个键是无关紧要的public 并且您将其保密。所有进程都将以任何一种方式工作。

    decrypt(encrypt(data, A), B) == data == decrypt(encrypt(data, B), A) verify(sign(data, A), B) == OK == verify(sign(data, B), A)

  • 安全性: 当我们考虑到安全性时,只能通过数字签名来证明你的身份,如果你使用密钥,其他人不可能知道.对于某些密码系统,可以从密钥 B 导出密钥 A,即存在这样的函数

    A = f(B)

    但反之则不然,即没有函数使得

    B = f(A)

    因此,当你知道B的那一刻,你也知道A,但如果你知道A,则没有你可以得出 B.

    的可能性

因此B称为私钥,必须保密,A是public密钥,可以公开。如果你反过来做,从数学的角度来看,这些过程仍然有效(尽管大多数系统会拒绝你的密钥),但它们不再安全了......