Как технически работает шифрование на основе пароля?

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

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

Примером может служить Mac OS X FileVault

Спасибо.


Если вы укажете пример кода, предпочтительно в C, Objective-C или псевдокоде.

Ответы

Ответ 1

Для (симметричного) шифрования вам нужен секретный ключ для шифрования и дешифрования.

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

Вот почему пароли для шифрования должны быть длинными и довольно случайными: в противном случае результирующий ключ будет поступать только из очень небольшого подмножества возможных ключей, и тогда их можно просто попробует, таким образом грубо заставляя шифрование.

Что касается примеров кода, существует несколько возможностей:

  • Посмотрите исходный код библиотеки crypto, например OpenSSL
  • посмотрите исходный код программы, которая реализует шифрование, например GnuPG
  • Google пример исходного кода для простого алгоритма шифрования или функции деривации ключа и попытайтесь понять его

Это зависит от того, что вы хотите узнать.

Ответ 2

Вам нужно будет искать другие ресурсы для глубокого объяснения, поскольку этот вопрос чрезвычайно широк.

Говоря в целом: вы используете пароль как "семя" для ключа шифрования, как указывал слеске. Затем вы используете этот ключ для применения двухстороннего алгоритма шифрования (т.е. Одного, который можно применить один раз для шифрования и снова для дешифрования). Когда вы применяете алгоритм к части данных, он становится зашифрованным таким образом, что вы никогда не сможете вернуть данные обратно без использования одного и того же ключа, и вы не можете практически создать один и тот же ключ, не имея того же пароля, что и семя.

Ответ 3

Если вы заинтересованы в криптографии, прочитайте "Прикладная криптография" Брюса Шнайера. Отличное чтение, множество примеров. Он проходит через различные типы криптографии.

Ответ 4

Простым способом, но не совсем безопасным, является поворот каждого байта на число, определенное паролем. Вы можете использовать хеш-код из строки или подсчитать количество символов или что-то еще для числа.

То, о чем вы, вероятно, думаете, является открытым ключом. Вот ссылка на документ, который расскажет вам математику, - вам придется самим разработать детали реализации, но это не так сложно, как только вы поймете математику. http://mathaware.org/mam/06/Kaliski.pdf

Ответ 6

Основным строительным блоком большинства блочных шифров является конструкция, называемая Feistel Network. Это разумно легко понять.

Потоковые шифры еще проще - они по сути являются генераторами псевдослучайных чисел, хотя и с некоторыми важными свойствами безопасности, где исходное внутреннее состояние происходит от ключа.

Ответ 7

Шифрование с паролем IS симметрично. Обычно ввод состоит из соли в дополнение к паролю. В FooBabel есть классное приложение, в котором вы можете поиграть с этим... в настоящее время они жестко кодируют соль для массива из восьми байтов (от нуля до семи) для простоты. Я поставил запрос, чтобы убедиться, что они позволяют пользователям вводить соль. Во всяком случае, здесь это - PBECrypto