Ок, давайте свои пары шифрованных/не шифрованных файлов, точнее как:
Вы выберете ключ (любой набор матриц), этим ключем зашифруйте один файл в пару сотен кб, и пришлите мне и оригинал и шифрованный файл, потом зашифруйте второй файл и пришлите мне только шифрованный.
Моя задача будет — восстановить второй файл, не зная исходного ключа.
Вы предоставили код 1 раунда шифрования. Какая связь между ним, и тем, что собственно будет в файлах — совершенно не ясно, т.к. не ясно, как именно вы будете реализовывать много-раундовость, какой режим шифрования (CBC, ECB, CTR) используете (если используете), как храните IV и какие заголовки у файла.
На все эти вопросы — нужны точные ответы, с точностью до бита.
Так что — я обозначил условия, на которых я согласен взяться за анализ: либо полные исходники (они все равно не представляют никакой коммерческой ценности, поверьте), либо детальная техническая спецификация форматов и алгоритмов.
1, 2 — вы не предоставили технических данных, как непосредственно кодируется все, и какими блоками вы оперируете.
Вообще, если вы предоставите сам код, кодирующий / декодирующий, набор файлов (оригинал + шифрованное), то я берусь попробовать восстановить ключи (которых вы мне не сообщите).
Если исходники предоставить не можете — нужна грамотная техническая, подробная, спецификация, на все форматы. Того, что вы описали — недостаточно.
Конечно, в общем случае — можно все проанализировать и без подобных деталей, но сейчас задача стоит сломать шифрование, а не угодать формат файла.
P.S. только заниматься я этим буду после 24-ого числа, — 24 числа у меня супруга и дочка уезжают на каникулы на историческую родину, и я буду предоставлен сам себе на полтора месяца, так что по 1-2 часа в день — могу уделять. До 24-ого — вряд-ли смогу даже глянуть.
1) — это зависит от размера блока, которым вы оперировали. Если вы берете по три 8-ми битных числа и кодируете в три 8-ми битных числа — то следовательно размер блока у вас 24 бита. Точнее ответить не смогу, не заглядывая в вашу реализацию непосредственно.
2) Не понял вопроса, не могу ответить без более точных технических данных о том, как на битовом уровне, вы кодируете / декодируете.
3) Вы еще в float храните? :) Вообще ответ такой-же как в 2), но в целом — преобразование во float — может ввести немного нелинейности, если не знать что это float, но если знать — то можно сконвертировать в fix point например, и дальше — как обычно.
4) Вы немного меняете задачу. Я вам говорил о наличии у вас пар открытый / шифрованный текст, по которым можно восстановить ключь. Что значит «не с самого начала» я не понимаю, т.к. не понимаю, что вы тут хотите сделать с этими «данными зашифрованными не самого начала».
5) У вас одна матрица — бинарная NxN, а что у алгоритма внутри — не имеет значения. Хоть 100000 матриц.
Я честно говоря не понял, что вам не понятно. Я вроде все и так описал достаточно подробно. Вот более детально, если что: dl.dropboxusercontent.com/u/25074445/MasterMatrix.pdf — из-за формул вынес в отдельную pdf-ку.
Посмотрите например: en.m.wikipedia.org/wiki/Hill_cipher — особенно раздел Security, там подробно все написано, алгоритм практически 1-в-1 такой же, что и у вас
Делается очень просто, N пар «вход-выход», записывается N уравнений с ячейками матрицы в качестве неизвестных, и линейно решается по модулю 2.
Мастер матрицу — почему же нельзя, все можно, арифметика на кольце mod 256 — практически такая-же. Деление только отличается (кстати имнно по этому у меня сомнения, что вы сможете расшифровать шифрованное обратно, если вы храните числа по модулю 256 :-) )
mod 256 умножение ничем не хуже обычного умножения, в плане криптоанализа.
Я скажу даже больше, атакующему вообще не важно знать, как у вас устроен алгоритм внутри, достаточно знать что между входом и выходом — есть линейная зависимость.
Данная задача может быть решена так сказать в «в общем случае», для вектора N бит и искомой битовой матрицы N*N. Только тут уже потребуется N пар, и умножения все будут по модулю 2.
> 1) Никто не заставляет вас шифровать все данные N разными матрицами последовательно, для того чтобы злоумышленник выявлял «мастер матрицу», вы так же можете разделить все данные на Х частей и каждую часть шифровать своей матрицей
Я вас не очень понял, вы предлагаете менять ключ шифрования раз в несколько блоков? Современные алгоритмы обычно без проблем могут шифровать порядка 2^32 блоков, минимум, в зависимости от режима, без смены ключа и нарушения безопасности.
> 2) При KPCA, т.е. то что вы описали как «А дальше начинается проблема:» решить систему «линейных уравнений» будет не совсем просто хотя бы потому, что при создании матрицы используется 4 неизвестных, а зашифрованные вектора состоят из трех элементов, таким образом мы получим три уравнения с четырьмя неизвестными.
Ну тогда достаточно будет иметь две пары шифрованных/нешифрованных сообщений и у злоумышленника будет 4 неизвестных и 6 уравнений.
Уважаемый, не пытайтесь изобретать криптографию, не имея хотя бы базовых знаний в этой области.
Даже всемирно известные эксперты-криптографы умудряются делать ошибки в дизайне алгоритмов, из за которых вся крипто-надежность летит к чертям.
И спасает тут только глубочайший анализ сотнями экспертов.
Ваш алгоритм уязвим практически ко всем возможным атакам, коме самых примитивных :-)
Если вы последовательно умножите некоторую матрицу на 15 разных матриц с некими числовыми значениями в ячейках, то результат получившийся в итоге может быть получен уменьшением исходной матрицы на всего одну матрицу, т.е. последовательное умножение на 15 матриц можно свести к умножению на одну матрицу, главное найти параметры для этой матрицы.
А дальше начинается проблема: например если злоумышленник сможет заставить вас зашифровать своё сообщение и вернуть ему шифрованный результат (вполне обычный сценарий в мире сетевых протоколов), то нахождение секретного ключа, т.е. параметров «мастер матрицы» — сведется к решению системы линейных уравнений, — задача с которой справится за доли секунды даже микроконтроллер. И это только один из многочисленных способа эксплуатации линейности между входом и выходом.
Любое последовательное перемножение на группы матриц можно свести к умножению на одну единственную матрицу, следовательно «задача сводится к предыдущей».
В мире криптоанализа любые незначительные линейные корреляции между входом и выходом — это сразу гвоздь в гроб алгоритма. Так например случилось с DES, там один из S-box ов оказался с незначительными линейными характеристики, что в итоге привело к возможности значительно снизить переборную сложность взлома алгоритма.
А вы предлагаете прямую линейную зависимость…
Если просто умножать на матрицу, разве это не приведёт к линейным корреляциям между шифрованными и не шифрованными данными, тем самым сломав всю безопасность?
Даже обидно, что никто из нас не сможет никогда живьем попробовать все эти прелести путешествия через горизонт событий. Был-бы способ транспортировки к окрестностям сверхмассивных ЧД — было бы неплохим бизнесом, я думаю многие любопытствующие, под старость лет, захотели бы «на последок» взглянуть, что там внутри, когда по мед показаниям жить останется пару лет.
Возможно за тем, что на земле вряд-ли есть живые организмы «из коробки» способные выжить в условиях марсианской атмосферы / температуры. Ведь в осноном генная инженерия занимается тем, что заимствует удачные гены из одних организмов и встраивает в другие, но никогда почти не пишет «с нуля».
А в данном случае — неоткуда будет взять готовый кусок кода.
Такая гипотетическая ситуация: кто-то выставил на бирже ордер на скажем 13 едениц какого-нибудь опциона, по цене, которая понравилась всем трейдерам. В течении 5 секундного окна пришло 7 заявок на 2 еденицы каждый.
Как вы будете это честно делить, что-бы от порядка обработки ничего не зависело? Ведь на цело это не делится, и 6-ым достанется по 2, а один получит partial fill, с 1 опционом вместо запрашиваемых двух. Как решить — кому достанется partial fill?
Следует добавить что в случае HTF, задержка сейчас обычно обусловлена исключительно временем прохождения сигнала от биржы к трейдеру и обратно. Само решение, при использовании аппаратного ускорения, принимается практически мгновенно — меньше чем за 0.5 мкс.
Вы выберете ключ (любой набор матриц), этим ключем зашифруйте один файл в пару сотен кб, и пришлите мне и оригинал и шифрованный файл, потом зашифруйте второй файл и пришлите мне только шифрованный.
Моя задача будет — восстановить второй файл, не зная исходного ключа.
На все эти вопросы — нужны точные ответы, с точностью до бита.
Так что — я обозначил условия, на которых я согласен взяться за анализ: либо полные исходники (они все равно не представляют никакой коммерческой ценности, поверьте), либо детальная техническая спецификация форматов и алгоритмов.
Вообще, если вы предоставите сам код, кодирующий / декодирующий, набор файлов (оригинал + шифрованное), то я берусь попробовать восстановить ключи (которых вы мне не сообщите).
Если исходники предоставить не можете — нужна грамотная техническая, подробная, спецификация, на все форматы. Того, что вы описали — недостаточно.
Конечно, в общем случае — можно все проанализировать и без подобных деталей, но сейчас задача стоит сломать шифрование, а не угодать формат файла.
P.S. только заниматься я этим буду после 24-ого числа, — 24 числа у меня супруга и дочка уезжают на каникулы на историческую родину, и я буду предоставлен сам себе на полтора месяца, так что по 1-2 часа в день — могу уделять. До 24-ого — вряд-ли смогу даже глянуть.
2) Не понял вопроса, не могу ответить без более точных технических данных о том, как на битовом уровне, вы кодируете / декодируете.
3) Вы еще в float храните? :) Вообще ответ такой-же как в 2), но в целом — преобразование во float — может ввести немного нелинейности, если не знать что это float, но если знать — то можно сконвертировать в fix point например, и дальше — как обычно.
4) Вы немного меняете задачу. Я вам говорил о наличии у вас пар открытый / шифрованный текст, по которым можно восстановить ключь. Что значит «не с самого начала» я не понимаю, т.к. не понимаю, что вы тут хотите сделать с этими «данными зашифрованными не самого начала».
5) У вас одна матрица — бинарная NxN, а что у алгоритма внутри — не имеет значения. Хоть 100000 матриц.
Посмотрите например: en.m.wikipedia.org/wiki/Hill_cipher — особенно раздел Security, там подробно все написано, алгоритм практически 1-в-1 такой же, что и у вас
Мастер матрицу — почему же нельзя, все можно, арифметика на кольце mod 256 — практически такая-же. Деление только отличается (кстати имнно по этому у меня сомнения, что вы сможете расшифровать шифрованное обратно, если вы храните числа по модулю 256 :-) )
Я скажу даже больше, атакующему вообще не важно знать, как у вас устроен алгоритм внутри, достаточно знать что между входом и выходом — есть линейная зависимость.
Данная задача может быть решена так сказать в «в общем случае», для вектора N бит и искомой битовой матрицы N*N. Только тут уже потребуется N пар, и умножения все будут по модулю 2.
Я вас не очень понял, вы предлагаете менять ключ шифрования раз в несколько блоков? Современные алгоритмы обычно без проблем могут шифровать порядка 2^32 блоков, минимум, в зависимости от режима, без смены ключа и нарушения безопасности.
> 2) При KPCA, т.е. то что вы описали как «А дальше начинается проблема:» решить систему «линейных уравнений» будет не совсем просто хотя бы потому, что при создании матрицы используется 4 неизвестных, а зашифрованные вектора состоят из трех элементов, таким образом мы получим три уравнения с четырьмя неизвестными.
Ну тогда достаточно будет иметь две пары шифрованных/нешифрованных сообщений и у злоумышленника будет 4 неизвестных и 6 уравнений.
Даже всемирно известные эксперты-криптографы умудряются делать ошибки в дизайне алгоритмов, из за которых вся крипто-надежность летит к чертям.
И спасает тут только глубочайший анализ сотнями экспертов.
Ваш алгоритм уязвим практически ко всем возможным атакам, коме самых примитивных :-)
А дальше начинается проблема: например если злоумышленник сможет заставить вас зашифровать своё сообщение и вернуть ему шифрованный результат (вполне обычный сценарий в мире сетевых протоколов), то нахождение секретного ключа, т.е. параметров «мастер матрицы» — сведется к решению системы линейных уравнений, — задача с которой справится за доли секунды даже микроконтроллер. И это только один из многочисленных способа эксплуатации линейности между входом и выходом.
В мире криптоанализа любые незначительные линейные корреляции между входом и выходом — это сразу гвоздь в гроб алгоритма. Так например случилось с DES, там один из S-box ов оказался с незначительными линейными характеристики, что в итоге привело к возможности значительно снизить переборную сложность взлома алгоритма.
А вы предлагаете прямую линейную зависимость…
А в данном случае — неоткуда будет взять готовый кусок кода.
Как вы будете это честно делить, что-бы от порядка обработки ничего не зависело? Ведь на цело это не делится, и 6-ым достанется по 2, а один получит partial fill, с 1 опционом вместо запрашиваемых двух. Как решить — кому достанется partial fill?