Криптография 2е издание Протоколы, алгоритмы и исходные тексты на языке С
Скачать 3.25 Mb.
|
Большинство сообщений - обычная чепуха, перебранка ли и то, и другое одновременно. Некоторые сообщения касаются политики, а большинство остальных - просьбы предоставить сведения или общие . Иногда в этой теле- конференции случайно попадаются различные самородки и некоторая полезная информация . Если читать sci.crypt регулярно, можно узнать, как использовать нечто, называемое файлом-убийцей . Другой телеконференцией Usenet является sci.crypt.research, более умеренная телеконференция, посвященная обсуждению криптологических исследований . В ней меньше сообщений, и они гораздо интереснее . 25.12 Шифропанки Шифропанки (Cypherpunks) - это неформальная группа людей, заинтересованных в обучении и изучении криптографии. Они также экспериментируют с криптографией, пытаясь ввести ее в обиход . По их мнению все криптографические исследования не принесли обществу ничего хорошего, так как оно не воспользовалось до с- тижениями криптографии. В "Манифесте шифропанков" Эрик Хьюз (Eric Hughes) пишет [744]: Мы, Шифропанки, стремимся создать анонимные системы . Мы защищаем наши тайны с помощью криптографии, с п о- мощью систем анонимной отправки почты, с помощью цифровых подписей и электронных денег . Шифропанки пишут код. Мы знаем, что кто-то должен написать программное обеспечение, защищающее тайны личн о- сти, и так как пока это не сделано, мы не сможем обеспечить сохранение своих тайн, мы собираемся написать такие програ м- мы. Мы публикуем наш код, чтобы наши друзья Шифропанки могли попрактиковаться и поиграть с ним . Наш код свободно может использовать кто угодно и где угодно . Нас не очень волнует, нравятся ли вам программы, которые мы пишем . Мы зна- ем, что программное обеспечение невозможно разрушить, и что невозможно прекратить работу рассеянных систем . Те, кто хочет присоединиться к списку рассылки шифропанков в Internet, должны отправлять почту в адрес majordomo@toad.com. Список рассылки хранится на ftp.csua.berkeley.edu в /pub/cypherpunks. 25.13 Патенты Вопрос о программных патентах невозможно втиснуть в рамки этой книги . Хороши они или нет, они суще- ствуют. В Соединенных Штатах можно патентовать алгоритмы , в том числе и криптографические. IBM владеет патентами DES [514]. IDEA запатентован. Запатентованы почти все алгоритмы с открытыми ключами . NIST даже запатентовал DSA. Действие ряда криптографических патентов было блокировано вмешательством NSA, в соответствии с Актом о секретности изобретений ( Invention Secrecy Act) от 1940 года и Актом о национальной безопасности (National Security Act) от 1947 года. Это означает, что вместо патента изобретатель получает се к- ретное постановление, и ему запрещается обсуждать его изобретение с кем-нибудь еще . У NSA есть особые возможности при патентовании . Агентство может обратиться за патентом и затем бл о- кировать его выдачу. Снова появляется секретное постановление, но теперь NSA одновременно и изобретатель, и издатель постановления. Когда спустя некоторое время секретное постановление отменяется, регистрационная контора выдает патент, действующий стандартные 17 лет years. Это более явно защищает изобретение, чем хранение его в секрете. Если кому-нибудь удастся изобрести то же самое , NSA уже подало заявку на патент. Если никому другому не удастся изобрести то же самое, изобретение остается се кретным. Несмотря на то, что процесс патентования должен не только защищать изобретения, но и раскрывать их, благодаря этой уловке NSA может держать патент дольше 17 лет. Отсчет 17-летнего срока начинается с моме н- та выдачи патента, а не подачи заявки. Пока неясно, как все может измениться в связи с ратификацией договора о GATT Соединенными Штатами. 25.14 Экспортное законодательство США Согласно правительству США криптография относится к военному снаряжению . Это означает, что крипто- графия подчиняется тем же законам, что и ракета TOW или танк М1 Абрамс. Если вы продаете криптографиче- ский продукт без соответствующей экспортной лицензии, то вы - международный контрабандист оружием . Если вы не хотите испортить ваше резюме строкой о пребывании в федеральной тюрьме, обратите внимание на зак о- нодательство. С началом в 1949 году холодной войны все страны НАТО (кроме Исландии), а затем Австралия, Япония и Испания, образовали КОКОМ - Координационный комитет для многостороннего контроля за экспортом (CoCom, Coordinating Committee for Multilateral Export Controls ). Это неофициальная организация, призванная координировать национальные ограничения, касающиеся экспорта важных военных технологий в Советский Союз, другие страны Варшавского Договора и Китайскую Народную Республику . Примерами контролируемых технологий являются компьютеры, станки для металлопроката и криптография . Целью этой организации явля- лось замедление передачи технологий в указанные страны, и сдерживание, таким образом, их военного поте н- циала. С концом холодной войны страны КОКОМ осознали, что выполняемый ими контроль большей частью уст а- рел. В настоящее время, по видимому, идет процесс формирования "Нового форума", другой международной организации, которая собирается остановить поток военных технологий в страны, которые не нравятся членам организации. В любом случае экспортная политика США в отношении стратегических товаров регулируется Правительс т- венным актом об экспорте (Export Administration Act), Актом о контроле над экспортом вооружения (Arms Ex- port Control Act), Актом об атомной энергии (Atomic Energy Act) и Актом о нераспространении ядерных воор у- жений (Nuclear Non-Proliferation Act). Контроль, установленный этим законодательством, реализуется с пом о- щью многих подзаконных актов, ни один из них не координирует другой. Свыше дюжины организаций, вклю- чая военные службы, осуществляют контроль, часто их деятельность перекрывается и конфликтует . Подконтрольные технологии фигурируют в нескольких списках . Криптография, по традиции относящаяся к вооружению, появляется в Перечне вооружений США ( U.S. Munitions List, USML), Международном перечне вооружений (International Munitions List, IML), Перечне контроля за торговлей (Commerce Control List, CCL) и Международном промышленном перечне ( International Industrial List, IIL). Госдепартамент отвечает за USML, он публикуется как часть Регулирования международного трафика оружия (International Traffic in Arms Regula- tions, ITAR) [466, 467]. Экспорт криптографии в США контролируется двумя правительственными организациями . Одной является Комитет по управлению экспортом (Bureau of Export Administration, BXA) в Министерстве торговли, уполно- моченный Правилами регулирования экспорта ( Export Administration Regulations, EAR). Другая - это Управле- ние по регулированию продажи средств обороны (Office of Defense Trade Controls, DTC) в Государственном департаменте, уполномоченное ITAR. По опыту требования BXA из Министерства торговли менее строги, но сначала весь криптографический экспорт просматривается DTC из Госдепартамента (которое получает советы по технике и национальной безопасности от NSA и, кажется, всегда следует этим советам), которое может отка- зать передать право решения BXA. ITAR регулирует этот процесс. (До 1990 года Управление DTC называлось Управлением по контролю над вооружением, возможно, эти усилия в области "паблик рилейшнз" направлены на то, чтобы мы забыли, что мы имеем дело с бомбами и пушками.) Исторически DTC сопротивлялось выдаче экспортных лицензий на средства шифрования сильнее определенного уровня - хотя о том, каков этот уровень, никогда не сообщалось . Следующие разделы взяты из ITAR [466, 467]: § 120.10 Технические данные. Технические данные - это, в настоящем подпункте : (1) Информация, отличная от программного обеспечения , определенного в 120.10(d), которая нужна для проектирования, разработки, производства, обработки, изготовления, сборки, работы, ремонта, поддержки или модификации средств обороны . Это, например, информация в форме светокопий, чертежей, фотографий, планов, инструкций и докуме нтации; (2) Секретная информация, касающаяся средств обороны и оборонной деятельности ; (3) Информация, охватываемая постановлением о засекречивании изобретения ; (4) Программное обеспечение, определенное в разделе 121.8(f) и непосредственно связанное со средствами обороны (5) Это определение не включает информацию, касающуюся общенаучных, математических или инженерных принц и- пов, обычно изучаемых в общедоступных школах, колледжах и университетах, как определено в § 120.11. Оно также не включает базовую рыночную информацию о функции, назначении или общесистемном описании средств обороны . § 120.11 Открытый доступ. Открытый доступ обозначает информацию, которая опубликовывается и может быть общедоступной : (1) С помощью продажи в киосках и книжных магазинах ; (2) С помощью подписки, которая доступна без ограничений для любого, кто хочет получить или приобрести опублик о- ванную информацию; (3) С помощью почтовых привилегий второго класса, выданных правительством США ; (4) В библиотеках, открытых для публики, или в которых публика может получить документы ; (5) С помощью патентов, доступных в любой патентной конторе ; (6) С помощью неограниченного распространения на конференции, встрече, семинаре, презентации или выставке, до с- тупных обычной публике в Соединенных Штатах ; (7) С помощью сообщений для печати (т.е., неограниченное распространение) в любой форме (например, необязательно опубликованной), одобренных компетентными органами США (см. также § 125.4(b)(13)). (8) С помощью фундаментальных исследований в науке и технике в аккредитованных высших учебных заведениях США, где полученная информация обычно публикуется и широко распространяется в научном сообществе . Фундаменталь- ными называются базовые и прикладные исследования в науке и технике, когда полученная информация обычно публикуе т- ся и широко распространяется в научном сообществе в отличие от исследований, результаты которых не разглашаются из-за прав собственности или определенного контроля доступа и распространения правительством США . Университетские иссле- дования не считаются фундаментальными, если : (i) Университет или его исследователи соглашаются с другими ограничениями на публикацию научно-технической и н- формации, полученной в результате работы над проектом, или (ii) Исследования финансируются правительством США, а доступ к результатам исследований и их распространение н а- ходится ограничены с целью защиты информации . § 120.17 Экспорт. Под экспортом понимается: (1) Передача или вывоз средств обороны за пределы Соединенных Штатов любым способом, кроме путешествия за пр е- делы Соединенных Штатов лица, чьи личные знания включают технические данные ; или (2) Передача иностранному лицу прав регистрации, управления или собственности на любой самолет, судно или спут- ник, присутствующий в Перечне вооружений США, в Соединенных Штатах или за их пределами ; или (3) Раскрытие (в том числе устное или визуальное) или передача в Соединенных Штатах любых средств обороны посол ь- ству, учреждению или подразделению иностранного правительства (например, дипломатическим миссиям ); или (4) Раскрытие (в том числе устное или визуальное) или передача технических данных иностранному лицу в Соединенных Штатах или за их пределами; или (5) Выполнение оборонной деятельности от имени или для выгоды иностранного лица в Соединенных Штатах или за их пределами. (6) Запускаемый аппарат или полезная нагрузка не должны, при запуске такого аппарата, рассматриваться как экспорт. Однако для определенных целей (см § 126.1 этого подпункта), положения этого подпункта применимы к продажам и другим способам передачи средств обороны или продуктов оборонительной деятельности . Часть 121- Перечень вооружений США § 121.1 Общие положения. Перечень вооружений США Category XIII—Дополнительное военное снаряжение (1) Криптографические (включая управление ключами) системы , аппаратура, конструкции, модули, интегральные схемы, компоненты или программное обеспечение с возможностью поддержки секретности или конфиденциальности информации или информационных систем, кроме следующего криптографического оборудования и программного обеспечения : (i)Специально спроектированное для выполнения защищенным от копирования программным обеспечением только функций дешифрирования при условии, что управление дешифрированием недоступно пользователю . (ii) Специально спроектированное, разработанное или модифицированное для использования в машинах для банковских операций или денежных транзакций, которое можно использовать только для таких транзакций . Машины для банковских операций или денежных транзакций включают автоматические кассовые аппараты, самообслуживаемые печатающие уст- ройства, торговые терминалы или оборудование для шифрования межбанковских транза кций. (iii) Использующее только аналоговые методы для криптографической обработки, которая обеспечивает безопасность информации в следующих приложениях . . . . (iv) Персональные интеллектуальные карточки, использование которых возможно только в оборудовании или системах, не попадающих под регулирование USML. (v) С ограничением доступа, такие как автоматические кассовые аппараты , самообслуживаемые печатающие устройства или торговые терминалы, которые обеспечивают защиту паролей или персональных идентификационных номеров (PIN) или аналогичных данных, чтобы предотвратить несанкционированный доступ к средствам, но не могут шифровать файлы или тексты, не посредственно не связанные с защитой паролей или PIN. (vi) Осуществляющее только проверку подлинности данных с помощью вычисления кода проверки подлинности соо б- щения (MAC) или аналогичной функции для проверки, что в текст не было внесено изменений, или для проверки подлинн о- сти пользователей, но которое нельзя использовать для шифрования данных, текста или другой информации помимо необх о- димой для проверки подлинности. (vii) Использующее только фиксированные методы сжатия и кодирования данных . (viii) Используемое только для радиовещания, платного телевидения или аналогичных телевизионных систем с огран и- ченной аудиторией, без цифрового шифрования, и в которых цифровое дешифрирование ограничено только видео- и ауди о- функциями или управлением. (ix) Программное обеспечение, спроектированное или модифицированное для защиты от злоумышленных компьютерных повреждений, (например, вирусов). (2) Криптографические (включая управление ключами) системы , аппаратура, конструкции, модули, интегральные схемы, компоненты или программное обеспечение с возможностью генерации распространяемых кодов для большого количества систем или устройств: (3) Криптографические системы, аппаратура, конструкции, модули, интегральные схемы, компоненты или программное обеспечение. § 125.2 Экспорт несекретных технических данных . (a) Общие положения. Для экспорта несекретных технических данных необходима лицензия (DSP-5), если эти данные не исключены из лицензирующих требований данного подпункта . В случае планового визита детали предполагаемых диску с- сий должны быть переданы в Управление по регулированию продажи средств обороны для экспертизы технических данных . Должно быть предоставлено семь копий технических данных или тем ди скуссий. (b) Патенты. При экспорте технических данных требуется лицензия, выданная Управлением по регулированию продажи средств обороны, если данные превышают необходимые для заполнения внутренней патентной заявки или для заполнения иностранной патентной заявки, если внутренняя заявка не была заполнена . Заявки на патентование за рубежом, выполнение в таких патентах улучшений, модификаций или дополнений должны регулироваться Управлением по патентам и торговым знакам США в соответствии с 37 CFR, часть 5. Экспорт технических данных, необходимых для патентования в других стр а- нах, является субъектом норм, издаваемых Управлением по патентам и торговым знакам США, в соответствии с 35 U.S.C. 184. (c) Раскрытия. Для устного, визуального или документального раскрытия технических данных гражданами США ин о- странным лицам требуется лицензия, если в данном подпункте не оговорено иное . Лицензия требуется независимо от формы передачи технических данных (например, лично, по телефону, в переписке, электронными средствами, и т.д.). Лицензия тре- буется для таких раскрытий, делаемых гражданами США при посещении иностранных дипломатических миссий и ко н- сульств. И так далее. В этом документе намного больше информации. Если вы собираетесь экспортировать крипт о- графию, я советую вам добыть его копию и воспользоваться услугами юриста, который во всем этом разбирае т- ся. В действительности экспорт криптографических продуктов контролируется NSA. Если вам нужно получить свидетельство о признании вашего продукта предметом общего потребления ( Commodity Jurisdiction, CJ), вы должны представить ваш продукт на одобрение в NSA и подать в Государственный департамент заявку на п о- лучение CJ. После одобрения в Госдепартаменте дело попадает под юрисдикцию Министерства торговли , кото- рое никогда особенно не интересовалось криптографией . Однако Государственный департамент никогда не в ы- даст CJ без одобрения NSA. В 1977 году Джозеф А. Мейер (Joseph A. Meyer), служащий NSA, написал письмо - несанкционированное, в соответствии с официальной историей инцидента - в IEEE, предупреждающее, что планируемое представление оригинальной работы RSA нарушит ITAR. Из The Puzzle Palace: Вот его точка зрения. ITAR охватывает всю "несекретную информацию, которая может быть использована, или адапт и- рована для использования, при проектировании, производстве, изготовлении, ремонте, капитальном ремонте, переработке, конструировании, разработке, действии, поддержке или восстановлении" перечисленных материалов, также как и "любую технологию, которая развивает определенное умение или создает новое в области, которая имеет важное военное применение в Соединенных Штатах." И экспорт действительно включал передачу информации как в письменном виде, так и с помощью устных или визуальных средств, включая краткие обсуждения и симпозиумы, на которых были представлены иностра нцы. Но, буквально следуя туманному, часто слишком пространному законодательству, кажется, требуется, чтобы каждый, кто собирается написать или заявить что-то на тему , касающуюся Перечня вооружений, сначала получил бы одобрение Госуда р- ственного департамента - эта унылая перспектива явно противоречит Первой поправке и требует подтверждения Верховным судом. В конце концов NSA признало действия Мейера несанкционированными, и работа по RSA была опублико- вана, как планировалось. Против изобретателей не было предпринято никаких действий , хотя может быть дока- зано, что их работа увеличила возможности зарубежной криптографии гораздо больше, чем что-нибудь, опу б- ликованное до того. Экспорт криптографии обсуждается в следующем заявлении NSA [363]: Криптографические технологии считаются жизненно важными для интересов национальной безопасности, включая эк о- номические интересы, военные интересы и интересы внешней политики . Мы не согласны с заявлениями, сделанными 7 мая 1992 года на слушаниях Судебного комитета, и последними газетн ы- ми статьями, которые заявляют, что экспортные законы США мешают американским фирмам изготавливать и использовать современное шифровальное оборудование . Нам неизвестно ни об одном случае, когда из-за экспортных ограничений США американской фирме помешали изготавливать и использовать аппаратуру шифрования внутри страны, или американской фирме либо ее дочерней компании помешали использовать аппаратуру шифрования за пределами США . В действительности, NSA всегда поддерживало использование шифрования в американском бизнесе для защиты важной информации как дома, так и за границей. Для экспорта в другие страны NSA, являющееся частью Министерства обороны, (вместе с Государственным департаме н- том и Министерством торговли просматривает экспортные лицензии в поисках технологий информационной безопасности, попадающих под действие Экспортного правительственного законодательства или Регулирования международного трафика оружия. Аналогичная система контроля экспорта действует во всех странах КОКОМ и во многих других странах, так как эти технологии повсеместно считаются важными . Не существует общего запрета на экспорт подобных технологий, каждый сл у- чай рассматривается отдельно. При этом может потребоваться получить лицензии на такие системы, при получении которых анализируется влияние экспорта этой системы на интересы национальной безопасности - включая интересы экономической, военной и политической безопасности. Экспортные лицензии выдаются или не выдаются в зависимости от типа задейств о- ванного оборудования, предполагаемого использования и предполагаем ого пользователя. Наш анализ показывает, что США лидирует в мировом производстве и экспорте технологий информационной безопа с- ности. NSA одобряет для экспорта свыше 90% криптологических продуктов, направленных в NSA Государственным депар- таментом для лицензирования. Экспортные лицензии на продукты информационной безопасности, попадающие под юри с- дикцию Министерства торговли, выдаются без участия NSA или Министерства обороны. Среди них - продукты, использую- щие такие методы, как DSS и RSA, обеспечивающие проверку подлинности и контроль доступа к компьютерам и сетям . На самом деле, в прошлом NSA играло главную роль в успешном отстаивании ослабления экспортного контроля над RSA и близкими технологиями для проверки подлинности . Эти методы особенно важны при решении проблемы хакеров и несан к- ционированного использования ресурсов. Итак, заявлено, что NSA ограничивает экспорт только продуктов шифрования, но не проверки подлинности . Если вы собираетесь экспортировать продукт только для проверки подлинности , получение разрешение ограни- чится демонстрацией того, что ваш продукт нельзя без значительных переделок использовать для шифрования . Более того, бюрократическая процедура для продуктов проверки подлинности намного проще, чем для проду к- тов шифрования. Для системы проверки подлинности получать одобрение Госдепартамента ( CJ), система шиф- рования требует повторного одобрения для каждой версии продукта или даже при каждой продаже . Без CJ вам придется запрашивать разрешение на экспорт всякий раз, когда вы захотите экспортировать пр о- дукт. Государственный департамент не разрешает экспортировать продукты с сильным шифрованием, даже использующие DES. Отдельные исключения были сделаны для дочерних фирм американских компаний для возможности закрытой связи с, для некоторых банковских приложений и экспорт для военных пользователей США. Ассоциация производителей программного обеспечения (SPA) вела переговоры с правительством об ос- лаблении ограничений на экспортные. Соглашение, заключенное SPA и Госдепартаментом в 1992 году, облег- чило правила выдачи экспортных лицензий для двух алгоритмов , RC2 и RC4, при условии, что длина исполь- зуемого ключа не превысит 40 битов. Подробности можно найти в разделе 7.1. В 1993 году в Палате представителей Мария Кантвелл ( Maria Cantwell) (D-WA) по просьбе компаний- разработчиков программного обеспечения внесла законопроект, ослабляющий экспортный контроль за пр о- граммами. Сенатор Пэтти Мюррей (Patty Murray) (D-WA) внесла соответствующий билль в сенате. Законопро- ект Кантвелл был добавлен к общему закону о контроле над экспортом, проходящему через Конгресс , но был удален Комитетом по разведке под сильным давлением NSA. Когда NSA что-нибудь делает, оно прикладывает все усилия - комитет единодушно проголосовал за удаление формулировки. За последнее время я не припомню другого случая, чтобы группа законодателей что-то сделала единодушно. В 1995 году Дан Бернштейн (Dan Bernstein) при поддержке EFF подал в суд на правительство США, пыта- ясь помешать правительству ограничивать публикации криптографических документов и программного обесп е- чения [143]. В иске утверждалось, что законы об экспортном контроле неконституционны и вносят "непозволительные априорные ограничения высказываний в нарушение Первой поправки". Конкретно в иске утверждалось, что современный процесс контроля над экспортом : — Позволяет бюрократам ограничивать публикации без решения суда. — Обеспечивает слишком мало процедурных возможностей защиты прав в соответствии с Первой попра в- кой. — Требует от издателей регистрироваться в правительстве, создавая эффект "лицензированной прессы ". — Отказывает в общих публикациях, требуя идентифицировать каждого получателя . — Достаточно запутан, чтобы простые люди не могли знать, какое поведение правильно, а какое - нет . — Слишком пространен, так как запрещает поведение, которое явно защищается (например, разговор с ино- странцами внутри Соединенных Штатов). — Применяется слишком широко, запрещая экспорт программного обеспечения не содержащего крипт о- графии, исходя из соображений, что криптография может быть добавлена позже . — Явно нарушает Первую поправку, запрещая частные беседы по криптографии, так как правительство ж е- лает вместо этого навязывать публике свои криптографические взгляды . — Многими способами превышает полномочия, предоставленные как Конгрессом в экспортном законод а- тельстве, так и Конституцией. Можно предвидеть, что решение этого дела займет несколько лет , но предвидеть, чем оно закончится, не- возможно. Тем не менее, Консультативный комитет по безопасности и защищенности (Computer Security and Privacy Advisory Board), официальный консультант NIST, в марте 1992 года проголосовал за то, чтобы пересмотреть в национальной политике криптографические вопросы, включая экспортную политику . Было заявлено, что экс- портная политика определяется только организациями, отвечающими за национальную безопасность, без учета точки зрения организаций, связанных с развитием торговли . Эти связанные с национальной безопасностью о р- ганизации делают все возможно, чтобы ничего не изменилось, но необходимость перемен уже назрела . 25.15 Экспорт и импорт криптографии за рубежом В других странах существует свое экспортное и импортное право [311]. Приведенный обзор неполон и воз- можно устарел. Страны могут издать законы и не обращать на них внимания, или не иметь законов, но каким- то образом ограничивать экспорт, импорт и использование . — Австралия требует наличия сертификата у импортируемого криптографического продукта только по тр е- бованию страны-экспортера. — В Канаде нет контроля импорта, а контроль экспорта аналогичен американскому . Экспорт продуктов из Канада может быть ограничен, если они включены в Перечень контроля экспорта, соответствующий А к- ту разрешений экспорта и импорта. В отношении криптографических технологий Канада следует огран и- чениям КОКОМ. Шифровальные устройства описаны под категорией пять , части два канадских правил экспорта. These provisions аналогичны категории пять в Правительственных правилах эк спорта в США. — Китай использует схему лицензирования импортируемых продуктов, экспортеры должны заполнить зая в- ку в Министерстве зарубежной торговли. На основе китайского Перечня запрещенного и ограниченного экспорта и импорта, принятого в 1987 году , Китай ограничивает импорт и экспорт устройств кодиров а- ния речи. — Во Франции нет специального законодательства относительно импорта криптографии, но существуют з а- коны, касающиеся продажи и использования криптографии в стране . Продукты должны быть сертифици- рованы: либо они должны соответствовать опубликованным спецификациям, либо фирменная специф и- кация компании должна быть предоставлена правительству . Правительство может также затребовать два устройства для собственного использования . У компаний должна быть лицензия на продажу криптогр а- фии во Франции, в лицензии указывается рыночное назначение . У пользователей должна быть лицензия на покупку и использование криптографии, в лицензию включено положение о том, что пользователи должны быть готовы передать свои ключи правительству в течение четырех месяцев после использов а- ния. Это ограничение иногда допускает исключения : банков, больших компаний, и т.д. Для криптогра- фии, экспортируемой из США, лицензионные требования отсутствуют . — Германия следует положениям КОКОМ, требуя лицензировать экспорт криптографии . Проводится спе- циальный контроль общедоступного криптографического программного обеспечения . — В Израиле есть ограничения импорта, но, по видимому, никто не знает какие . — Бельгия, Италия, Япония, Нидерланды и Великобритания следуют положениям КОКОМ , требуя лицен- зировать экспорт криптографии. — В Бразилии, Индии, Мексике, России, Саудовской Аравии, Испании, Южной Африке, Швеции и Шве й- царии контроль экспорта или импорта криптографии отсутствует . 25.16 Правовые вопросы Являются ли цифровые подписи настоящими подписями ? Будут ли они признаны судом? Некоторые предва- рительные правовые исследования привели к мнению, что цифровые подписи будут соответствовать требован и- ям законных обязующих подписей для большей части применений , включая коммерческое использование, о п- ределенное в Едином своде законов о торговле (Uniform Commercial Code, UCC). Решение Управления по об- щей бухгалтерии (GAD, General Accounting Office), вынесенное по просьбе NIST, утверждает, что цифровые подписи соответствуют правовым стандартам для рукописных подписей [362]. Акт о цифровых подписях штата Юта вступил в действие 1 мая 1995 года, обеспечивая законную основу ис- пользования цифровых подписей в системе судопроизводства . Калифорния рассматривает соответствующий законопроект, а в Орегоне и Вашингтоне разрабатывают свои законы . Техас и Флорида дышат им в затылок. К моменту издания книги большинство штатов пройдет этот путь. Американская юридическая ассоциация (Отдел EDI и информационных технологий секции науки и техники ) разработала образец акта, который может быть использован штатами в процессе законотворчества . Акт пытает- ся вписать цифровые подписи в существующую для подписей правовую инфраструктуру : Единый свод законов о торговле, Законы Федеральной резервной системы Соединенных Штатов , общее право о контрактах и подпи- сях, Конвенция ООН по контрактам для международной продажи товаров и Конвенция ООН по международ- ным законам о комитетах по биржам и долговым обязательствам . В акт включены положения об ответственн о- сти и обязанностях сертифицирующих органов, вопросы ответственности , а также ограничения и политика. В Соединенных Штатах законы о подписях, контрактах и торговых операциях находятся в юрисдикции шт а- тов, поэтому этот акт-образец разработан для штатов . Окончательной целью является федеральный акт, но если все начинается на уровне штатов, у NSA меньше возможностей все испоганить. Даже при этом, пока правильность цифровых подписей не будет оспорена в суде, их правовой статус ост а- нется неопределенным. Для того, чтобы цифровые подписи обладали теми же идентификационными возможн о- стями, что и рукописные подписи, они сначала должны быть использованы для подписания законного , затем оспорены в суде одной из сторон. Тогда суд рассмотрит безопасность схемы подписи и вынесет решение . Спустя некоторое время, когда повторится подобный случай, решения о том, какие методы цифровой подписи и какие размеры ключей понадобятся, чтобы цифровая подпись была признана законной, будет вынесено на основе предыдущих решений. Возможно для этого потребуются годы. До тех пор, если два человека хотят использовать цифровые подписи для контракта(для заявок на покупку, для приказов по работе, и т.д.), рекомендуется, чтобы они подписали на бумаге контракт, с котором они согл а- шаются в будущем признавать любые документы, подписанные их цифровыми подписями [1099]. В этом доку- менте должны определяться алгоритм, размер ключа и все остальные параметры. В нем должен, к тому же, быть определен способ разрешения споров. Послесловие Мэтта Блейза Одним из самых опасных моментов криптологии (и, следовательно, данной книги ), является то, что вам поч- ти удается измерить ее. Знание длины ключей, способов разложения на множители и криптоаналитических м е- тодов позволяет оценить (в отсутствии настоящей теории проектирования шифров ) " коэффициент работы", не- обходимый для вскрытия конкретного шифра . Слишком велик соблазн неправильно использовать эти оценки в качестве общей меры безопасности систем . В реальном мире у взломщика есть куда больше возможностей, чем использование одного криптоанализа. Часто успех достигается с помощью вскрытий протоколов, троянских коней, вирусов, электромагнитного контроля, физической компрометации, шантажа и запугивания владельцев ключа, ошибок операционной системы и прикладных программ , аппаратных ошибок, ошибок пользователей, физического подслушивания, прикладной социологии, анализ содержимого свалок, и это далеко не все. Высококачественные шифры и протоколы являются важными средствами, но сами по себе они не заменяют реалистичных, критических размышлений о том, что действительно нужно защитить, и как могут быть взлом а- ны различные уровни обороны (взломщики, в конце концов, редко ограничиваются чистыми, хорошо опред е- ленными моделями научного мира). Росс Андерсон (Ross Anderson) приводит примеры криптографически сил ь- ных систем (в банковской индустрии), которые не устояли перед угрозами реального мира [43, 44]. Даже когда у взломщика есть доступ только к шифротексту , через кажущиеся незначительными бреши в других частях си с- темы может просочиться достаточно информации, чтобы сделать хорошую криптосистему бесполезной . Союз- ники во второй мировой войне взломали трафик немецкой Энигмы, главным образом тщательно используя ошибки операторов [1587]. NSA в ответ на вопрос, может ли правительство вскрывать DES, язвительно заметило, что реальные систе- мы настолько небезопасны, что об этом даже не стоит беспокоиться . К сожалению, не существует простых ре- цептов, как сделать систему безопасной, заменить тщательное проектирование и критический анализ невозмо ж- но. Хорошие криптосистемы делают жизнь взломщика намного труднее, чем жизнь законного пользователя, но это не так в отношении почти всех остальных аспектов безопасности компьютеров и систем связи . Рассмотрим следующие (наверняка не все) "Десять главных угроз безопасности реальных систем ", каждую из которых легче осуществить, чем предотвратить. 1. Печальное состояние программного обеспечения . Всем известно, что никто не знает, как писать пр о- граммное обеспечение. Современные системы сложны, включают сотни тысяч строк кода, любая из них может повредить безопасности. Из программных модулей, связанных с безопасностью извлекать ошибки еще труднее. 2. Неэффективная защита против вскрытий с отказом от услуг . В некоторых криптографических прото- колах допускается анонимность. Использование анонимных протоколов может быть особенно опа с- ным, если они увеличивают возможность неопознанного вандала нарушить предоставление услуги Поэтому анонимные системы должны быть особенно устойчивы к вскрытиям с отказом от услуг . В ус- тойчивых сетях поддерживать анонимность может быть легче - ведь вряд ли кого-то сильно волнует наличие миллионов анонимных входных точек в большинстве устойчивых сетей, таких как телефо н- ная сеть или почтовая система, где отдельному пользователю относительно трудно (или дорого) вы- звать крупномасштабные аварии. 3. Нет места для хранения секретов. Криптосистемы защищают большие секреты малыми (ключами) . К сожалению, современные компьютеры не особенно хороши для защиты даже маленьких секретов . Многопользовательские сетевые рабочие станции могут быть взломаны, а их память - скомпромет и- рована. Отдельно стоящие, однопользовательские машины могут быть украдены или скомпрометир о- ваны вирусами, которые организуют асинхронную утечку секретов . Удаленные серверы, где может и не быть пользователя, вводящего парольную фразу (но см. угрозу №5), представляют собой особенно трудную проблему. 4. Плохая генерация случайных чисел. Для ключей и сеансовых переменных нужны хорошие источники непредсказуемых битов. Энтропия работающего компьютера велика, но редкое приложение в состо я- нии правильно использовать ее. Было предложено множество методов получать истинно случайные числа программным образом (используются непредсказуемость времени выполнения операций ввода вывода, расхождения тактовой частоты и таймера , и даже турбулентность воздуха внутри корпуса твердого диска), но все они очень чувствительны к незначительным изменениям сред, в которых они используются. 5. Слабые парольные фразы. Большинство криптографического программного обеспечения решает пр о- блемы хранения и генерации ключей на основе создаваемых пользователем парольных фраз , которые считаются достаточно непредсказуемыми для генерации хорошего ключевого материала, и которые также легко запоминаются и поэтому не требуют безопасного хранения . В то время, как словарные вскрытия являются хорошо известной проблемой для коротких паролей , о способах вскрытия ключей, созданных на основе выбранных пользователями парольных фраз, известно мало . Шеннон показал, что энтропия английского текста чуть больше 1 бита на символ , что, по видимому, позволяет исполь- зовать против парольных фраз грубую силу . Однако пока не вполне понятно, для этого как упоряд о- чивать парольные фразы. Пока мы не разберемся как следует, как вскрывать парольные фразы, мы не поймем, насколько они слабы или сильны. 6. Неправильное доверие. Почти все доступное криптографическое программное обеспечение предпол а- гает, что пользователь находится в непосредственном контакте с системой ли пользуется надежным способом доступа. Например, интерфейсы к программам, подобным PGP, предполагают, что их па- рольные фразы поступают от пользователя по надежному пути, например, с локальной консоли . Но это не всегда так, рассмотрим проблему чтения вами шифрованной почты при подключении по сети . То, что проектировщик системы считает надежным, может не соответствовать потребностям или ож и- даниям реальных пользователей, особенно когда программным обеспечением можно управлять уд а- ленно по небезопасным каналам. 7. Плохо понимаемое взаимодействие протоколов и услуг . С ростом и усложнением систем часто прои с- ходят странные вещи, и бывает трудно что-нибудь понять что-нибудь, даже когда произойдет какая- нибудь авария. Червь Internet распространялся с помощью туманного и с виду вполне невинного сре д- ства программы передачи почты. Сколько еще возможностей и в каком количестве программ облад а- ют неожиданными следствиями, которые только ждут своего о ткрытия? 8. Нереалистичная оценка угрозы и риска. Эксперты по безопасности стремятся сконцентрировать свои усилия на угрозах, которые известно как моделировать и предотвращать . К сожалению, взломщики выполняют вскрытия на базе собственных знаний, и две эти области редко совпадают . Слишком мно- го "безопасных" систем было спроектировано без учета реально возможных действий взломщика . 9. Интерфейсы, которые делают безопасность дорогой и неудобной . Если нужно использовать средства обеспечения безопасности, то они должны быть удобными и достаточно прозрачными, чтобы люди действительно пользовались ими. Нетрудно спроектировать механизмы шифрования, которые раб о- тают только за счет производительности или простоты использования , и еще легче создать механизм, который провоцирует ошибки. Безопасность должно быть труднее выключить, чем включить ; к несча- стью, лишь немногие системы действительно так р аботают. 10. Слишком всеобъемлющие требования к безопасности . Эта проблема хорошо известна почти всем, чье счастье связано с продажей продуктов и услуг безопасности . Пока существует широко распространен- ное требование всеобъемлющей безопасности , средства и инфраструктура, обеспечивающие его ре а- лизацию, будут дороги и недоступны для многих приложений . Частично это проблема понимания и раскрытия угроз и опасностей в реальных приложениях, а частично проблема проектирования систем, в которых безопасность не закладывается изначально, а добавляется позже . Более полный список и обсуждение подобных угроз может легко заполнить книгу такого же размера, при этом проблема будет лишь едва затронута . Что делает их особенно трудными и опасными, так это то, что не существует никакого магического способа избавиться от них, кроме хорошего анализа и хорошей инженерной работы. Честолюбивый криптограф должен ощущать границы искусства . Мэтт Блейз Нью-Йорк Часть V Исходные коды 1. DES 2. LOKI91 3. IDEA 4. GOST 5. BLOWFISH 6. 3-WAY 7. RC5 8. A5 9. SEAL DES #define EN0 0 /* MODE == encrypt */ #define DE1 1 /* MODE == decrypt */ typedef struct { unsigned long ek[32]; unsigned long dk[32]; } des_ctx; extern void deskey(unsigned char *, short); /* hexkey[8] MODE * Sets the internal key register according to the hexadecimal * key contained in the 8 bytes of hexkey, according to the DES, * for encryption or decryption according to MODE. */ extern void usekey(unsigned long *); /* cookedkey[32] * Loads the internal key register with the data in cookedkey. */ extern void cpkey(unsigned long *); /* cookedkey[32] * Copies the contents of the internal key register into the storage * located at &cookedkey[0]. */ extern void des(unsigned char *, unsigned char *); /* from[8] to[8] * Encrypts/Decrypts (according to the key currently loaded in the * internal key register) one block of eight bytes at address 'from' * into the block at address 'to'. They can be the same. */ static void scrunch(unsigned char *, unsigned long *); static void unscrun(unsigned long *, unsigned char *); static void desfunc(unsigned long *, unsigned long *); static void cookey(unsigned long *); static unsigned long KnL[32] = { 0L }; static unsigned long KnR[32] = { 0L }; static unsigned long Kn3[32] = { 0L }; static unsigned char Df_Key[24] = { 0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef, 0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10, 0x89,0xab,0xcd,0xef,0x01,0x23,0x45,0x67 }; static unsigned short bytebit[8] = { 0200, 0100, 040, 020, 010, 04, 02, 01 }; static unsigned long bigbyte[24] = { 0x800000L, 0x400000L, 0x200000L, 0x100000L, 0x80000L, 0x40000L, 0x20000L, 0x10000L, 0x8000L, 0x4000L, 0x2000L, 0x1000L, 0x800L, 0x400L, 0x200L, 0x100L, 0x80L, 0x40L, 0x20L, 0x10L, 0x8L, 0x4L, 0x2L, 0x1L }; /* Use the key schedule specified in the Standard (ANSI X3.92-1981). */ static unsigned char pc1[56] = { 56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 60, 52, 44, 36, 28, 20, 12, 4, 27, 19, 11, 3 }; static unsigned char totrot[16] = { 1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28 }; static unsigned char pc2[48] = { 13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9, 22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1, 40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47, 43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31 }; void deskey(key, edf) /* Thanks to James Gillogly & Phil Karn! */ unsigned char *key; short edf; { register int i, j, l, m, n; unsigned char pc1m[56], pcr[56]; unsigned long kn[32]; for ( j = 0; j < 56; j++ ) { l = pc1[j]; m = l & 07; pc1m[j] = (key[l >> 3] & bytebit[m]) ? 1 : 0; } for( i = 0; i < 16; i++ ) { if( edf == DE1 ) m = (15 - i) << 1; else m = i << 1; n = m + 1; kn[m] = kn[n] = 0L; for( j = 0; j < 28; j++ ) { l = j + totrot[i]; if( l < 28 ) pcr[j] = pc1m[l]; else pcr[j] = pc1m[l - 28]; } for( j = 28; j < 56; j++ ) { l = j + totrot[i]; if( l < 56 ) pcr[j] = pc1m[l]; else pcr[j] = pc1m[l - 28]; } for( j = 0; j < 24; j++ ) { if( pcr[pc2[j]] ) kn[m] |= bigbyte[j]; if( pcr[pc2[j+24]] ) kn[n] |= bigbyte[j]; } } cookey(kn); return; } static void cookey(raw1) register unsigned long *raw1; { register unsigned long *cook, *raw0; unsigned long dough[32]; register int i; cook = dough; for( i = 0; i < 16; i++, raw1++ ) { raw0 = raw1++; *cook = (*raw0 & 0x00fc0000L) << 6; *cook |= (*raw0 & 0x00000fc0L) << 10; *cook |= (*raw1 & 0x00fc0000L) >> 10; *cook++ |= (*raw1 & 0x00000fc0L) >> 6; *cook = (*raw0 & 0x0003f000L) << 12; *cook |= (*raw0 & 0x0000003fL) << 16; *cook |= (*raw1 & 0x0003f000L) >> 4; *cook++ |= (*raw1 & 0x0000003fL); } usekey(dough); return; } void cpkey(into) register unsigned long *into; { register unsigned long *from, *endp; from = KnL, endp = &KnL[32]; while( from < endp ) *into++ = *from++; return; } void usekey(from) register unsigned long *from; { register unsigned long *to, *endp; to = KnL, endp = &KnL[32]; while( to < endp ) *to++ = *from++; return; } void des(inblock, outblock) unsigned char *inblock, *outblock; { unsigned long work[2]; scrunch(inblock, work); desfunc(work, KnL); unscrun(work, outblock); return; } static void scrunch(outof, into) register unsigned char *outof; register unsigned long *into; { *into = (*outof++ & 0xffL) << 24; *into |= (*outof++ & 0xffL) << 16; *into |= (*outof++ & 0xffL) << 8; *into++ |= (*outof++ & 0xffL); *into = (*outof++ & 0xffL) << 24; *into |= (*outof++ & 0xffL) << 16; *into |= (*outof++ & 0xffL) << 8; *into |= (*outof & 0xffL); return; } static void unscrun(outof, into) register unsigned long *outof; register unsigned char *into; { *into++ = (*outof >> 24) & 0xffL; *into++ = (*outof >> 16) & 0xffL; *into++ = (*outof >> 8) & 0xffL; *into++ = *outof++ & 0xffL; *into++ = (*outof >> 24) & 0xffL; *into++ = (*outof >> 16) & 0xffL; *into++ = (*outof >> 8) & 0xffL; *into = *outof & 0xffL; return; } static unsigned long SP1[64] = { 0x01010400L, 0x00000000L, 0x00010000L, 0x01010404L, 0x01010004L, 0x00010404L, 0x00000004L, 0x00010000L, 0x00000400L, 0x01010400L, 0x01010404L, 0x00000400L, 0x01000404L, 0x01010004L, 0x01000000L, 0x00000004L, 0x00000404L, 0x01000400L, 0x01000400L, 0x00010400L, 0x00010400L, 0x01010000L, 0x01010000L, 0x01000404L, 0x00010004L, 0x01000004L, 0x01000004L, 0x00010004L, 0x00000000L, 0x00000404L, 0x00010404L, 0x01000000L, 0x00010000L, 0x01010404L, 0x00000004L, 0x01010000L, 0x01010400L, 0x01000000L, 0x01000000L, 0x00000400L, 0x01010004L, 0x00010000L, 0x00010400L, 0x01000004L, 0x00000400L, 0x00000004L, 0x01000404L, 0x00010404L, 0x01010404L, 0x00010004L, 0x01010000L, 0x01000404L, 0x01000004L, 0x00000404L, 0x00010404L, 0x01010400L, 0x00000404L, 0x01000400L, 0x01000400L, 0x00000000L, 0x00010004L, 0x00010400L, 0x00000000L, 0x01010004L }; static unsigned long SP2[64] = { 0x80108020L, 0x80008000L, 0x00008000L, 0x00108020L, 0x00100000L, 0x00000020L, 0x80100020L, 0x80008020L, 0x80000020L, 0x80108020L, 0x80108000L, 0x80000000L, 0x80008000L, 0x00100000L, 0x00000020L, 0x80100020L, 0x00108000L, 0x00100020L, 0x80008020L, 0x00000000L, 0x80000000L, 0x00008000L, 0x00108020L, 0x80100000L, 0x00100020L, 0x80000020L, 0x00000000L, 0x00108000L, 0x00008020L, 0x80108000L, 0x80100000L, 0x00008020L, 0x00000000L, 0x00108020L, 0x80100020L, 0x00100000L, 0x80008020L, 0x80100000L, 0x80108000L, 0x00008000L, 0x80100000L, 0x80008000L, 0x00000020L, 0x80108020L, 0x00108020L, 0x00000020L, 0x00008000L, 0x80000000L, 0x00008020L, 0x80108000L, 0x00100000L, 0x80000020L, 0x00100020L, 0x80008020L, 0x80000020L, 0x00100020L, 0x00108000L, 0x00000000L, 0x80008000L, 0x00008020L, 0x80000000L, 0x80100020L, 0x80108020L, 0x00108000L }; static unsigned long SP3[64] = { 0x00000208L, 0x08020200L, 0x00000000L, 0x08020008L, 0x08000200L, 0x00000000L, 0x00020208L, 0x08000200L, 0x00020008L, 0x08000008L, 0x08000008L, 0x00020000L, 0x08020208L, 0x00020008L, 0x08020000L, 0x00000208L, 0x08000000L, 0x00000008L, 0x08020200L, 0x00000200L, 0x00020200L, 0x08020000L, 0x08020008L, 0x00020208L, 0x08000208L, 0x00020200L, 0x00020000L, 0x08000208L, 0x00000008L, 0x08020208L, 0x00000200L, 0x08000000L, 0x08020200L, 0x08000000L, 0x00020008L, 0x00000208L, 0x00020000L, 0x08020200L, 0x08000200L, 0x00000000L, 0x00000200L, 0x00020008L, 0x08020208L, 0x08000200L, 0x08000008L, 0x00000200L, 0x00000000L, 0x08020008L, 0x08000208L, 0x00020000L, 0x08000000L, 0x08020208L, 0x00000008L, 0x00020208L, 0x00020200L, 0x08000008L, 0x08020000L, 0x08000208L, 0x00000208L, 0x08020000L, 0x00020208L, 0x00000008L, 0x08020008L, 0x00020200L }; static unsigned long SP4[64] = { 0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L, 0x00802080L, 0x00800081L, 0x00800001L, 0x00002001L, 0x00000000L, 0x00802000L, 0x00802000L, 0x00802081L, 0x00000081L, 0x00000000L, 0x00800080L, 0x00800001L, 0x00000001L, 0x00002000L, 0x00800000L, 0x00802001L, 0x00000080L, 0x00800000L, 0x00002001L, 0x00002080L, 0x00800081L, 0x00000001L, 0x00002080L, 0x00800080L, 0x00002000L, 0x00802080L, 0x00802081L, 0x00000081L, 0x00800080L, 0x00800001L, 0x00802000L, 0x00802081L, 0x00000081L, 0x00000000L, 0x00000000L, 0x00802000L, 0x00002080L, 0x00800080L, 0x00800081L, 0x00000001L, 0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L, 0x00802081L, 0x00000081L, 0x00000001L, 0x00002000L, 0x00800001L, 0x00002001L, 0x00802080L, 0x00800081L, 0x00002001L, 0x00002080L, 0x00800000L, 0x00802001L, 0x00000080L, 0x00800000L, 0x00002000L, 0x00802080L }; static unsigned long SP5[64] = { 0x00000100L, 0x02080100L, 0x02080000L, 0x42000100L, 0x00080000L, 0x00000100L, 0x40000000L, 0x02080000L, 0x40080100L, 0x00080000L, 0x02000100L, 0x40080100L, 0x42000100L, 0x42080000L, 0x00080100L, 0x40000000L, 0x02000000L, 0x40080000L, 0x40080000L, 0x00000000L, 0x40000100L, 0x42080100L, 0x42080100L, 0x02000100L, 0x42080000L, 0x40000100L, 0x00000000L, 0x42000000L, 0x02080100L, 0x02000000L, 0x42000000L, 0x00080100L, 0x00080000L, 0x42000100L, 0x00000100L, 0x02000000L, 0x40000000L, 0x02080000L, 0x42000100L, 0x40080100L, 0x02000100L, 0x40000000L, 0x42080000L, 0x02080100L, 0x40080100L, 0x00000100L, 0x02000000L, 0x42080000L, 0x42080100L, 0x00080100L, 0x42000000L, 0x42080100L, 0x02080000L, 0x00000000L, 0x40080000L, 0x42000000L, 0x00080100L, 0x02000100L, 0x40000100L, 0x00080000L, 0x00000000L, 0x40080000L, 0x02080100L, 0x40000100L }; static unsigned long SP6[64] = { 0x20000010L, 0x20400000L, 0x00004000L, 0x20404010L, 0x20400000L, 0x00000010L, 0x20404010L, 0x00400000L, 0x20004000L, 0x00404010L, 0x00400000L, 0x20000010L, 0x00400010L, 0x20004000L, 0x20000000L, 0x00004010L, 0x00000000L, 0x00400010L, 0x20004010L, 0x00004000L, 0x00404000L, 0x20004010L, 0x00000010L, 0x20400010L, 0x20400010L, 0x00000000L, 0x00404010L, 0x20404000L, 0x00004010L, 0x00404000L, 0x20404000L, 0x20000000L, 0x20004000L, 0x00000010L, 0x20400010L, 0x00404000L, 0x20404010L, 0x00400000L, 0x00004010L, 0x20000010L, 0x00400000L, 0x20004000L, 0x20000000L, 0x00004010L, 0x20000010L, 0x20404010L, 0x00404000L, 0x20400000L, 0x00404010L, 0x20404000L, 0x00000000L, 0x20400010L, 0x00000010L, 0x00004000L, 0x20400000L, 0x00404010L, 0x00004000L, 0x00400010L, 0x20004010L, 0x00000000L, 0x20404000L, 0x20000000L, 0x00400010L, 0x20004010L }; static unsigned long SP7[64] = { 0x00200000L, 0x04200002L, 0x04000802L, 0x00000000L, 0x00000800L, 0x04000802L, 0x00200802L, 0x04200800L, 0x04200802L, 0x00200000L, 0x00000000L, 0x04000002L, 0x00000002L, 0x04000000L, 0x04200002L, 0x00000802L, 0x04000800L, 0x00200802L, 0x00200002L, 0x04000800L, 0x04000002L, 0x04200000L, 0x04200800L, 0x00200002L, 0x04200000L, 0x00000800L, 0x00000802L, 0x04200802L, 0x00200800L, 0x00000002L, 0x04000000L, 0x00200800L, 0x04000000L, 0x00200800L, 0x00200000L, 0x04000802L, 0x04000802L, 0x04200002L, 0x04200002L, 0x00000002L, 0x00200002L, 0x04000000L, 0x04000800L, 0x00200000L, 0x04200800L, 0x00000802L, 0x00200802L, 0x04200800L, 0x00000802L, 0x04000002L, 0x04200802L, 0x04200000L, 0x00200800L, 0x00000000L, 0x00000002L, 0x04200802L, 0x00000000L, 0x00200802L, 0x04200000L, 0x00000800L, 0x04000002L, 0x04000800L, 0x00000800L, 0x00200002L }; static unsigned long SP8[64] = { 0x10001040L, 0x00001000L, 0x00040000L, 0x10041040L, 0x10000000L, 0x10001040L, 0x00000040L, 0x10000000L, 0x00040040L, 0x10040000L, 0x10041040L, 0x00041000L, 0x10041000L, 0x00041040L, 0x00001000L, 0x00000040L, 0x10040000L, 0x10000040L, 0x10001000L, 0x00001040L, 0x00041000L, 0x00040040L, 0x10040040L, 0x10041000L, 0x00001040L, 0x00000000L, 0x00000000L, 0x10040040L, 0x10000040L, 0x10001000L, 0x00041040L, 0x00040000L, 0x00041040L, 0x00040000L, 0x10041000L, 0x00001000L, 0x00000040L, 0x10040040L, 0x00001000L, 0x00041040L, 0x10001000L, 0x00000040L, 0x10000040L, 0x10040000L, 0x10040040L, 0x10000000L, 0x00040000L, 0x10001040L, 0x00000000L, 0x10041040L, 0x00040040L, 0x10000040L, 0x10040000L, 0x10001000L, 0x10001040L, 0x00000000L, 0x10041040L, 0x00041000L, 0x00041000L, 0x00001040L, 0x00001040L, 0x00040040L, 0x10000000L, 0x10041000L }; static void desfunc(block, keys) register unsigned long *block, *keys; { register unsigned long fval, work, right, leftt; register int round; leftt = block[0]; right = block[1]; work = ((leftt >> 4) ^ right) & 0x0f0f0f0fL; right ^= work; leftt ^= (work << 4); work = ((leftt >> 16) ^ right) & 0x0000ffffL; right ^= work; leftt ^= (work << 16); work = ((right >> 2) ^ leftt) & 0x33333333L; leftt ^= work; right ^= (work << 2); work = ((right >> 8) ^ leftt) & 0x00ff00ffL; leftt ^= work; right ^= (work << 8); right = ((right << 1) | ((right >> 31) & 1L)) & 0xffffffffL; work = (leftt ^ right) & 0xaaaaaaaaL; leftt ^= work; right ^= work; leftt = ((leftt << 1) | ((leftt >> 31) & 1L)) & 0xffffffffL; for( round = 0; round < 8; round++ ) { work = (right << 28) | (right >> 4); work ^= *keys++; fval = SP7[ work & 0x3fL]; fval |= SP5[(work >> 8) & 0x3fL]; fval |= SP3[(work >> 16) & 0x3fL]; fval |= SP1[(work >> 24) & 0x3fL]; work = right ^ *keys++; fval |= SP8[ work & 0x3fL]; fval |= SP6[(work >> 8) & 0x3fL]; fval |= SP4[(work >> 16) & 0x3fL]; fval |= SP2[(work >> 24) & 0x3fL]; leftt ^= fval; work = (leftt << 28) | (leftt >> 4); work ^= *keys++; fval = SP7[ work & 0x3fL]; fval |= SP5[(work >> 8) & 0x3fL]; fval |= SP3[(work >> 16) & 0x3fL]; fval |= SP1[(work >> 24) & 0x3fL]; work = leftt ^ *keys++; fval |= SP8[ work & 0x3fL]; fval |= SP6[(work >> 8) & 0x3fL]; fval |= SP4[(work >> 16) & 0x3fL]; fval |= SP2[(work >> 24) & 0x3fL]; right ^= fval; } right = (right << 31) | (right >> 1); work = (leftt ^ right) & 0xaaaaaaaaL; leftt ^= work; right ^= work; leftt = (leftt << 31) | (leftt >> 1); work = ((leftt >> 8) ^ right) & 0x00ff00ffL; right ^= work; leftt ^= (work << 8); work = ((leftt >> 2) ^ right) & 0x33333333L; right ^= work; leftt ^= (work << 2); work = ((right >> 16) ^ leftt) & 0x0000ffffL; leftt ^= work; right ^= (work << 16); work = ((right >> 4) ^ leftt) & 0x0f0f0f0fL; leftt ^= work; right ^= (work << 4); *block++ = right; *block = leftt; return; } /* Validation sets: * * Single-length key, single-length plaintext - * Key : 0123 4567 89ab cdef * Plain : 0123 4567 89ab cde7 * Cipher : c957 4425 6a5e d31d * **********************************************************************/ void des_key(des_ctx *dc, unsigned char *key){ deskey(key,EN0); cpkey(dc->ek); deskey(key,DE1); cpkey(dc->dk); } /* Encrypt several blocks in ECB mode. Caller is responsible for short blocks. */ void des_enc(des_ctx *dc, unsigned char *data, int blocks){ unsigned long work[2]; int i; unsigned char *cp; cp = data; for(i=0;i desfunc(work,dc->ek); unscrun(work,cp); cp+=8; } } void des_dec(des_ctx *dc, unsigned char *data, int blocks){ unsigned long work[2]; int i; unsigned char *cp; cp = data; for(i=0;i desfunc(work,dc->dk); unscrun(work,cp); cp+=8; } } void main(void){ des_ctx dc; int i; unsigned long data[10]; char *cp,key[8] = {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef}; char x[8] = {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xe7}; cp = x; des_key(&dc,key); des_enc(&dc,cp,1); printf("Enc(0..7,0..7) = "); for(i=0;i<8;i++) printf("%02x ", ((unsigned int) cp[i])&0x00ff); printf("\n"); des_dec(&dc,cp,1); printf("Dec(above,0..7) = "); for(i=0;i<8;i++) printf("%02x ",((unsigned int)cp[i])&0x00ff); printf("\n"); cp = (char *) data; for(i=0;i<10;i++)data[i]=i; des_enc(&dc,cp,5); /* Enc 5 blocks. */ for(i=0;i<10;i+=2) printf("Block %01d = %08lx %08lx.\n", i/2,data[i],data[i+1]); des_dec(&dc,cp,1); des_dec(&dc,cp+8,4); for(i=0;i<10;i+=2) printf("Block %01d = %08lx %08lx.\n", i/2,data[i],data[i+1]); } LOKI91 #include #define LOKIBLK 8 /* No of bytes in a LOKI data-block */ #define ROUNDS 16 /* No of LOKI rounds */ typedef unsigned long Long; /* type specification for aligned LOKI blocks */ extern Long lokikey[2]; /* 64-bit key used by LOKI routines */ extern char *loki_lib_ver; /* String with version no. & copyright */ #ifdef __STDC__ /* declare prototypes for library functions */ extern void enloki(char *b); extern void deloki(char *b); extern void setlokikey(char key[LOKIBLK]); #else /* else just declare library functions extern */ extern void enloki(), deloki(), setlokikey(); #endif __STDC__ char P[32] = { 31, 23, 15, 7, 30, 22, 14, 6, 29, 21, 13, 5, 28, 20, 12, 4, 27, 19, 11, 3, 26, 18, 10, 2, 25, 17, 9, 1, 24, 16, 8, 0 }; typedef struct { short gen; /* irreducible polynomial used in this field */ short exp; /* exponent used to generate this s function */ } sfn_desc; sfn_desc sfn[] = { { /* 101110111 */ 375, 31}, { /* 101111011 */ 379, 31}, { /* 110000111 */ 391, 31}, { /* 110001011 */ 395, 31}, { /* 110001101 */ 397, 31}, { /* 110011111 */ 415, 31}, { /* 110100011 */ 419, 31}, { /* 110101001 */ 425, 31}, { /* 110110001 */ 433, 31}, { /* 110111101 */ 445, 31}, { /* 111000011 */ 451, 31}, { /* 111001111 */ 463, 31}, { /* 111010111 */ 471, 31}, { /* 111011101 */ 477, 31}, { /* 111100111 */ 487, 31}, { /* 111110011 */ 499, 31}, { 00, 00} }; typedef struct { Long loki_subkeys[ROUNDS]; } loki_ctx; static Long f(); /* declare LOKI function f */ static short s(); /* declare LOKI S-box fn s */ #define ROL12(b) b = ((b << 12) | (b >> 20)); #define ROL13(b) b = ((b << 13) | (b >> 19)); #ifdef LITTLE_ENDIAN #define bswap(cb) { \ register char c; \ c = cb[0]; cb[0] = cb[3]; cb[3] = c; \ c = cb[1]; cb[1] = cb[2]; cb[2] = c; \ c = cb[4]; cb[4] = cb[7]; cb[7] = c; \ c = cb[5]; cb[5] = cb[6]; cb[6] = c; \ } #endif void setlokikey(loki_ctx *c, char *key) { register i; register Long KL, KR; #ifdef LITTLE_ENDIAN bswap(key); /* swap bytes round if little-endian */ #endif KL = ((Long *)key)[0]; KR = ((Long *)key)[1]; for (i=0; i ROL12 (KL); c->loki_subkeys[i+1] = KL; ROL13 (KL); c->loki_subkeys[i+2] = KR; ROL12 (KR); c->loki_subkeys[i+3] = KR; ROL13 (KR); } #ifdef LITTLE_ENDIAN bswap(key); /* swap bytes back if little-endian */ #endif } void enloki (loki_ctx *c, char *b) { register i; register Long L, R; /* left & right data halves */ #ifdef LITTLE_ENDIAN bswap(b); /* swap bytes round if little-endian */ #endif L = ((Long *)b)[0]; R = ((Long *)b)[1]; for (i=0; i L ^= f (R, c->loki_subkeys[i]); R ^= f (L, c->loki_subkeys[i+1]); } ((Long *)b)[0] = R; /* Y = swap(LR) */ ((Long *)b)[1] = L; #ifdef LITTLE_ENDIAN bswap(b); /* swap bytes round if little-endian */ #endif } void deloki(loki_ctx *c, char *b) { register i; register Long L, R; /* left & right data halves */ #ifdef LITTLE_ENDIAN bswap(b); /* swap bytes round if little-endian */ #endif L = ((Long *)b)[0]; /* LR = X XOR K */ R = ((Long *)b)[1]; for (i=ROUNDS; i>0; i-=2) { /* subkeys in reverse order */ L ^= f(R, c->loki_subkeys[i-1]); R ^= f(L, c->loki_subkeys[i-2]); } ((Long *)b)[0] = R; /* Y = LR XOR K */ ((Long *)b)[1] = L; } #define MASK12 0x0fff /* 12 bit mask for expansion E */ static Long f(r, k) register Long r; /* Data value R(i-1) */ Long k; /* Key K(i) */ { Long a, b, c; /* 32 bit S-box output, & P output */ a = r ^ k; /* A = R(i-1) XOR K(i) */ /* want to use slow speed/small size version */ b = ((Long)s((a & MASK12)) ) | /* B = S(E(R(i-1))^K(i)) */ ((Long)s(((a >> 8) & MASK12)) << 8) | ((Long)s(((a >> 16) & MASK12)) << 16) | ((Long)s((((a >> 24) | (a << 8)) & MASK12)) << 24); perm32(&c, &b, P); /* C = P(S( E(R(i-1)) XOR K(i))) */ return(c); /* f returns the result C */ } static short s(i) register Long i; /* return S-box value for input i */ { register short r, c, v, t; short exp8(); /* exponentiation routine for GF(2^8) */ r = ((i>>8) & 0xc) | (i & 0x3); /* row value-top 2 & bottom 2 */ c = (i>>2) & 0xff; /* column value-middle 8 bits */ t = (c + ((r * 17) ^ 0xff)) & 0xff; /* base value for Sfn */ v = exp8(t, sfn[r].exp, sfn[r].gen); /* Sfn[r] = t ^ exp mod gen */ return(v); } #define MSB 0x80000000L /* MSB of 32-bit word */ perm32(out, in , perm) Long *out; /* Output 32-bit block to be permuted */ Long *in; /* Input 32-bit block after permutation */ char perm[32]; /* Permutation array */ { Long mask = MSB; /* mask used to set bit in output */ register int i, o, b; /* input bit no, output bit no, value */ register char *p = perm; /* ptr to permutation array */ *out = 0; /* clear output block */ for (o=0; o<32; o++) { /* For each output bit position o */ i =(int)*p++; /* get input bit permuted to output o */ b = (*in >> i) & 01; /* value of input bit i */ if (b) /* If the input bit i is set */ *out |= mask; /* OR in mask to output i */ mask >>= 1; /* Shift mask to next bit */ } } #define SIZE 256 /* 256 elements in GF(2^8) */ short mult8(a, b, gen) short a, b; /* operands for multiply */ short gen; /* irreducible polynomial generating Galois Field */ { short product = 0; /* result of multiplication */ while(b != 0) { /* while multiplier is non-zero */ if (b & 01) product ^= a; /* add multiplicand if LSB of b set */ a <<= 1; /* shift multiplicand one place */ if (a >= SIZE) a ^= gen; /* and modulo reduce if needed */ b >>= 1; /* shift multiplier one place */ } return(product); } short exp8(base, exponent, gen) short base; /* base of exponentiation */ short exponent; /* exponent */ short gen; /* irreducible polynomial generating Galois Field */ { short accum = base; /* superincreasing sequence of base */ short result = 1; /* result of exponentiation */ if (base == 0) /* if zero base specified then */ return(0); /* the result is "0" if base = 0 */ while (exponent != 0) { /* repeat while exponent non-zero */ if (( exponent & 0x0001) == 0x0001) /* multiply if exp 1 */ result = mult8(result, accum, gen); exponent >>= 1; /* shift exponent to next digit */ accum = mult8(accum, accum, gen); /* & square */ } return(result); } void loki_key(loki_ctx *c, unsigned char *key){ setlokikey(c,key); } void loki_enc(loki_ctx *c, unsigned char *data, int blocks){ unsigned char *cp; int i; cp = data; for(i=0;i cp+=8; } } void loki_dec(loki_ctx *c, unsigned char *data, int blocks){ unsigned char *cp; int i; cp = data; for(i=0;i cp+=8; } } void main(void){ loki_ctx lc; unsigned long data[10]; unsigned char *cp; unsigned char key[] = {0,1,2,3,4,5,6,7}; int i; for(i=0;i<10;i++) data[i]=i; loki_key(&lc,key); cp = (char *)data; loki_enc(&lc,cp,5); for(i=0;i<10;i+=2) printf("Block %01d = %08lx %08lx\n", i/2,data[i],data[i+1]); loki_dec(&lc,cp,1); loki_dec(&lc,cp+8,4); for(i=0;i<10;i+=2) printf("Block %01d = %08lx %08lx\n", i/2,data[i],data[i+1]); } IDEA typedef unsigned char boolean; /* values are TRUE or FALSE */ typedef unsigned char byte; /* values are 0-255 */ typedef byte *byteptr; /* pointer to byte */ typedef char *string;/* pointer to ASCII character string */ typedef unsigned short word16; /* values are 0-65535 */ typedef unsigned long word32; /* values are 0-4294967295 */ #ifndef TRUE #define FALSE 0 #define TRUE (!FALSE) #endif /* if TRUE not already defined */ #ifndef min /* if min macro not already defined */ #define min(a,b) ( (a)<(b) ? (a) : (b) ) #define max(a,b) ( (a)>(b) ? (a) : (b) ) #endif /* if min macro not already defined */ #define IDEAKEYSIZE 16 #define IDEABLOCKSIZE 8 #define IDEAROUNDS 8 #define IDEAKEYLEN (6*IDEAROUNDS+4) typedef struct{ word16 ek[IDEAKEYLEN],dk[IDEAKEYLEN]; }idea_ctx; /* End includes for IDEA.C */ #ifdef IDEA32 /* Use >16-bit temporaries */ #define low16(x) ((x) & 0xFFFF) typedef unsigned int uint16;/* at LEAST 16 bits, maybe more */ #else #define low16(x) (x) /* this is only ever applied to uint16's */ typedef word16 uint16; #endif #ifdef SMALL_CACHE static uint16 mul(register uint16 a, register uint16 b) { register word32 p; p = (word32)a * b; if (p) { b = low16(p); a = p>>16; return (b - a) + (b < a); } else if (a) { return 1-b; } else { return 1-a; } } /* mul */ #endif /* SMALL_CACHE */ static uint16 mulInv(uint16 x) { uint16 t0, t1; uint16 q, y; if (x <= 1) return x; /* 0 and 1 are self-inverse */ t1 = 0x10001L / x; /* Since x >= 2, this fits into 16 bits */ y = 0x10001L % x; if (y == 1) return low16(1-t1); t0 = 1; do { q = x / y; x = x % y; t0 += q * t1; if (x == 1) return t0; q = y / x; y = y % x; t1 += q * t0; } while (y != 1); return low16(1-t1); } /* mukInv */ static void ideaExpandKey(byte const *userkey, word16 *EK) { int i,j; for (j=0; j<8; j++) { EK[j] = (userkey[0]<<8) + userkey[1]; userkey += 2; } for (i=0; j < IDEAKEYLEN; j++) { i++; EK[i+7] = EK[i & 7] << 9 | EK[i+1 & 7] >> 7; EK += i & 8; i &= 7; } } /* ideaExpandKey */ static void ideaInvertKey(word16 const *EK, word16 DK[IDEAKEYLEN]) { int i; uint16 t1, t2, t3; word16 temp[IDEAKEYLEN]; word16 *p = temp + IDEAKEYLEN; t1 = mulInv(*EK++); t2 = -*EK++; t3 = -*EK++; *--p = mulInv(*EK++); *--p = t3; *--p = t2; *--p = t1; for (i = 0; i < IDEAROUNDS-1; i++) { t1 = *EK++; *--p = *EK++; *--p = t1; t1 = mulInv(*EK++); t2 = -*EK++; t3 = -*EK++; *--p = mulInv(*EK++); *--p = t2; *--p = t3; *--p = t1; } t1 = *EK++; *--p = *EK++; *--p = t1; t1 = mulInv(*EK++); t2 = -*EK++; t3 = -*EK++; *--p = mulInv(*EK++); *--p = t3; *--p = t2; *--p = t1; /* Copy and destroy temp copy */ memcpy(DK, temp, sizeof(temp)); for(i=0;i |