Security basics, часть 1: симметричное и ассиметричное шифрова | Java: fill the gaps
Security basics, часть 1: симметричное и ассиметричное шифрование
Начнём с простой задачи: передать секретное сообщение по общедоступной сети.
Злоумышленник может прослушать канал связи, перехватить сообщение и даже поменять его. Такой тип атаки называется man in the middle
Что делать?
Самое простое — преобразовать сообщение, чтобы при перехвате злоумышленник ничего не понял. Например, сдвинуть каждую букву на 1:
Пирожок → Рйспзпл
Получатель выполнит обратную операцию и расшифрует сообщение.
Но для стандартных алгоритмов то же самое легко сделает и злоумышленник. Поэтому в преобразования вводится дополнительный параметр и формула становится сложнее. Например: символ → символ + k
Параметр (или ключ) вносит больше неопределённости в результат. Ключ может быть одним числом или состоять из нескольких чисел. Злоумышленнику нужно гораздо больше времени, чтобы взломать такой шифр.
Если для расшифровки используется тот же ключ, что и для шифрования, алгоритм называется симметричным.
Наиболее популярен алгоритм AES и его производные. Они, разумеется, более сложные, чем пример выше — сообщения делятся на блоки, блоки перемешиваются, внутри каждого блока выполняются десятки операций, и всё это проходит в несколько раундов.
На практике такой тип шифрования используется редко. Представьте, вы открыли сайт в браузере и хотите залогиниться. Чтобы безопасно передать пароль, вам с сервером нужен общий ключ. Но как получить его — непонятно.
Поэтому чаще применяется ассиметричное шифрование.
Создаётся пара ключей: один называется публичным, а другой — приватным.
Публичный ключ свободно распространяется и позволяет шифровать сообщения
Приватный ключ остаётся у получателя. И только он расшифрует полученное сообщение
Самый популярный ассимметричный алгоритм — RSA. Он основан на простых числах, вычислении степени и остатке от деления. Формулы несложные, а шифр получается вполне стойкий.
В последнее время в тренды выходит EdDSA. Он популярен тем, что активно используется в биткоине. Поддержка этого алгоритма появилась только в java 15.
Вообще алгоритмы шифрования используются не только для шифрования, но и входят в состав остальных инструментов безопасности. Но об этом позже