ここ数日、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 Sockets を使い続ける必要がありますか? ご意見をお寄せいただきありがとうございます。
(ちなみに、私の Bouncy-Castle-Wrapping-Library は完全にオープンソースなので、リポジトリの URL が必要な場合はお知らせください。)