DSA против RSA и AES128 против шифрования AES256 в Java - PullRequest
1 голос
/ 21 февраля 2012

DSA & RSA

Дело не в том, кто из них сильнее.

Я изучал этот вопрос в Интернете, и ниже приводится краткое изложение информации, которую я получил.Можете ли вы сообщить, если это правильно или нет, и если есть какие-то дополнительные важные вопросы, которые я здесь не упоминаю.

Здесь я говорю только о DSA против RSA в приложении к Java.Моя главная цель - использовать алгоритм с открытым ключом для отправки сессионного ключа (AES) с клиента на сервер, а затем для проверки подлинности клиента.

DSA.
1.В Java вы должны зашифровать файл закрытым ключом.
2.Это означает, что ЭТО - подпись - любой человек с открытым ключом может прочитать ее, но подписать ее может только владелец.
3.Если вы попытаетесь использовать открытый ключ как закрытый, и наоборот, у вас возникнут проблемы, потому что не так сложно угадать открытый ключ по частному.
4.Вы фактически не можете использовать DSA для отправки ключа сеанса, потому что каждый сможет его расшифровать.

RSA.
1.В Java вы должны зашифровать файл с открытым ключом.
2.Это означает, что это лучший способ доставки секретных сообщений одному конкретному получателю.Никто не может прочитать его после подписания, кроме владельца.
3.Если вы попытаетесь переключать клавиши друг с другом, это вызовет проблемы (такие же, как указано выше)
4.Вы можете эффективно использовать RSA для клиента, чтобы посылать ключ сеанса, зашифрованный открытым ключом сервера, и затем получать подтверждение от серверов, подписанных открытым ключом клиента.

Исходя из этого, я решил использовать RSA для своих целей.

AES256 против AES128

Еще один несвязанный вопрос - думаете ли вы, что для шифрования сеанса без каких-либо чрезвычайно конфиденциальных данных имеет смысл использовать AES256?

Я бы хотел, но он создаетпроблемы для конечного пользователя.Я знаю, что очень легко установить обновление для Java, которое позволяет использовать 256-битные ключи, но печальная правда в том, что даже такая простая вещь может сократить потенциальную базу пользователей наполовину.

С другой стороны - если я этого не сделаюотправить конфиденциальную информацию (например, номера кредитных карт), и каждый ключ используется не более чем на несколько дней, может быть, AES128 достаточно?

Очевидно, я собираюсь включить возможность использовать AES256 для тех пользователей, которые не являютсябеспокоит необходимость установки обновления.

Спасибо за любые комментарии!

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

Как вы узнали, DSA является только алгоритмом подписи, а не шифрованием, и поэтому не подходит для обмена ключами.

Если у вас есть онлайн-соединение (а не просто транспортировка из одной точки в другую), вы можете использовать Диффи-Хеллмана (который основан на сходных идеях, таких как DSA) и использовать DSA или RSA в режиме подписи для аутентификации другого сторона, чтобы избежать атаки "человек посередине".

Кроме этого, обмен ключами RSA также довольно обычен (то есть отправка ключа AES ключа, зашифрованного с помощью ключа RSA сервера).

Для вариантов AES AES-128 должен быть защищен примерно в любое время (т. Е. Брутфорсинг должен занять больше времени, чем вы будете жить). Есть только больший ключевой вариант, так как военные США хотели использовать разные уровни безопасности для разных вещей. (А также, AES-256 в последнее время демонстрирует некоторые (теоретические) недостатки, которых нет в AES-128, что может означать, что AES-128 на самом деле более безопасен.)

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

Для онлайновой (двусторонней) связи лучше всего использовать SSL (или, теперь лучше, его преемник TLS). В Java он доступен как класс SSLEngine (если вы хотите использовать асинхронный ввод / вывод) или с SSL(Server)SocketFactory (для обычного чтения / записи сокетов). Я использовал это для связи апплет / сервер (для моего проекта fencing-game ).

Для автономной (однонаправленной) связи (например, электронной почты) или хранения используйте формат данных PGP (который также может использовать RSA и AES). (Хотя я не знаю о существующей реализации Java.)

1 голос
/ 21 февраля 2012

DSA означает «Алгоритм цифровой подписи».Это предназначено для подписей.Вы не можете использовать его для шифрования чего-либо.

AES128 достаточно достаточно для защиты конфиденциальной информации.Даже правительство США разрешает использовать его для чего угодно, кроме информации, классифицируемой как TOP SECRET, и это только из-за менталитета «лучше, чем потом сожалеть», и учитывая, что такая информация все еще может быть вредной, если ее расшифровать через 50 лет.Я не колеблясь ни секунды, чтобы использовать его для передачи номеров кредитных карт (срок действия которых истекает менее чем через 10 лет).

...