我可以将私钥用作公钥,反之亦然吗?

信息安全 密码学 加密 电子签名
2021-08-10 15:12:17

我有使用公钥加密数据并使用私钥解密数据的代码。当客户端想要将数据发送到服务器并且知道只有服务器可以解密它时,这很有用。

但是假设我希望服务器使用私钥加密数据并使用公钥对其进行解密,作为分发可以验证来自正确服务器的数据的一种方式。我可以简单地发布私钥并将公钥保密,而不是修改代码以允许这样做吗?这会影响系统的安全性吗?

4个回答

但是假设我希望服务器使用私钥加密数据并使用公钥对其进行解密,作为分发可以验证来自正确服务器的数据的一种方式。

您可以做到这一点——这是非常简单的 RSA 签名的工作原理(注意,简单化——还有更多内容)。

我可以简单地发布私钥并将公钥保密,而不是修改代码以允许这样做吗?这会影响系统的安全性吗?

根本不需要发布私钥 - RSA 是一个陷门排列,这意味着:

  • 如果你用公钥加密,你可以用私钥解密。
  • 如果你用私钥加密,你可以用公钥解密。

因此,RSA 支持依靠仅拥有公钥的最终用户进行签名和加密。

在您的情况下,如果客户端希望验证数据来自服务器,则应用 RSA 的第二种情况并使用您已有的公钥解密签名数据。

此外,因为它是一种排列,所以您根本不需要修改您的代码。两个键都应该使用相同的功能。我希望任何体面的加密库都具有用于根据现有的不同标准验证签名的 API——其中一个可能是一个不错的选择。

RSA Labs 对此提供了很好的解释

如果您想在服务器之间扩展它,或验证客户端通信 - 为每个实体生成密钥并交换公共密钥。然后可以在两端使用该过程。

从理论上讲,e 和 d 是可以互换的(这就是 RSA 工作的原因)(必须将其指定为秘密并保密),但 p 和 q 必须始终保密,因为它们允许您从 e 导出 d,反之亦然。但是,您需要非常小心地理解私钥 - 您的软件是否将 p/q 存储在私钥中?如果是这样,您不能按原样发布它。此外,当我说可互换时——一旦你发布了其中一对(e 或 d 以及你的模数 n),你必须用你的生命来保护另一个。实际上,正如格雷姆在评论中所链接的那样e 通常被选为一个小的/固定的值。当 e 很容易确定时,我对 e/d 可互换的评论显然不适用。因此,做这种事情有可能造成混淆和错误实施。使用第三方库/不要开始发布私钥。

是的,您可以使用私钥加密并使用公钥解密,不要分发您的私钥(私钥可以生成公钥,并且您的整个加密系统现在无用),我假设您想做类似的事情这:

服务器加密数据,将其发送给客户端。

客户端拥有公钥,可以解密来自服务器的数据。

在这种情况下,如果服务器同时进行加密和解密,我不知道您为什么需要非对称加密实现。

但该规则始终适用:私钥保持私密,不会离开服务器。

但是假设我希望服务器使用私钥加密数据并使用公钥解密:

服务器可以使用其私钥加密数据,接收方可以使用服务器公钥解密,这是可能的。但是,此方案用于对文档进行数字签名,正如您所说,它是“一种可以验证来自正确服务器的分发数据的方式”,因为只能使用相应的密钥(服务器的公钥)解密数据。服务器的公钥由服务器生成并数字签名的相应数字证书进行验证。

我可以简单地发布私钥并将公钥保密吗?

顾名思义,您永远不应该发布私钥。

这会影响系统的安全性吗?

是的,这个系统也是不可行的,例如,如果您使用 Diffie-Hellman(最广泛使用的密钥交换协议之一),服务器和所有客户端必须共享用于计算会话密钥的公共值. 因此,如果您作为用户发布您的私钥,那么计算公钥非常容易,反之则不可能或非常困难。

我不知道您是否可以使用私钥加密并使用公钥解密,但如果可以,那么它不会很安全,因为解密密钥是公开的 - 您的私钥应该保密。

如果您只想验证消息的发件人,那么您可以使用发件人的私钥对数据进行签名,而收件人使用发件人的公钥验证签名。

如果您希望同时加密数据并验证发件人,您需要加密和签名,这两者都不需要公开私钥。