Криптографический ключ обмен


Я первоначально написал это на сайте StackOverflow, и был перенаправлен сюда. Я играл вокруг с надувным замком (Ява) за последние несколько дней, и я пришел к точке, где я могу безопасно обмениваться секретными ключами с Диффи-Хелмана.

Прочитав много постов, подчеркивая трудность должным образом осуществлять обмен зашифрованными сообщениями, я бы хотел узнать ваше честное мнение о моей работе. Все основные операции шифрования базируются на оживленный замок и, следовательно, могут считаться надежными.

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, несмотря на то, что будет больно лупить мою тяжелую работу? Заранее спасибо за Ваш вклад!

(Кстати, мой надувной-замок упаковка-библиотека является полностью открытым исходным кодом, так что просто дайте мне знать, если вы хотите, чтобы URL-адрес репозитория.)



1351
4
задан 14 марта 2011 в 07:03 Источник Поделиться
Комментарии
1 ответ

Очень сложно вам ответить, потому что то, что ты написал-это тест-постели, где байтовые массивы передаются по кругу в контексте языка высокого уровня, в отличие от реальной ситуации, где вы бы (как минимум) двух взаимодействующих процессов вниз по трубе, TCP-сокет или похожие. Подробности о том, как вы делаете это имеют решающее значение; получать их неправильно разрушит вашу безопасность так же легко, как если вы получаете крипто неправильно.

Я не думал очень о код, но эти вопросы сразу же приходят на ум:


  • Как вам передача и прием данных по сети - как твои пакеты с разделителями и парсится?

  • Как ключи шифрования генерируются, в частности, что их случайный источник?

  • Как ключи хранились на обоих концах?

  • Что АСР заполнения и режимом ня вы используете?

  • Откуда вы знаете, что ключа у вас действительно принадлежит человеку, вы думаете, он делает, а не какой-то человек в середине? Иными словами, как вы устанавливаете доверие к этому ключу?

Как уже говорили другие, вы должны повторно использовать существующую библиотеку, чтобы использовать устоявшийся протокол. Вы можете прочитать фигурку руководство для АЭС: обратить особое внимание на ноги-съемки предупреждения договор; что касается не изобретать свой собственный крипто алгоритмов, также относится к протоколам.

4
ответ дан 17 марта 2011 в 02:03 Источник Поделиться