【问题标题】:Public Key Encryption公钥加密
【发布时间】:2013-04-05 19:25:53
【问题描述】:

我正在考虑使用公钥加密在两台计算机之间进行通信。

让我们假设在一台计算机上我生成了一个私钥和一个公钥。如果我将公钥发送到另一台计算机,它仍然可以被数据包嗅探器捕获并使用它来解密我的消息吗?如果是,可以做些什么来防止这种情况发生,那么公钥加密的用途是什么?

更新

SSL 是否等同于公钥加密?我应该改用它吗?

【问题讨论】:

  • 公开的意思是……嗯……它是公开的,不是秘密的。你应该参考维基百科。
  • SSL 是否自行实现公钥加密?

标签: c# encryption public-key-encryption


【解决方案1】:

没有。公钥不是用来解密的,而是用来加密的。你用你的私钥解密。这样,只有可以解密消息。

不过,通常情况下,私钥-公钥加密的成本太高,无法用来加密数据。您将使用私有/公共加密方案来交换共享密钥(大随机数)来加密您的数据。

示例:Alice 创建一个私钥/公钥对,将公钥发送给 Bob。 Bob 创建一个很大的随机数并用 Alice 的公钥对其进行加密。爱丽丝可以解密它并找到大的随机数。然后 Alice 和 Bob 使用随机数加密他们的数据流。

作为额外的安全措施,您可以定期更改密钥。

更新您的 SSL 问题:它的工作原理与我上面描述的完全一样。另见http://en.wikipedia.org/wiki/Transport_Layer_Security

【讨论】:

  • 不对,你也可以用私钥加密,用公钥解密。密钥可以让客户端知道它正在连接到“合法”服务器,但无法帮助服务器确保它是“合法”客户端,因为存储在客户端或从服务器发送的密钥可能会被泄露。更好的解决方案是实现自己的算法以防止被黑客入侵。
  • 使用公钥解密意味着每个人都可以解密你的消息,它与加密无关,但与身份验证有关完全不同。
  • 在 RSA 理论中你是对的,但这意味着只有一侧可以确保合法。让我们考虑一下银行网站,客户应该知道他在合法网站上,但是银行服务器不需要确保客户是否合法,因为mobile phone authentication和其他方法可以解决问题。 mobile phone authentication 类似于“哈希方法”,因此,哈希方法是必须的。仅 RSA 无法确保安全。
  • @ReckHou 在您的示例中,您将使用完全不同的系统,使用证书、证书颁发机构和“信任网络”。可以单独使用 RSA,例如通过使用签名方案。 (服务器创建明文并使用私钥对其进行签名;然后客户端使用公钥验证签名和明文。不涉及哈希,并确保服务器的真实性。)
  • @Bruno:第一个问题,我认为他对 RSA 算法不清楚,所以你是对的。第二个问题,如果我们通过互联网发送密钥,这意味着“没有加密”。如果我们将密钥存储在本地,破解者可以通过逆向工程获得它。所以我们必须让它变得更复杂。一个可悲的事实是,即使是拥有无穷无尽资源的公司也可能彻底失败,比如暴雪的 WOW。
【解决方案2】:

答案是肯定的,可以被嗅探器捕捉到。

为什么单独使用 RSA 不适合 Matt 的情况?

在马特的情况下,他希望确保两台计算机都是合法的。我的观点是 RSA 只能确保其中 1 个是合法的,而不是两个都合法。

另一个重要的事情是破解者CAN也使用私钥加密和公钥解密。密钥可以让客户端知道它正在连接到“合法”服务器,但无法帮助服务器确保它是“合法”客户端,因为存储在客户端或从服务器发送的密钥可能会被泄露。更好的解决方案是实现自己的哈希算法以防止被黑客入侵。

这是一篇关于 RSA 私钥加密的文章:

http://www.codeproject.com/Articles/38739/RSA-Private-Key-Encryption

以银行网站为例,客户应该知道自己在合法网站上,但银行服务器不需要确保客户合法与否,手机认证等方法可以解决问题。手机认证就像“散列法”,所以,散列法是必须的。仅 RSA 无法确保安全。

如果不使用哈希方法,如果破解者将密钥存储或通过互联网传输,他可以轻松制作假客户端,没有任何困难。

那么,你的解决方案是什么?

由于我正在实施基于客户端-服务器的软件,我可以与您分享我的解决方案:

  1. 我将私钥保存到客户端的源代码中。

  2. 当服务器发送一些响应或客户端发送一些请求时,由对方使用私钥/公钥加密和解密。

  3. 您需要一些保护,例如代码混淆来保护存储在客户端中的密钥。

  4. 您需要设计一个哈希算法来保证客户端发送的数据是合法的。黑客最终可能会得到你的密钥,但很难知道你的算法是什么,所以它仍然足够安全。

  5. 哈希算法是指结合添加一些盐/SHA-1/UUID/timestamp...等的算法。我并不是说你应该发明一种新的加密算法。

例如,如果纯文本是I'm so awesome

算法可以是:

结果 = SHA1(盐 + 纯文本 + 时间戳 + 你喜欢的任何东西)

如果发现您的算法泄露,只需更改一些键值即可。

如果你的哈希算法泄露了怎么办?

请记住,没有不能被黑客入侵的算法。 我们不需要建造一座不能摧毁的城堡,我们只需要让敌人付出沉重的代价。

不过,如果出现任何问题,您还需要一个快速的“红色大按钮”。哈希算法可以很容易地扮演这个角色,一个小的修改可以让破解者花费大量的时间来破解它。这已经足够好了。

更新:

SSL 是否等同于公钥加密?我应该改用它吗?

是的,但是您仍然必须将密钥存储在比通过网络发送更好的地方。 HTTPS/TLS 是另一个不错的选择。

【讨论】:

  • 我明白了。因此,您将密钥物理存储在其他应用程序中,而不通过互联网发送?
  • 不要将私钥放入您的代码中。它们是私人的,不应共享。
  • 另外,不要设计自己的哈希算法。除非你有代数博士学位,否则你会失败。即使你这样做了,你仍然可能。密码学的第一条规则:不要自己动手。
  • @BartFriederichs RSA 算法并不像您想象的那么安全,因为在 Matthew 的情况下,他希望两台计算机都确保“合法”。如果他有一把钥匙,破解者很容易制造一个假客户。
  • @BartFriederichs 我说的是“哈希算法”,这意味着您可以结合添加一些盐/SHA-1/UUID/时间戳来执行哈希算法。你错了,因为我并不是说你应该发明一种新的加密算法。
猜你喜欢
  • 1970-01-01
  • 2018-02-27
  • 2013-04-06
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
相关资源
最近更新 更多