5

我一直在用 Java(我的首选编程语言)尝试一些基本的加密技术,并有一个简单的例子,它使用模幂在两个客户端对之间生成共享密钥。

但是,给定一个共享的秘密,有哪些易于实现(但安全)的方法来实际使用这个秘密来加密/解密或加扰/解扰通过网络发送的数据?

例如,如果我有字符串:

"So long, and thanks for all the fish"

和共享秘密(BigInteger):

1110278255331388386297296974141977

如何以允许客户端相互理解的方式通过网络发送字符串,同时确保没有共享秘密,没有中间人可以解释它?

我不是要求完成的实现,只是对可以使用的算法/技术的想法或参考。我也避免依赖现有的程序或 API(如公钥/私钥),因为这只是我自己的教育目的的一个副项目。

4

1 回答 1

3

有一种标准的方式来做你所追求的,这就是所谓的基于密码的密钥派生。您需要使用安全的对称加密算法。您当然可以选择 RSA 之类的非对称方法,但使用共享密钥是多余的。

但是,您不想直接使用您的共享密钥。

  1. 您的共享密钥的大小可能不适合用作密钥。例如,AES 作为一个不错的选择,接受 128 位和 256 位密钥,共享密钥可能不是一个很好的匹配。
  2. 您选择的对称算法的密钥应该足够安全,这意味着它应该具有您的共享密钥可能缺乏的安全级别的随机性。

这正是 PBKDF2(基于密码的密钥派生函数 2)等算法的发明目的。PBKDF2 已经在标准 java 中实现,您可以使用它。它基于“密码短语”生成任意大小的安全密钥,在这种情况下,这只是共享秘密。这些算法家族有一个迭代参数,它指示应用哈希函数多少次来导出密钥。确保将其设置为较高的数字,例如几千。

我应该注意,在这种情况下,安全性(传输数据的机密性和完整性)依赖于您共享的秘密实际上是秘密的。我不知道您是如何生成它的,但是您需要确保该过程是安全的。Diffie-Hellman 密钥交换就是一个很好的例子。如果您对此不熟悉,我建议您查看并查看确保该过程安全的方法。

正如评论中已经指出的那样,您不需要(也不应该)在密码学方面进行创新以实现实际应用。您会发现您需要的任何东西都已经实施并被证明是安全的。不过,我的最后一句话还是有保留的。

于 2012-10-29T23:33:39.060 回答