dYhG9pQ1qyJfIxfs2guVoU7jr9oniR2GF8MbC9mi
Шифрование текста
Ака перемешивает, чтобы попытаться сделать его неразборчивым. Это игра, в которую вы играете в криптографии. Для этого вы используете детерминированные функции.
Шифрование включает использование функции, которая принимает два параметра: обычно короткий, фиксированной длины и произвольной длины. Он производит вывод того же размера, что и второй параметр.
Первый параметр мы называем ключом; второй - открытый текст; и вывод, зашифрованный текст.
Это будет иметь обратную функцию (которая иногда является той же самой), которая имеет ту же сигнатуру, но вместо этого зашифрованный текст вернет открытый текст (при использовании того же ключа).
Очевидно, что свойство хорошей функции шифрования состоит в том, что открытый текст не может быть легко определен из зашифрованного текста без знания ключа. Еще лучше будет создавать зашифрованный текст, который неотличим от случайного шума.
Хеширование включает функцию, которая принимает один параметр произвольного размера и возвращает вывод фиксированного размера. Здесь цель состоит в том, чтобы при конкретном выводе было трудно найти любой ввод, который его произведет. Это односторонняя функция, поэтому она не имеет обратного. Опять же, это здорово, если результат выглядит совершенно случайным.
Проблема с детерминизмом
Все вышеперечисленное очень хорошо, но у нас есть проблема с нашими конечными целями неразборчивости при разработке реализаций этих функций: они детерминированы! Это бесполезно для получения случайного вывода.
Хотя мы можем разрабатывать функции, которые по-прежнему выдают очень случайный результат, благодаря путанице и диффузии , они все равно будут давать тот же результат при одинаковом входе. Нам обоим это нужно, и нам это не нравится. Мы никогда не сможем ничего расшифровать с помощью недетерминированной криптосистемы, но нам не нравятся повторяющиеся результаты! Повторяемое означает анализируемое ... определяемое (да). Мы не хотим, чтобы противник видел те же два зашифрованных текста и знал, что они поступили с одного и того же входа, который будет давать им информацию (и полезные методы взлома криптосистем, таких как радужные таблицы ). Как мы решаем эту проблему?
Ввод: некоторые случайные элементы вставляются в начало.
Вот так мы победили! Мы добавляем (или иногда лучше) добавляем некоторый уникальный случайный ввод к нашему фактическому вводу каждый раз, когда мы используем наши функции. Это заставляет наши детерминированные функции давать различный вывод, даже когда мы даем одинаковый ввод. Мы отправляем уникальный случайный ввод (при хешировании, называемый солем; при шифровании, называемый вектором инициализации или IV) вместе с зашифрованным текстом. Не важно, видит ли враг этот случайный ввод; наш реальный ввод уже защищен нашим ключом (или односторонним хешем). Все, что нас на самом деле беспокоило, это то, что наша продукция все время различна, так что ее нельзя анализировать; и мы добились этого.
Как мне применить это знание?
OK. Таким образом, у каждого есть свое приложение, а внутри него - криптосистема, защищающая части приложения.
Теперь мы не хотим изобретать велосипед с помощью криптосистем (Worst. Idea. Ever.), Поэтому некоторые действительно знающие люди уже придумали хорошие компоненты, которые могут построить любую систему (например, AES, RSA, SHA2 , HMAC, PBKDF2). Но если все используют одни и те же компоненты, то это все равно вводит некоторую повторяемость! К счастью, если каждый использует разные ключи и уникальные начальные случайные входы в своих собственных криптосистемах, с ними все должно быть в порядке.
Хватит уже! Поговорим о реализации!
Давайте поговорим о вашем примере. Вы хотите сделать простое шифрование. Что мы хотим для этого? Ну, а) нам нужен хороший случайный ключ, и б) нам нужен хороший случайный IV. Это сделает наш зашифрованный текст максимально безопасным. Я вижу, что вы не предоставили случайную капельницу - лучше это сделать. Получите несколько байтов из случайного источника [secure / crypto] и добавьте его. Вы сохраняете / отправляете эти байты вместе с зашифрованным текстом. Да, это означает, что зашифрованный текст имеет постоянную длину, большую, чем открытый текст, но это небольшая цена.
А как насчет этого ключа? Иногда нам нужен запоминающийся ключ (например, пароль), а не хороший случайный ключ, который нравится компьютерам (если у вас есть возможность просто использовать случайный ключ - сделайте это вместо этого). Можем ли мы получить компромисс? Да! Должны ли мы преобразовывать пароли символов ASCII в байты для создания ключа? АД НЕТ!
Символы ASCII совсем не случайны (черт, они обычно используют только 6-7 бит из 8). Во всяком случае, то, что мы хотим сделать, это сделать наш ключ по крайней мере выглядеть случайным. как нам это сделать? Ну, хэширование хорошо для этого. Что если мы хотим повторно использовать наш ключ? Мы получим тот же хеш ... повторяемость снова!
К счастью, мы используем другую форму уникального случайного ввода - соль. Сделайте уникальную случайную соль и добавьте ее к своему ключу. Тогда хэш это. Затем используйте байты для шифрования ваших данных. Добавьте соль И IV вместе с вашим зашифрованным текстом, когда вы отправите его, и вы сможете расшифровать на конце.
Почти готово? НЕТ! Вы видите решение для хеширования, которое я описал в параграфе выше? Реальные криптографы назвали бы это любительским . Доверяете ли вы системе, которая является дилетантской? Нет! Собираюсь ли я обсуждать, почему это любительское? Нет, потому что тебе не нужно знать. По сути, он просто НЕ ДЕЙСТВИТЕЛЬНО СУПЕР-ЗАХВАТЕН на их вкус.
Что вам нужно знать, так это то, что они уже разработали лучшую систему для этой самой проблемы. Это называется PBKDF2 . Найдите его реализацию и [научитесь] использовать его вместо этого.
Теперь все ваши данные в безопасности.