Какие методы вы используете при написании собственных методов криптографии?

В течение многих лет, может быть, 10, я был очарован криптографией. Я прочитал книгу о битовом шифровании XOR, и с тех пор меня зацепило.

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

По делу - какие методы вы используете при написании криптографии? Хорошо ли обфускация в криптографии?

Я использую два шифрования XOR на основе ключей, различные методы хеширования (SHA1) для ключей и простые вещи, такие как реверсирование строк здесь и там и т. Д.

Мне интересно узнать, что думают другие, и попробовать при написании нестандартного метода шифрования. Также будет интересна любая информация о том, как профессионалы «взламывают» различные методы криптографии.

Чтобы уточнить - у меня нет желания использовать это в каком-либо производственном коде или в любом моем коде, если на то пошло. Мне интересно узнать, как это работает, просто играя, а не изобретая велосипед. :)

Ян


person Ian P    schedule 23.09.2008    source источник
comment
См. Также: Извлеченные уроки по шифрованию и криптографии   -  person halfbit    schedule 25.06.2012


Ответы (19)


Чтобы противоречить тому, что все говорили до сих пор, дерзайте! Да, в вашем коде могут быть уязвимости, связанные с переполнением буфера, и он может быть медленным, глючным и т. Д., Но вы делаете это для < сильный> УДОВОЛЬСТВИЕ! Я полностью понимаю, какое удовольствие приносит игра с криптовалютой.

При этом криптография вообще не основана на обфускации (или, по крайней мере, не должна быть). Хорошая криптовалюта продолжит работать, даже если Eve проработает ваш запутанный код и полностью понимает, что происходит. IE: Во многих газетах есть головоломки с кодом замены, которые читатели пытаются решить за завтраком. Если бы они начали делать такие вещи, как переворачивание всей строки, да, было бы труднее, но Джо Ридер все равно мог бы ее порвать, neve tuohtiw gnieb dlot.

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

[Edit: оснастка, ни один из них не доказано NP-завершен. Все они недоказанные, но разные. Надеюсь, вы все еще понимаете мою точку зрения: криптовалюта основана на односторонних функциях. Это операции, которые легко выполнить, но их трудно отменить. т.е. умножьте два числа и найдите простые множители продукта. Хороший улов tduehr]

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

Примечание. При этом некоторые алгоритмы добавляют дополнительные причуды (например, разделение строк), чтобы значительно усложнить их грубое принуждение. Какая-то часть меня кажется, что я где-то прочитал это со ссылкой на DES, но я не верю в это. ... [РЕДАКТИРОВАТЬ: я был прав, см. 5-й абзац этой статьи для ссылки на перестановки как бесполезные.]

Кстати: если вы не нашли его раньше, я бы предположил, что TEA / XTEA / XXTEA представляет интерес.

person PhirePhly    schedule 23.09.2008
comment
Nitpick: Как правило, только шифрование с открытым ключом надежно основано на трудных для взлома проблемах. Симметричная криптография и хэши имеют гораздо более слабую теоретическую основу. - person Nick Johnson; 15.07.2009

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

Возьмите книгу Брюса Шнайера Прикладная криптография и внимательно прочтите ее.

person Tim Farley    schedule 23.09.2008

Правильный ответ - не делать этого. Лучший способ - выбрать для этой цели одну из многих библиотек криптографии и использовать ее в своем приложении. Безопасность через неизвестность никогда не работает.

Также выберите самые современные стандарты криптографических алгоритмов. AES для шифрования, SHA256 для хеширования. Эльгамал для открытого ключа.

Также неплохо было бы прочитать «Прикладная криптография». Но подавляющая часть книги - это подробности реализации, которые вам не понадобятся для большинства приложений.

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

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

Оба они содержат много информации о том, что входит в алгоритм криптографии. Некоторое объяснение таких вещей, как дифференциальный и линейный криптоанализ. Другой ресурс - Citeseer, на котором есть ряд научных статей, на которые есть ссылки в обеих этих книгах для загрузки.

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

person Harley Klein    schedule 23.09.2008

Выполняйте упражнения здесь:

http://www.schneier.com/crypto-gram-9910.html#SoYouWanttobeaCryptographer

Для начала посмотрите статью об атаке куба (http://eprint.iacr.org/2008/385) и попробуйте сломать с его помощью некоторые алгоритмы. После того, как вы познакомитесь с взломом криптографических схем, вы научитесь их создавать.

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

person Leo    schedule 23.09.2008

Все вышеперечисленные советы верны. Обфускация плохая. Не запускайте свою собственную криптовалюту в производство, не позволив публике какое-то время поработать над ней.

пару вещей добавить:

  • Кодировка - это не шифрование. Недавно я обошел систему аутентификации веб-сайта из-за недопонимания разработчиков.

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

  • A ^ B = C. Вы заявили, что работали с двухключевым шифрованием XOR. При построении криптосистемы всегда проверяйте, действительно ли ваши шаги чего-то достигают. в случае с двумя ключами XOR вы действительно просто используете другой ключ.

  • A ^ A = 0. Шифрование XOR очень слабо против атак известного или выбранного открытого текста. Если вы знаете весь или часть открытого текста, вы можете получить весь ключ или его часть. Открытый текст ^ Cyphertext = Key

  • Еще одна хорошая книга для чтения - «Кодовая книга» Саймона Сингха. В нем рассказывается об истории криптографии и методах взлома большинства криптосистем, которые он описывает.

  • Два алгоритма для изучения (изучите их и историю, стоящую за ними):

    • 3DES: yes it's obsolete but it's a good starting point for learning fiestel and block cyphers and there are some good lessons in it's creation from DES. Also, the reasoning for the encrypt, decrypt, encrypt methodology used is a good thing to learn.
    • RSA: Я собираюсь показать здесь моего внутреннего математика. Вероятно, самый простой алгоритм шифрования, используемый сегодня. Способы взлома известны (просто множите ключ), но чрезвычайно сложны в вычислительном отношении. m ^ d mod n, где n = p * q (p и q простые числа) и gcd (d, n) = 1. Немного теории групп / чисел объясняет, почему это не так легко изменить, не зная p и q. В моем курсе теории чисел мы доказали стоящую за этим теорию по крайней мере с полдюжины способов.

Примечание для PhirePhly:

разложение на простые множители и дискретный журнал не являются NP-Complete или NP-Hard в этом отношении. Оба они неизвестны по сложности. Я полагаю, вы получите приличную известность, просто разобравшись в этой части. Тем не менее, остальная часть вашего утверждения верна. Хорошая криптовалюта основана на вещах, которые легко сделать, но их сложно отменить без ключа.

person tduehr    schedule 23.09.2008
comment
Я бы выбрал blowfish, а не 3DES. Также стоит создать игрушечную реализацию AES. - person finnw; 19.12.2012

Если вы (не становитесь) экспертом в этой области, не используйте самодельную криптовалюту в производственных продуктах. Достаточно сказано.

person Chris Jester-Young    schedule 23.09.2008

НЕ!

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

person BCS    schedule 23.09.2008

Большинство экспертов сходятся во мнении, что при разработке криптографических методов и алгоритмов открытость более ценна, чем обфускация.

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

В общем, большинство методов обфускации и простого хеширования (а я сделал немало из них сам) очень легко взломать. Это не значит, что с ними не весело экспериментировать и узнавать о них.

Список книг по криптографии (из Википедии)

Этот вопрос привлек мое внимание, потому что в настоящее время я перечитываю Cryptonomicon Нила Стивенсона, что не Неплохой обзор сам по себе, хоть и роман ...

person CMPalmer    schedule 23.09.2008

Чтобы повторить все остальные (для потомков), никогда не внедряйте свою собственную криптовалюту. Используйте библиотеку.

Тем не менее, вот статья о том, как реализовать DES:

http://scienceblogs.com/goodmath/2008/09/des_encryption_part_1_encrypti.php

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

Также получите и прочтите Прикладную криптографию. Это отличная книга.

person noah    schedule 23.09.2008

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

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

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

Если вы просто хотите увидеть, КАК это делается (изучить существующие реализации в коде), я бы посоветовал взглянуть на Библиотека Crypto ++, даже если вы обычно не пишете на C ++, это хороший обзор тем и частей реализации шифрования.

У Брюса также есть хороший список ресурсов, которые вы можете получить с его сайта.

person Jason Short    schedule 23.09.2008

Я посетил сеанс безопасности кода в Aus TechEd этого года. Говоря об алгоритме AES в .Net и о том, как он был выбран, докладчик (Рокки Хекман) рассказал нам об одном из методов, которые использовались для взлома предыдущего шифрования. Кому-то удалось использовать тепловизионную камеру для записи тепловой сигнатуры процессора во время шифрования данных. Они смогли использовать эту запись, чтобы выяснить, какие типы вычислений выполняла микросхема, а затем перепроектировать алгоритм. У них было слишком много свободного времени, и я совершенно уверен, что никогда не буду достаточно умен, чтобы победить таких людей! :(

  • Примечание: я искренне надеюсь, что передал историю правильно, если нет - скорее всего, это моя ошибка, а не ошибка упомянутого докладчика.
person Dr8k    schedule 23.09.2008
comment
Я тоже был на этой презентации - ваша история звучит так, как будто я ее помню. - person CAD bloke; 23.09.2008

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

Я полностью поддерживаю это и делаю то же самое со многими программами, которые написал просто для развлечения. Предлагаю прочитать этот пост (http://rdist.root.org/2008/09/18/dangers-of-amateur-cryptography/) в блоге под названием "rootlabs". В посте есть серия ссылок, которые должны вас заинтересовать. Парень, интересующийся математикой / криптографией, со степенью доктора компьютерных наук и работающий в Google, решил написать серию статей о программировании криптографии. Он сделал несколько неочевидных ошибок, на которые указал отраслевой эксперт Нейт Лоусон.

Предлагаю вам прочитать. Если он не побуждает вас продолжать попытки, он, несомненно, все равно вас чему-то научит.

Удачи!

person randy    schedule 25.09.2008

Я согласен не изобретать колесо заново.

И помните, безопасность через неизвестность - это вовсе не безопасность. Если в какой-либо части ваших механизмов безопасности используется фраза «никто никогда не узнает об этом!», Это небезопасно. Подумайте об AES - алгоритм общедоступен, поэтому все знают точно, как он работает, но никто не может его сломать.

person Graeme Perrow    schedule 23.09.2008
comment
Я часто думаю, что код с максимальной безопасностью должен планировать для начала публикацию всей кодовой базы! Единственное, что следует считать секретным, - это сами ключи. - person BCS; 23.09.2008
comment
Однако интересно, как можно проводить удивительные непрямые атаки даже против чего-то вроде AES: citp.princeton. edu / pub / coldboot.pdf - person A. Rex; 23.09.2008
comment
Я бы не стал утверждать, что никто не может сломать AES. Я бы сказал, что (очевидно) взлом AES в настоящее время обходится дороже, чем ценность информации, которую он обычно используется для защиты. - person Tall Jeff; 23.09.2008

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

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

person Tall Jeff    schedule 23.09.2008

Я согласен со всеми ответами, как «не пишите свой собственный криптоалгоритм для производственного использования», так и «черт возьми, сделайте это для собственного назидания», но Мне вспоминается то, что, как мне кажется, достопочтенный Брюс Шнайер часто пишет: «Кто-то легко может создать то, что он сам не может сломать».

person Paul Dixon    schedule 25.09.2008

Единственная криптография, которую неспециалист должен ожидать правильно, - это простые шифры One Time Pad.

CipherTextArray = PlainTextArray ^ KeyArray;

Кроме того, для всего, на что стоит взглянуть (даже для отдыха), потребуется высокий уровень математики.

person BCS    schedule 23.09.2008
comment
А неспециалисты могут испортить генерацию одноразовых паролей! :-П - person Chris Jester-Young; 23.09.2008
comment
Из того, что я понял, существует множество тонкостей, связанных с генерацией криптографически безопасных случайных чисел, и, опять же, неспециалистам не стоит пытаться создавать производственные продукты из этого. :-) - person Chris Jester-Young; 23.09.2008
comment
Эти комментарии верны. Функция rand () в C или практически любом другом языковом эквиваленте не является криптографически безопасной и может быть предсказана даже при взломе любого одноразового блокнота. Поскольку для работы одноразовый блокнот должен быть действительно случайным, это может легко сломать вашу систему. - person Harley Klein; 23.09.2008
comment
Не говоря уже о хранении ключей, обмене и т. Д. Не могу облажаться, но сделает. - person AviD; 23.09.2008

Я не хочу вдаваться в подробности о правильных ответах, которые уже были даны (не делайте этого для производства; простого разворота недостаточно; обфускация плохая и т. Д.).

Я просто хочу добавить принцип Керкоффа: «Криптосистема должна быть безопасной, даже если все о системе, кроме ключа, является общеизвестным».

Пока я нахожусь на этом, я также упомяну принцип Бергофски (цитируемый Дэном Брауном в Digital Fortress): «Если компьютер попробует достаточно ключей, он математически гарантированно найдет правильный. Безопасность кода заключалась не в том, что он прошел -ключ нельзя было найти, но у большинства людей не было времени или оборудования, чтобы попробовать ».
Только это по сути неправда; Дэн Браун придумал.

person AviD    schedule 23.09.2008

Отвечая на вопросы PhirePhly и tduehr о сложности факторинга:

Легко видеть, что факторинг есть в NP и coNP. Что нам нужно увидеть, так это то, что обе задачи «при n и k найти простой множитель p для n с 1‹ p ‹= k» и «показать, что такого p не существует» находятся в NP (первый из них - вариант решения проблемы факторинга, второй - вариант решения дополнения).

Первая проблема: учитывая возможное решение p, мы можем легко (т.е. за полиномиальное время) проверить, равно ли 1 ‹p‹ = k и делит ли p на n. Решение p всегда короче (по количеству битов, используемых для его представления), чем n, поэтому факторизация выполняется в NP.

Вторая проблема: учитывая полную факторизацию на простые множители (p_1, ..., p_m), мы можем быстро проверить, что их произведение равно n и что ни одно из них не находится между 1 и k. Мы знаем, что PRIMES находится в P, поэтому мы можем проверить простоту каждого p_i за полиномиальное время. Поскольку наименьшее простое число равно 2, в любой действительной факторизации может быть не более log_2 (n) простых множителей. Каждый множитель меньше n, поэтому они используют не более O (n log (n)) бит. Итак, если n не имеет простого множителя между 1 и k, существует короткое (полиномиальное) доказательство, которое можно быстро проверить (за полиномиальное время).

Итак, факторинг есть в NP и coNP. Если бы он был NP-полным, то NP равнялся бы coNP, что часто считается ложным. Это можно считать доказательством того, что факторинг действительно не является NP-полным; Я лучше дождусь доказательства ;-)

person Jonas Kölker    schedule 22.02.2009

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

Если дать мышке алгоритм ...

person Community    schedule 23.09.2008