【发布时间】:2011-03-14 18:39:16
【问题描述】:
过去几天我一直在玩 Bouncy Castle (java),我已经达到了我相信我可以通过 Diffie-Hellman 交换安全地交换密钥的地步。
阅读了许多强调正确实施加密交换困难的帖子后,我希望您能对我的工作发表诚实的看法。 所有底层密码操作都基于 Bouncy Castle,因此可能被认为是可靠的。
String message = "Hello World";
AESCipher aes_client = new AESCipher(256);
RSACipher rsa_server = new RSACipher(2048);
// (Public key sent over the wire)
RSACipher rsa_client = new RSACipher(rsa_server.getPublicKey().getModulus(),
rsa_server.getPublicKey().getExponent());
// The client encodes his AES key with the RSA public key:
byte[] aes_key = rsa_client.encode(aes_client.getKeyBytes());
byte[] aes_iv = rsa_client.encode(aes_client.getInitializationVector());
// (Data sent back over the wire)
byte[] decoded_aes_key = rsa_server.decode(aes_key);
byte[] decoded_aes_iv = rsa_server.decode(aes_iv);
// The server creates an AES server which uses the client key:
AESCipher aes_server = new AESCipher(decoded_aes_key, decoded_aes_iv);
byte[] encoded_message = aes_client.encode(message.getBytes());
byte[] decoded_message = aes_server.decode(encoded_message);
System.out.println(new String(decoded_message));
这种交换可以被认为是安全的吗?我是否应该坚持使用 SSL 套接字,尽管我的辛勤工作会受到伤害? 提前感谢您的意见!
(顺便说一句,我的 Bouncy-Castle-Wrapping-Library 是完全开源的,所以如果你想要存储库的 URL,请告诉我。)
【问题讨论】:
-
对于codereview.stackexchange.com来说可能是一个更好的问题
-
我不知道这个网站。谢谢你的信息,我会在那里回答我的问题。
-
@Executifs,你怎么知道和中间人打架。您需要一些根证书来验证服务器公钥。还是客户端已经安装了公钥?
-
以上都不是:MITM 尚未被确定为对我的应用程序的威胁。被动窃听是这里唯一的目标。不过,预安装公钥是一个可行的选择。
-
@Executifs,如果你能确保非常可信的连接(没有 DNS 攻击?),你应该没问题。虽然交换 sym 的方式更简单。密钥只是一个 SSL 套接字(通常是 https)和交换,继续使用 AES/RCx/whatever
标签: java cryptography rsa aes diffie-hellman