Возможно я не прав, но я твердо придерживаюсь мнения, что некоторые ошибки бывают не менее интересны чем проекты в которых они произошли. Я хочу рассказать об одном проекте, в котором принял участие довольно давно. О том, как казалось-бы правильное применение криптографических средств, привело к возникновению уязвимости, лишившей всю остальную криптографию какого бы то ни было смысла.
Скажу сразу, что себя я квалифицированным специалистом в области криптографии не считаю. Я имел дело с криптоалгоритмами, когда ситуация не оставляла мне другого выбора. Безусловно, было-бы лучше, если-бы этими работами занимался кто-то более разбирающийся в вопросе, но так получилось, что заниматься ими пришлось мне. В любом случае, я надеюсь, что мой рассказ будет интересен.
Эта история произошла в середине 90-х годов. Я учился на 4-ом курсе КАИ, попутно подрабатывая на кафедре ПМ. Помню, что я писал что-то на FoxBase для одного из местных «свечных заводиков», совместно с несколькими сотрудниками института. Сама работа на кафедре способствовала тому, что я постоянно был на виду и, в один прекрасный момент, мне предложили поучаствовать в новом проекте, связанным с разработкой «железа», занимающегося криптографией. Разумеется, я согласился.
Наша группа состояла из пары вполне квалифицированных криптологов, электронщиков и программистов. Я, как молодой специалист, занимался HAL-ом. Ничего особенного, C++ и немного x86-го ассемблера. В последующем, мы, всей группой, весьма удачно трудоустроились в РЦИ НБ РТ.
Вот как выглядело одно из наших изделий (ISA-карта со съемным ключем):
Помимо основного назначения — потокового шифрования гаммированием, оно также могло использоваться как качественный генератор псевдослучайных чисел. Главной особенностью этого устройства была невозможность перехвата данных ключа при помощи программных закладок.
Соединялось все следующим образом:
Внутри ключа располагалась обычная ПЗУ-шка:
При выполнении шифрования, из ПЗУ, по заданному адресу в Устройство считывались 16 байт ключа (подряд), после чего, на основании этого ключа и случайной синхропосылки, генерировалась гамма, используемая для шифрования. Сам ключ на ПК никогда не передавался.
Не помню уже кому пришло в голову (возможно, что и мне), что если выбирать ключ из ПЗУ не подряд, а побайтно (управляя выборкой каждого байта), то, при помощи всевозможных перестановок, ключей можно получить значительно больше. Это была действительно ужасная идея. Тихо и незаметно в архитектуре аппаратно-программного комплекса образовалась дыра, позволяющая программно читать содержимое всего ПЗУ ключа.
Поскольку, при таком способе загрузки ключа, имеется всего 256 возможных вариантов, таблицу результатов шифрования можно построить заранее. По этой таблице, можно легко определить, из какого именно байта состоит ключ. Тем-же способом, медленно, но верно, можно прочитать все оставшееся содержимое аппаратного ключа.
К счастью, эта уязвимость была вовремя замечена и устранена, но несколько устройств пришлось переделывать.
Этой небольшой статьей я хочу предостеречь Читателя от легкомысленного отношения к вопросам, связанным с криптографией. Криптография коварна и уязвимости легко могут возникнуть там, где их меньше всего ждешь. Вместе с тем, я не призываю «не профессионалов» к отказу от использования криптографии, подобно тому как это делается в этой статье.
Только опыт и максимальное внимание к задаче могут помочь в обнаружении ошибок подобных описанной выше. А если в этом направлении не работать, то и опыту будет взяться неоткуда.
Автор: GlukKazan