режимы шифрования
Реализовываю в программе шифрование, и возникли некоторые вопросы, связанные с режимами.
ECB дает одинаковые выходные данные, при одинаковых входных.
CBC избавляет от появления на выходе одинаковых последовательностей данных, если одинаковые последовательности есть на входе. Но если два раза зашифровать одни и те же данные, то и выходные будут совпадать. Также если шифровать последовательности, у которых начало одинаковое, а отличия имеются где-нибудь в середине, то у зашифрованного текста начала тоже будут совпадать, а различаться они начнут с того места, где в входных данных появились отличия.
Я сделал следующим образом.
Входная последовательность дополняется "мусором" до выравнивания по размеру блока (64бита).
Генерируется 4-х байтный случайный ключ.
Этим ключом XORится ключ шифрования.
Входная последовательность разбивается на блоки по 64 бита, которые шифруются алгоритмом RC5. (Реализация RC5 взята из одной криптобиблиотеки).
К полученным зашифрованным данным в начало добавляется 4 байта сгенерированного ключа и 1 байт размера "мусора".
При дешифрации соответственно извлекается XOR-ключ, которым ксорится ключ шифрования, разбивается на блоки, дешифруется, из последнего блока удаляется "мусор", по размеру, указанному в начале.
В результате при шифровании одних и тех же данных зашифрованные получаются всегда разные (точнее, количество вариантов определяется размером XOR-ключа и в данном случае составляет 4294967295).
Хотелось бы узнать, что вы думаете об этой схеме.
Ничего, что XOR-ключ и размер "мусора" открыто лежат в выходных данных?
По каким критериям выбирать размер XOR-ключа?
Влияет ли как то на стойкость алгоритм его генерации, подойдет ли здесь стандартный Random?
Каким образом лучше получать "мусор", генерировать случайно, или можно вставлять один и тот же?
Извиняюсь, если немного путанно.. :?
комментариев: 11558 документов: 1036 редакций: 4118
В моем примере ГПСЧ инициализируется случайным вектором (Randomize), поэтому результаты всегда разные.
Обьясните, может я что-то не правильно понял?
комментариев: 11558 документов: 1036 редакций: 4118
CTR — это потоковый режим шифрования. Для получения гаммы Вы заданным ключом зашифровываете случайные данные (вместо rand лучше используйте что-нибудь более простое и уникальное, скажем, дату и время зашифрования: ВИ не должен повторяться, а обычный rand этого не гарантирует), конкатенированные с показателем счётчика. А затем XOR'ом накладываете гамму на открытый текст.
Расшифрование выполняется полностью идентично, не нужно даже писать дополнительных функций. Просто на вход функции вместо открытого текста подаётся шифртекст. Значение случайных данных берётся из самого сообщения (оно должно передаваться открыто).
комментариев: 9796 документов: 488 редакций: 5664
Это относится только к CBC с фиксированным вектором инициализации. Если IV использовать каждый раз случайный, то никакого повторения шифртекстов не получится.
Т.е. в т.н. режиме CBC$ генеририруется IV<-$, где "$" обозначает случайность.
Также нужно поступать и в режиме счётчика.
Иногда используется шифрование вектора инициализации, но по современным представлениям шифрование всегда должно использоваться совместно с аутентификацией, поэтому IV передаётся в открытом виде и в режиме счётчика и в режиме CBC.
В последнее время предпочтение отдаётся режиму счётчика, как наиболее простому и формально проанализированному.
Можно сделать проще: дойти до последнего полностью заполненного блока, кратного 64, зашифровать его ключём шифрования ещё один раз и использовать нужное количество этих бит для XOR с открытым текстом последнего неполного блока, ненужные биты отбросить. Вам не понадобятся ни мусор для заполнения, ни дополнительный байт для указания его размера.
Или использовать более стандартную схему заполнения последнего блока "ciphertext stealing":
Просто никогда не используйте стандартный random в криптографических приложениях (если это только не вызов юниксового устройства /dev/{u}random ). Причин может быть миллион. Лучше просто знать, что так делать не надо.
4294967295=2^32, но в результате "парадокса дней рождения" у Вас возможна утечка информации уже после шифрования 2^(32/2)=2^16=65536, т.е. всего 64 килобайта данных или 65535 попыток ???
Я попытался формализовать Вашу схему, только не могу понять почему размер "XOR ключа" 32 бита вместо 64:
У меня нет возможности провести конкретный анализ, но схема нестандартная и может содержать уязвимости.
Например при атаках с подобранным или известным открытым текстом мы в первом блоке всегда сможем получать на выходе зависимость одного и того же ( или подобранных) открытых текстов, соотвествующих им шифртекстов, но зашифрованных на разных ключах и ещё будем знать значение XOR разности этой зависимости. Т.е. будем контролировать вход шифра. Достаточно ли этого для проведения атаки?
Если шифр стойкий, то нет, но в стандартном CBC такой возможности не предоставляется.
Однако в последнее время опубликовано больше работ, где режим CBC прогоняется через модели "случайных оракулов", игровые модели и т.д. Если кто-то хорошо владеет этими техниками анализа возможно он скажет больше насчёт достоинств и недостатков Вашей схемы.
Могу лишь посоветовать придерживаться стандартных схем CBC$ со стойким генератором IV, равным размеру блока или схемы CTR.
Счетчик здесь, я понимаю, нужен для того, чтобы одинаковые блоки входного текста имели разные блоки шифртекста, а случайные данные – для того, чтобы одинаковые сообщения имели разный шифртекст.
Т.е. схема такая
Тогда какая должна быть разрядность у счетчика и ГПСЧ?
Может логичнее инициализировать счетчик сгенерированными случайными данными, которые потом добавляются к шифртексту?
В этом случае вектор инициализации необходимо также в открытом виде добавлять к шифртексту.
Если в схеме CTR не использовать счетчик, или в схеме CFB не использовать связывание блоков, то получится т.н. "потоковый режим гаммирования", который обеспечивает разные шифртексты, но не обеспечивает различие зашифрованных одинаковых блоков в пределах одного сообщения (с одной сгенерированной гаммой). Т.е. это получается разновидность режима счетчика? Или разновидность CFB? Или я уже совсем запутался?
Отличная мысль, но как быть, если размер входного сообщения меньше размера блока?
Вобщем, я думаю тогда сделать, как на схеме, режим CTR. Тогда и отпадает проблема последнего неполного блока, т.к. режим поточный.
Ну здесь не совсем утечка, в любом случае не хуже ECB. Ведь к исходному тексту доступа нет, а изменение шифртекста нужно для дополнительного внесения неопределенности. Откуда врагу знать, что в определенных местах совпали исходные сообщения и "XOR-ключ"?
А какой тогда использовать? Если генерировать на основе времени / каких-то других внешних факторов, то резко замедляется быстродействие.
Нашел вот такой вариант:
Random Number Generator with variable Period
from 2^32 -1 to 2^2032 -1, Standard is 2^128 -1
with . Seed('', -1) absolutly random
Что Вы думаете насчет этого?
комментариев: 9796 документов: 488 редакций: 5664
Именно в открытом виде эти данные и надо добавить к шифртексту.
Возьмите информацию хотя бы здесь:
http://en.wikipedia.org/wiki/B.....r_modes_of_operation,
http://en.wikipedia.org/wiki/Residual_block_termination
только проверьте по ссылкам, что её никто не испортил.
комментариев: 9796 документов: 488 редакций: 5664
Система считается стойкой, если через неё враг может по своему усмотрению прогонять подобранные исходные и шифртексты в любом направлении, подбирать пары блоков, ключи и проделывать самые замысловатые теоретические упражнения.
Если она выстоит против этого, тога можно думать, что она чего-то стоит и на практике.
Это классика криптографии (60-е годы прошлого века, возможно более ранне изобретение, сейчас их редко используют по причине нестойкости).
Вообще всё уже изобретено, если нужна теория – читайте работы Bellar & Rogaway и их предшественников, если практика, то есть готовые стандарты. Для начала общепринятые, затем можете сравнить их с отечественными.
комментариев: 9796 документов: 488 редакций: 5664
http://csrc.nist.gov/publicati.....00-38a/sp800-38a.pdf,
хотя некоторая путаница может быть и в них и в российских стандартах.
Например, в российском стандарте мне кажется странным рекоммендация использовать комбинацию двух регистров сдвига (есть ли для этого теоретическое обоснование, открытые исследования, конкурсы проектов, рабочие группы или это просто одно ведомство постановило?), а в американские рекоммендации не включены многие полезные возможности.
"Volumes created by this version of TrueCrypt can be encrypted only in LRW mode. CBC mode has been deprecated (however, volumes encrypted in CBC mode can still be mounted by the current version of TrueCrypt). LRW mode is more secure than CBC mode and is suitable for disk encryption. LRW mode is to become an IEEE standard for sector-based storage encryption (P1619)"
http://www.truecrypt.org/docs/? S=modes-of-operation
комментариев: 9796 документов: 488 редакций: 5664
На основе http://clemens.endorphin.org/LinuxHDEncSettings и др. источников.
комментариев: 9796 документов: 488 редакций: 5664
1) Для шифрования дисков, контейнеров со встроенной файловой системой, а не отдельных файлов и связанных с этим особенностями возможных атак.
2) Для объединения в одном режиме и шифрования и аутентификации.
комментариев: 9796 документов: 488 редакций: 5664
комментариев: 5 документов: 0 редакций: 0
// The "Mother-of-all Pseudo Random Number Generators"
// Invented by Dr. George Marsaglia, Florida St. Univ., Dept. of Statistics
// Assembly implementation by Agner Fog
// Delphi BASM conversion, v1.0, ©1999, EFD Systems
// Excellent statistical properties and extremely long
// cycle length (approx. 3*10^47)
В принципе, он используется в качестве счетчика, поэтому я не думаю, что его стойкость имеет значение. Вот для генерации его начального значения используется Windows API coCreateGuid. Теоретически, она должна генерировать неповторяющиеся значения.
http://sector18.narod.ru/rc5.rar
Почему-то это напоминает потоковый шифр, где в качестве ГПСЧ, инициализируемого ключем, используется шифр RC5.
Хочу еще сделать режим CBC со случайным вектором инициализации.
Буду рад услышать полезные замечания и конструктивную критику :)
комментариев: 11558 документов: 1036 редакций: 4118
Кстати, celeron, Вы ведь кажется были зарегистрированы в старом форуме. Зачем регистрировались снова?