Хочу поделиться идеей самодельного симметричного шифра. Алгоритм простой, довольно быстрый, ему не требуется лишняя память для всяких таблиц. Но есть сомнения в его стойкости. Сам я оценить качество шифра не могу, поскольку в криптологии я дилетант. Может, знатоки помогут? Алгоритм такой: Сообщение разбивается на блоки по B бит. Каждый блок xor-ится с B сгенерированными псевдослучайными битами. Генератор использует ключ длиной L бит. На каждом шаге ключ суммируется с константой C. Затем результат циклически сдвигается влево на n бит, где n состоит из S младших бит ключа (после суммирования). В качестве псевдослучайных используются B старших бит полученного ключа. Или: Key := Key + C n := Key and (1 shl S - 1) Key := Key rol n Message := Message xor (Key shr (L - B)) Для избавления от слабых ключей перед шифрованием используются W холостых циклов. Я использую параметры B = 8, L = 128, C = 1, S = 7, W = 256. В аттаче - пример реализации (встроенный ассемблер в Delphi). Есть смутное подозрение, что по открытому тексту небольшой длины можно полностью восстановить ключ. Не знаю только, как осуществить это на практике - перебор с отбрасыванием заведомо неверных ключей тут явно не подойдет, а другого способа я придумать не могу. Каким образом можно взломать такой шифр? И как его можно усилить? P. S. И не изобрел ли я велосипед?
Не имея звания кандидата математических наук (это минимум) даже не стоит пытаться изобрести криптостойкий шифр. Да и зачем изобретать, раз имеется столько провереных временем шифров? Имхо там где нужна криптостойкость лучше не изобретать велосипед, а взять одну из реализаций AES, Blowfish или IDEA. А нестойкость этого шифра видна сразу. Слабость этого шифра в том, что байт с которым ксориться текст однозначно определен позицией этого байта в сообщении. Тоесть для каждого байта в последовательности, имея открытый текст можно вычислать значение (Key shr (L - B)), а так как номер байта известен, и известны L B и C, то ключ вычислить будет просто элементарно. Конечно сначала надо знать число n которое вычисляется из ключа, но оно может быть только в диапазоне от 0 до 31 (любые другие числа заменяются числом из этого диапазона), естественно это нетрудно перебрать. А усилять ничего не стоит, лучше возьми готовый шифр.
Ms Rem Не имея звания кандидата математических наук (это минимум) даже не стоит пытаться изобрести криптостойкий шифр. В дополнение. Вот здесь http://old.computerra.ru/news/2000/10/3/1553/ живет интересная статья про международный конкурс на новый стандарт шифрования США, который завершился несколько лет назад. Обращаю внимание: изобретали эти шифры далеко не в одиночку, далеко не дети в математике и далеко не за один день. Тем не менее, часть этих шифров была опровергнута и скомпроментирована другими авторами буквально на лету, во время конференции, на которой все они хвалились друг перед другом. взять одну из реализаций AES, Blowfish или IDEA. В уточнение. Это все блочные шифры, а ava специально отметил, что его интересуют потоковые. Поэтому лучше предложить ему что-нибудь вроде RC4 или WAKE. В развитие темы. Впрочем, судя по фразе "ему не требуется лишняя память для всяких таблиц" (с) ava, он знаком по крайней мере с одним из них, т.к. идея подобных шифров - выборка случайной гаммы из таблиц по случайному индексу, и она его не вдохновила. В этом случае можно порекомендовать ему посмотреть в сторону менее ресурсоемких датчиков псевдослучайных чисел, например, Фибоначчиевых. (Линейные конгруэнтные в криптографии не катят, т.к. у них разные группы битов по разному случайны. Хотя, например, в некоторых нематематических книжках они для этой цели допускаются). Выбрав такой датчик, придется самостоятельно доказывать, что 1) он дает равномерное распределение значений для любых затравок и параметров; 2) он дает равномерное распределение битов для любых затроавок и параметров; 3) количество всевозможных затравок и параметров настолько велико, что их всех невозможно перебрать; 4) для любых затравки и параметров по двум последовательным значениям невозможно вычислить эти затравку и параметры. Мое имхо (кандидата не совсем математических наук ), что все эти возможности криптографами-математиками давным-давно изучены и отвергнуты, не случайно же все они, как один и в RC4, и в WAKE, и в SEAL, юзают именно табличный способ генерации случайной гаммы.
Сорри, обознатушки. Вот здесь byrd.narod.ru/aes/aes1.htm гораздо более интереная статья того же автора про конкурс шифров.
лучше не изобретать велосипед, а взять одну из реализаций AES, Blowfish или IDEA Непременно. Если мне понадобится стойкий шифр, я тупо возьму первую попавшуюся реализацию какого-нибуть известного шифра, тупо переделаю ее под свои нужды и буду тупо надеяться, что ни я, ни автор не наделали в коде опечаток, что автор кода понимал, что он пишет, и не понаделал дыр, что сам алгоритм достаточно хорошо проверен академиками. Но сейчас мне интересно как можно взломать данный шифр (с данными константами). Пусть, например, известна последовательность сгенерированных байтов: 52 7B 78 29 87 A4 C4 3B E4 B9 D8 11 44 B0 73 65 Может ли кто-нибудь "на пальцах" разъяснить, какую именно информацию о ключе можно выудить, и как именно это можно сделать?
стандартный (например Дельфийный) датчик псевдослучайных чисел и то более стойким будет В предложенном алгоритме практически все линейно. Следовательно ключ при известном открытом и шифрованном тексте (известно должно быть текста такой длины, как длина ключа) вычисляется решением системы линейных уравнений, даже без перебора. А в наше время не нужно быть кандидатом криптографических наук, чтобы изобретать шифры - уже много книг выпущенно с достаточно объемными рекомендациями и примерами. Совсем другой вопрос, зачем их изобретать?
ava Код, который в твоем аттаче - он более сильный чем ты описал в топике. Возможжно, поэтому такая реакция Сорри. Итак, я не кандидат. Имхо шифр что-то может, совсем в лоб его взломать не удастся. Однако (я не анализировал детально, на это нужно несколько дней) ощущение, что он не очень сильный. Основная причина - слабое перемешивание и взаимное влияние битов "ключа" (128 бит в регистрах ebp-esi-edi-edx). Перестановка 3-2-1-0 не очень, вращение нормально, но вот команда add Key,1 - явно слабая, какая вероятность что произойдет перенос ? Только если младшие 32 бита ключа равны 0xFFFFFFFF. Почему не использовать другую константу или вообще 4 подряд добавления ? По предварительной моей оценке он тянет на 0,2-0,5 от хардварных алгоритмов ключей защиты (секретных функций). Оценка ОЧЕНЬ приблизительная, поэтому чур без обид.
2 Chingachguk: Код, который в твоем аттаче - он более сильный чем ты описал в топике Странно... Если бы ты сказал, что реализация ослабила алгоритм, я бы не удивился. А так... Небывалый случай, прямо... Перечитываю первый пост - вроде бы, все правильно описал. Перечитываю исходник - вроде бы, полное соответствие описанию. Перестановка 3-2-1-0 не очень, вращение нормально Э-э-э... Перестановка - это как раз часть вращения. но вот команда add Key,1 - явно слабая Согласен. Лучше использовать другую константу (возможно, 128-битную). Вот только какую константу выбрать - вопрос. какая вероятность что произойдет перенос ? Только если младшие 32 бита ключа равны 0xFFFFFFFF Перенос произойдет с вероятностью около 0.5. Правда, это будет перенос в соседний бит, а не двойное слово - но ведь и сдвиги побитовые P. S. Может, для анализа больше подойдет более простой вариант - B = 1, L = 32, S = 5 ? P. P. S. Насчет реакции. Я совершенно спокоен. Просто у меня нет никаких идей о том, как можно взломать такой шифр - я ничего не смыслю в криптоанализе, модулярной арифметике и многих других областях математики.
Перечитываю исходник - вроде бы, полное соответствие описанию. Покажи, где у тебя написаны перестановки 3-2-1-0
Покажи, где у тебя написаны перестановки 3-2-1-0 ??? Цифрами 0 - 3 я обозначил, где какие части итогового ключа находятся, чтобы не запутаться. 0 означает младшее двойное слово, 3 - старшее. Запись 3210 означает, что все части ключа находятся на своих местах (EBP:ESI:EDI:EDX), и перестановка не требуется.
Счетчик сдвига ключа - семибитный (а не пятибитный). Младшие пять бит используются для обычных сдвигов (на 0 - 31 бит), старшие два бита - для перестановки регистров, что заменяет сдвиги на 0, 32, 64 или 96 бит.
Я, наверное, торможу - но вот в твоем первом сообщении я этих слов не нахожу: Алгоритм такой: Сообщение разбивается на блоки по B бит. Каждый блок xor-ится с B сгенерированными псевдослучайными битами. Генератор использует ключ длиной L бит. На каждом шаге ключ суммируется с константой C. Затем результат циклически сдвигается влево на n бит, где n состоит из S младших бит ключа (после суммирования). В качестве псевдослучайных используются B старших бит полученного ключа. Или: Key := Key + C n := Key and (1 shl S - 1) Key := Key rol n Message := Message xor (Key shr (L - B)) Для избавления от слабых ключей перед шифрованием используются W холостых циклов. Я использую параметры B = 8, L = 128, C = 1, S = 7, W = 256. В аттаче - пример реализации (встроенный ассемблер в Delphi).
Chingachguk, подумай сам, как можно циклически сдвинуть 128-битное число на любое количество бит, используя 32-битные операции.
Шифр не стоек к known plaintext атакам. Зная L/B последовательных пар (plaintext, ciphertext) можно вычислить ключ.
RElf, мог бы просто сказать: "взломать можно - зуб даю". Объем мессаги был бы меньше, а количество информации - то же. Похоже, я обратился не по адресу. Тема закрыта.