Как стать автором
Обновить

Комментарии 19

Не могу не согласится, путь от концепции до рабочий версии обычно долог и не прост. И это касается любых разработок.
Невероятен эффект от «наведённого контекста», только с 5 раза прочитал в заголовке статьи, что это не слово «криптопроктолог».
Да хватит, минусовать, я честное слово несколько раз прочитал в названии статьи «учебных криптопроктологов»
не тролю же
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Угу. Из других подобных азов: если в асинхронном зашифрованном сообщении вы не указываете, например, уникальное время, то злоумышленник сможет перехватить это сообщение и отреплеить.
А если вы проверяете уникальность времени, но при приёмке не проверяете это время, то есть шанс, что злоумышленник сможет заджамить оригинальное сообщение, а вам проиграть копию.
Что Вы подразумеваете под уникальным временем? Как можно проверить время на уникальность? 18 июля 2011 года 1 час ночи, 11 минут, 36 секунд — уникальное время? И что вы имеете ввиду под асинхронным зашифрованным сообщением? Не уверен, что до конца Вас понял.
Уникальное — для стороны, принимающей сообщение. Если не хватает времени, используют дополнительную последовательность уникальных значений (собственно, так и надо, просто иногда для простоты пользуются временем).

Асинхронное — имеется в виду, что сообщение не привязано иным способом (например, хотя бы, tcp-сессией) к контексту, по которому можно идентифицировать это сообщение (или отсеять идентичные сообщения от злоумышленников).
То есть предполагается, что сторона, принимающая сообщение не может получить два сообщения от разных адресатов в одно и то же время? Сообщение №1 получено во время Х, это время уникально, окей. И если вдруг пришло сообщение №2 от другого адресата во время Х, то оно отклоняется? Х то уже не уникально! Или я снова неправильно вас понял?
Есть такой механизм, как метки времени. Слово «уникальность» в нем отсутствует. У многих криптоаналитиков возникают серьезные сомнения по поводу эффективности использования меток времени. Я разделяю их точку зрения целиком и полностью. Если Вас или кого-либо заинтересует почему именно, с удовольствием расскажу в отдельном комментарии.
То, как Вы ввели понятие асинхронности не соответствует что ли «чистой криптографии». В ней нет tcp сессий и прочих благ современности. Есть канал общения, Алиса, Боб, посередине злой Трент. Поэтому я, признаться, теряюсь в догадках, к какой области относятся подобные приведенному Вами азы. К криптографии вряд ли.
Я максимально упростил схему (и опустил некоторые вещи, понятные из контекста, типа того, что речь идёт об ассиметричной криптографии). И я не на 100% владею терминологией, да, — только некоторыми азбучными прикладными технологиями, нарушения которых встречаю регулярно (и с этими нарушениями приходится бороться).

Если пришло сообщение №2, идентичное первому — то вполне логично его либо отклонить, либо поднять тревогу (либо ещё что-то, в зависимости от приложения).

«Метки времени» у меня ассоциируются с деятельностью timestamping authority и об этом речи не велось.

Речь шла (1) об обеспечении уникальности корректных сообщений, используемых в протоколе (например, в простейшем случае, с использованием указания времени в сообщении), что бы Трент не мог вбросить 100500 таких сообщений и получить от Боба по ним кучу ништяков и (2) о необходимости проверки этого времени (и, соответственно, проверки соответствия хода часов Алисы и Боба), если вероятна атака с помощью перехвата и дальнейшего вбрасывания Трентом перехваченного сообщения, при условии того, что проверить то, что источник коммуникации/транзакции, ассоциированной с сообщением, — на самом деле Алиса, а не Трент, — затруднительно.

И, естественно, речь идёт о практических аспектах криптографии для обеспечения распределённых транзакций. Напомню, что математически задача двух генералов принципиально нерешаемая, поэтому кроме криптографии для понижения вероятности атаки приходится применять кучу разных мер, связанных с «обнюхиванием конвертов» (в т.ч. и tcp-сессий/датаграмм, если это важно). И указанные мной моменты — азы, которые, тем не менее, в отрасли невероятно часто нарушаются и из-за этого в реальном мире угоняются машины, теряются бабки и т.п.
К сожалению не «копался» в QtCrypto, поэтому не могу ничего Вам сказать о его безопасности. Достаточно говорящими в некоторых случаях бывают фамилии авторов ПО. Если они признанные «классики», то с большой вероятностью им можно довериться.
О самой RSA. Очевидно, что в том примере что я привел атакующий перебирает всевозможные открытые тексты (априори ему известно, что длина текста 8 бит = 1 байт). Учебная RSA тут же ломается. В учебной RSA для противодействия этой атаке не хватает так называемого паддинга, или дополнения сообщения (открытого текста) длиной 8 бит до «нужной» длины, на которую атаку построить не удастся. Паддинг не есть постоянная величина, т.е. он уникален для каждого передаваемого сообщения. Тогда передавая 1 байт Вы передаете на самом деле, допустим, 64 байта (открытый текст + паддинг). А перебрать 2^512 вариантов атакующему крайне трудно…
RSA очень непростая вещь в плане безопасной реализации, есть ещё дополнительно 1001 подводный камень, будьте внимательны!
у john_smith даже логин зашифрованный )
> Если вы хотите, чтобы в вашем проекте были заложены действительно надежные защитные механизмы, позаботьтесь о наличии в вашей команде человека с профильным образованием и опытом в области защиты информации.

О, я как раз хотел проконсультироваться с таким человеком. У меня есть opensource проект RC5Simple (криптографическая библиотека).

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

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

/* Initialize pt1 and key pseudorandomly based on previous ct */
pt1[0]=ct[0];
pt1[1]=ct[1];
for (j=0;j<b;j++)
key[j] = ct[0]%(255-j);


Но когда я стал разбираться с режимами шифрования:

ru.wikipedia.org/wiki/Режим_шифрования

то не обнаружил там ни одного режима, в котором бы был пересчет ключа. Поэтому, я реализовал обычный Cipher Block Chaining (CBC) режим для связывания блоков шифротекста.

Вопрос: правильно ли я поступил? И не могли бы вы посмотреть опытным взглядом на исходники, они небольшие (20 Кб), там половина — переработанный копипаст из реализации RSA reference implementation of RC5-32/12/16.
Давайте я Вам для начала задам такой вопрос: Зачем Вы занялись реализацией криптографической библиотеки, не имея в этом должного опыта? Просто для собственного развития или Вы планируете продвигать библиотеку в массы?
Ответ ниже.
> Давайте я Вам для начала задам такой вопрос: Зачем Вы занялись реализацией криптографической библиотеки, не имея в этом должного опыта? Просто для собственного развития или Вы планируете продвигать библиотеку в массы?

Потому что других реализаций на чистом C или C++ я не нашел. Думал, что легко найду. Ничего подобного. Только сложно портируемые монстры типа libcrypt совершенно без документации как встраивать их вовнутрь кроссплатформенного приложения — то есть не тупо использовать через заголовок, а встроить вовнутрь. Чтобы проект без плясок с бубном собирался в Linux, Windows, MacOsX, MeeGo. Плюс стояла задача — программа должна быть Qt-only. То есть, ничего левого подключать для сборки нельзя. Оказалось, что прощще написать своё, чем ковырять чужие поделия.

То есть, мне нужна была встраиваемая библиотека шифрования. Таких библиотек не обнаружил в природе.

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

webhamster.ru/site/page/index/main/news/167

Можете взламывать, исходники открыты.

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

ЗЫЖ Возможно, мне и помогла бы libcrypt, и я бы ее расковырял и сделал встраиваемой, но более-менее внятное описание на русском появилось позже, чем я сделал свою библиотеку:

habrahabr.ru/blogs/programming/120639/

Возможно вы и правы, насчет отсутствия нужных библиотек в природе. Оставим это без комментариев. Просто постарайтесь представить, что у вас получится в итоге. Возможно, выйдет хорошая годная вещь. Но вероятность этого крайне мала.
Приведу гипотетический пример. Я не считаю себя глупым человеком, и хочу спроектировать жилой многоэтажный дом. Уверен, что крупных огрехов аля в однокомнатных квартирах кухня 6 кв.м., а в трехкомнатных — 5 кв.м. я не допущу. Приступаю к работе и в результате получаю полный отрыг. А все потому, что я не разбираюсь в тонкостях. Я могу пользоваться только «бытовой логикой», не зная всех особенностей. Конечно есть вероятность, что удастся выдать стоящий проект дома…
Криптография — область далеко не простая. Консультируясь в форумах вы не добьетесь даже малой части нужной вам информации, необходим человек, постоянно направляющий движение в нужное русло.
Не хочу сбавлять в вас энтузиазм, честное слово. Просто хочу донести свою точку зрения и призываю задуматься.
Так вы, как профессионал, не могли бы провести аудит кода? Там всего 20Кб вместе с заголовками, комментариями и дебаговыми выводами. Развивать дальше там особо-то и нечего, разве что мелкие баги править да поддержку экзотических платформ добавлять.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории