我一直在尝试Java中的一些基本加密技术(我的首选编程语言),并且有一个简单的例子,它使用模幂运算在两个客户端对之间生成共享密钥。
但是,鉴于共享的秘密,实际使用这个秘密加密/解密或加密/解密通过网络发送的数据有哪些简单实现(但是安全)的方法?
例如,如果我有字符串:
"So long, and thanks for all the fish"
共享秘密(BigInteger
):
1110278255331388386297296974141977
如何通过网络发送字符串,使客户能够相互理解,同时确保没有共享秘密,没有中间人可以解释它?
我不是要求完成实现,只是对可以使用的算法/技术的想法或参考。我也避免依赖现有的程序或API(如公钥/私钥),因为这只是我自己教育目的的一个副项目。
答案 0 :(得分:3)
有一种标准的方法可以完成您所追求的目标,这种方法称为基于密码的密钥派生。您需要使用安全的对称加密算法。你当然可以选择像RSA这样的非对称的,但是有一个共享的秘密,这是多余的。
但是,您不希望直接使用共享密钥。
这就是为PBKDF2(基于密码的密钥派生函数2)而发明的算法。 PBKDF2已经在标准java中实现,您可以使用它。它根据“密码短语”生成任意大小的安全密钥,在这种情况下,这只是共享密钥。这些算法族具有迭代参数,该参数指示应用散列函数导出密钥的次数。确保将其设置为几千的高数字。
我应该注意,在这种情况下,安全性(传输数据的机密性和完整性)依赖于您的共享秘密实际上是秘密的。我不知道你是如何产生它的,但是你需要确保这个过程是安全的。 Diffie-Hellman Key Exchange就是一个很好的例子。如果您对此不熟悉,我建议您先看看如何确保流程安全。
正如评论中已经说明的那样,您不需要(也不应该)在实际应用中进行密码学创新。您将找到您已经实施并证明安全的任何内容。尽管我的最后一句话含糊不清。