Как технически работает шифрование на основе пароля?
Скажем, у меня есть данные и пароль, и я хочу зашифровать данные таким образом, чтобы их можно было восстановить только с помощью правильного пароля.
Как это технически работает (т.е. как это реализовать)? Я часто слышу, как люди используют битбифтинг для шифрования, но как вы основываете это на пароле? Как работает шифрование на основе паролей?
Примером может служить Mac OS X FileVault
Спасибо.
Если вы укажете пример кода, предпочтительно в C, Objective-C или псевдокоде.
Ответы
Ответ 1
Для (симметричного) шифрования вам нужен секретный ключ для шифрования и дешифрования.
Обычно в качестве источника этого ключа используется пароль, который вы поставляете. По различным причинам безопасности пароль не является (и часто не может, из-за требований используемого шифра), непосредственно используемого в качестве ключа. Вместо этого для генерации ключа из пароля используется функция деривации ключей.
Вот почему пароли для шифрования должны быть длинными и довольно случайными: в противном случае результирующий ключ будет поступать только из очень небольшого подмножества возможных ключей, и тогда их можно просто попробует, таким образом грубо заставляя шифрование.
Что касается примеров кода, существует несколько возможностей:
- Посмотрите исходный код библиотеки crypto, например OpenSSL
- посмотрите исходный код программы, которая реализует шифрование, например GnuPG
- Google пример исходного кода для простого алгоритма шифрования или функции деривации ключа и попытайтесь понять его
Это зависит от того, что вы хотите узнать.
Ответ 2
Вам нужно будет искать другие ресурсы для глубокого объяснения, поскольку этот вопрос чрезвычайно широк.
Говоря в целом: вы используете пароль как "семя" для ключа шифрования, как указывал слеске. Затем вы используете этот ключ для применения двухстороннего алгоритма шифрования (т.е. Одного, который можно применить один раз для шифрования и снова для дешифрования). Когда вы применяете алгоритм к части данных, он становится зашифрованным таким образом, что вы никогда не сможете вернуть данные обратно без использования одного и того же ключа, и вы не можете практически создать один и тот же ключ, не имея того же пароля, что и семя.
Ответ 3
Если вы заинтересованы в криптографии, прочитайте "Прикладная криптография" Брюса Шнайера. Отличное чтение, множество примеров. Он проходит через различные типы криптографии.
Ответ 4
Простым способом, но не совсем безопасным, является поворот каждого байта на число, определенное паролем. Вы можете использовать хеш-код из строки или подсчитать количество символов или что-то еще для числа.
То, о чем вы, вероятно, думаете, является открытым ключом. Вот ссылка на документ, который расскажет вам математику, - вам придется самим разработать детали реализации, но это не так сложно, как только вы поймете математику.
http://mathaware.org/mam/06/Kaliski.pdf
Ответ 5
Посмотрите на BlowFish: http://en.wikipedia.org/wiki/Blowfish_%28cipher%29
Ответ 6
Основным строительным блоком большинства блочных шифров является конструкция, называемая Feistel Network. Это разумно легко понять.
Потоковые шифры еще проще - они по сути являются генераторами псевдослучайных чисел, хотя и с некоторыми важными свойствами безопасности, где исходное внутреннее состояние происходит от ключа.
Ответ 7
Шифрование с паролем IS симметрично. Обычно ввод состоит из соли в дополнение к паролю. В FooBabel есть классное приложение, в котором вы можете поиграть с этим... в настоящее время они жестко кодируют соль для массива из восьми байтов (от нуля до семи) для простоты. Я поставил запрос, чтобы убедиться, что они позволяют пользователям вводить соль. Во всяком случае, здесь это - PBECrypto