[Из песочницы] Основы криптографии. Часть 0
Целью данного цикла статей я хотел бы поставить создание простейшего криптозащищенного мессенджера с упором исключительно на криптографию, исключая из рассмотрения технические тонкости непосредственно коммуникаций, сетевых протоколов, графики и всего остального.
Шаг за шагом обходя уязвимости, которые будет иметь наш разрабатываемый с нуля протокол, в конце мы получим собранную своими руками криптографическую систему, противостоящую подавлящему количеству вариаций атак.
Большинство людей, незнакомых с криптографией, думая о шифровании, представляют себе некий сейф, в который кладется исходная информация в чистом виде, и для того, чтобы получить пользователь получил ее назад, необходимо предъявить системе комбинацию, отпирающую замок сейфа и достать информацию из абстрактного ящика.
Однако с подобным подходом возникает ряд проблем:
- Сейф можно вскрыть болгаркой или иным силовым методом
- Производитель сейфов может оставить обходную лазейку и получить доступ к содержимому
Прежде всего, шифрование разрабатывалось для сокрытия информации в военной сфере, а для нее аналог сейфа неприемлем. Во время военных действий не действуют законы и правила, поэтому получивший доступ к сейфу не будет пытаться подобрать код для замка — он либо воспользуется вскрытием замка силовым способом, либо обратится к производителю сейфов для обхода защиты.
Поэтому перед криптографией стоит вопрос, как сохранить неприкосновенность информации даже при условии попадания «сейфа» в руки противника.
Необходимое условие для подобного — изменение самой структуры информации таким образом, что ее восстановление было возможно только при применении некого ключа, размер которого гораздо меньше исходного набора данных
Примерно в таком виде оставляет вашу информацию шифрование, с тем лишь отличием, что она остается восстановимой при условии, если известен ключ
Восстановить информацию возможно лишь с помощью того же ключа, который должен знать принимающий информацию на другой стороне
Подобное информационное месиво можно передавать по открытым каналам связи, оно не предстваляет никакой ценности ни для кого, кроме людей, знающих пароль.
Подобное шифрование называется симметричным, поскольку для шифрования информации оно использует точно такой же шифр, как и для дешифрования.
Забегая вперед, можно сказать, что подобный метод шифрования не лишен недостатков, поэтому были изобретены ассимметричные методы шифрования, но о них мы поговорим позже.
При симметричном шифровании используется следующий протокол передачи информации:
- Предположим, что симметричный ключ: password
- Алиса шифрует сообщение и получает шифрованный набор битов в виде, очень похожем на информационный мусор и передает его по открытому каналу связи
- Ева, подслушав зашифрованное сообщение, не может придумать ничего лучше, как начать перебирать пароль, с целью получить исходное сообщение, поскольку, при идеальном или близком к идеальному симметричном алгоритме, подбор пароля — самый приемлимый способ получения допуска к информации.
Учитывая, что длинна пароля у нас — 12 символов, а каждый символ — 8 битов, полный перебор займет у алисы (2^8)^(12), или 2^96 операций. Подобный перебор займет у злоумышленника несколько веков и вряд ли зашифрованная информация к этому времени сохранит актуальность.
Алиса на своем компьютере имеет простейшую программу
public class User
{
private String password = "qdghjfTTfbfs4852";
// SymmEncrypor - класс, отвечающий за симметричное шифрование
private SymmEncryptor SE = new SymmEncryptor();
// Метод для зашифровки сообщений
private String encryptMessage(String message)
{
String encMessage = SE.encrypt(message, password);
System.out.print("Зашифрованное сообщение: " + encMessage);
return encMessage;
}
// Метод для расшифровки сообщений
private String decryptMessage(String EncryptedMessage)
{
String encMessage = SE.decrypt(EncryptedMessage, password);
System.out.print("Исходное сообщение: " + decMessage);
return decMessage;
}
public static void main(String[] args)
{
String message = encryptMessage("Hello, Bob!");
}
}
Алиса получила зашифрованную строчку и передает ее Бобу через телефонную линию, которая круглосуточно прослушивается Евой. Перехватив зашифрованное сообщение, Евой, не сможет ничего с ним сделать, но Боб, в свою очередь, получив сообщение, в такой же программе применит пароль ddghjfTTfbfs4852, который он знает заранее, и сможет расшифровать сообщение.
Программа, установленная у Боба:
public class User
{
private String password = "qdghjfTTfbfs4852";
private SymmEncryptor SE = new SymmEncryptor();
private String encryptMessage(String message)
{
SymmEncryptor SE = new SymmEncryptor();
String encMessage = SE.encrypt(message, password);
System.out.print("Зашифрованное сообщение: " + encMessage);
return encMessage;
}
private String decryptMessage(String message)
{
String encMessage = SE.decrypt(message, password);
System.out.print("Исходное сообщение: " + decMessage);
return decMessage;
}
public static void main(String[] args)
{
// сообщение, полученное Бобом через небезопасный прослушиваемый канал связи
String message = "FJekjfisdf7f33fFFDf788dsfvUHVUDIUSiusdyf&D&F^8"
// Боб дешифрует сообщение, полученное от Алисы, с помощью пароля qdghjfTTfbfs4852
String DecryptedMessage = decryptMessage(message);
* Вывод : Исходное сообщение: Hello, Bob!
}
}
Метод SymmEncryptor пока остается для нас черным ящиком, мы не знаем, как он работает, а лишь полагаемся на его надежность
Общепризнанные алгоритмы шифрования уже ни один десяток лет проверяются на прочность криптографическим сообществом всего мира, и если за этот срок не продоставлено доказательств его компроментации, то можно с уверенностью предположить, что алгоритм надежен, самостоятельно проверить старые алгоритмы шифрования, не будучи специалистом-криптографом, достаточно сложно
Вы по умолчанию не должны доверять новым алгоритмам шифрования, пока они не прошли достаточную проверку на прочность. И тем более, не пытаться создать свой собственнй, наивно полагая, что вам удасться учесть все нюансы, которые может приметить потенциальный взломщик.
В следующий раз мы разберем черный ящик класса SymmEncryptor и напишем простейший механизм шифрования, чтобы разобраться на личном примере — что это и как это работает