340 likes | 700 Views
ОСНОВЫ КРИПТОГРАФИИ. ( продолжение ). Криптография и .NET Framework.
E N D
ОСНОВЫ КРИПТОГРАФИИ (продолжение)
Криптография и .NET Framework Библиотека классов .NET Framework предусматривает пространство имен System.Security.Cryptography, в котором поддержано большинство основных симметричных и асимметричных шифров, а также несколько хеш-алгоритмов и гeнepaтop случайных чисел криптографическоrо качества. Эта криптогpафическая основа может быть расширена, поскольку в форме «поставщиков услyг криптогpафии» сюда можно подключить модули сторонних производителей. Пространство имен System.Security.Cryptography.XМL реализует стандарт W3C на цифровую подпись ХМL объектов, а пространство имен System.Security.Cryptography.X509Certificates обеспечивает поддержку манипуляций с публичными сертификатами.
System.Security.Cryptography • DES: Digital Encryption Standard (Стандарт цифрового шифрования, симметричный блочный шифр). • 3DES: Тройной DES (симметричный блочный шифр, более сильная альтернатива DES). • Rijndael: AES (симметричный блочный шифр). • RC2: Шифр, изобретенный Рональдом Ривестом (Ronald Rivest) -симметричный потоковый шифр. • RSA: Шифр, созданный Ривестом, Шамиром и Адлеманом (Rivest, Shamir, Adleman) - асимметричный алгоритм, используемый oдновременно, как шифр, и как электронная подпись. • MD5: хеш-алгоритм, алгoритм для создания электронного «отпечатка пальца», разработанный Ривестом. • SHA1, SHA256, SHA384, SHA512: алгоритмы хеширования, разработанные институтом NIST (National Institute of Standards and Technology - Национальный институт стандартов и технологии) совместно с NSA, для использования совместно с DSS (Digital Signature Standard - Стандарт электронной подписи). • гeнepaтop псевдослучайный чисел (PRNG). • XML Signatures: цифровые подписи для ХМL данных. • Х.509: стандарт публичных сертификатов.
Симметричная криптография • Хорст Файстель (Horst Feistel), работавший в IВM в начале 1970x, разработал симметричный блочный шифр, который впоследствии превратился в стандарт шифрования данных DES. • В стандарте DES одни и те же алгоритмы и 56-битовые ключи используются, как для шифрования, так и для дешифрования. Основу aлгоритма DES составляют 16 повторяющихся циклов, каждый из которых включает в себя подстановку с последующей перестановкой в пределах 64-битовоrо блока данных. • Цель перестановок состоит в «перемешивании» и диффузии исходных данных, но все преобразования, разумеется, обратимы. • Подстановка еще более усложняет зависимости между исходным и шифрованным текстами. В результате все статистические неоднородности исходного текста оказываются в шифрованном тексте сглаженными.
Симметричная криптография Поскольку входные данные, вообще говоря, не обязательно кратны размеру 64-битового блока, их разбивают на 64-битовые блоки, дополняя при необходимости незначащими байтами. Каждый цикл aлгоритма DES состоит в разделении 64-битовоrо блока входных данных на два 32-битовых подблока. Правая половина шифруется при помощи специальной функции, при этом используется подмножество ключа, уникальное для данного цикла. Затем зашифрованная правая половина объединяется с левой половиной операцией XOR, образуя в результате новую правую половину для следующего цикла. Прежняя правая половина в очередном цикле заменяется левой.
Структура одиночного цикла алгоритма DES
Симметричные алгоритмы В .NET Framework предусмотрены следующие классы для работы с симметричными алгоритмами: • System.Security.Cryptography.DES; • System.Security.Cryptography.RC2; • System.Security.Cryptography.Rijndael; • System.Security.Cryptography.TripleDES.
Асимметричная криптография • Асимметричная криптогpафия родилась на свет в тот момент, когда Уитфилд Диффи (Whitfield Diffie) и Мартин Е. Хеллман (Martin Е. Hellman) опубликовали статью «Новые направления в криптогpафии» в 1976 году • Собственно говоря, можно только удивляться тому, что асимметричная криптография не была изобретена много раньше, учитывая тот факт, что она решает такие застарелые проблемы, как безопасность обмена ключами и возможность неподготовленноrо обмена секретными сообщениями. • Асимметричная криптография использует модульную арифметику и теорию простых чисел для тoгo, чтобы создать два отдельных ключа. Один ключ при этом используется для шифрования, а второй длярасшифровки. Вместе они составляют пару ключей. • Хотя оба ключа в математическом смысле очень глубоко между собой связаны, чрезвычайно трудно вычислить один ключ по другому. Один из ключей делается публично доступным («открытый ключ»), второй сохраняется в строжайшем секрете («секретный ключ»).
Асимметричная криптография • Обычная секретность может быть достигнута, если зашифровать сообщение открытым ключом, а для pacшифровки использовать секретный ключ. • Но вот вторая сторона монеты: можно решить проблемы аутентификации, целостности и подтверждения обязательств, если использовать для шифрования секретный ключ, а расшифровывать сообщения открытым ключом. • В любом случае асимметричная криптография основывается на идее односторонней функции с «черным ходом» - это любая функция, которая легко вычисляется в прямом направлении и крайне трудно вычислима в направлении обратном. • Иными словами, при заданном «х» легко вычисляется y=f(х), однако по заданному «у» найти х=f-1(у) крайне трудно. Вероятно, вы легко найдете аналогии в повседневной жизни. Например, очень легко влить молоко в кофе, но трудно извлечь eгo обратно!
Принцип асимметричного шифрования Итак, Алиса хочет предоставить Бобу возможность отправить ей секретное сообщение. 1. Алиса случайным образом выбирает два больших простых числа р и q, которые она сохраняет в тайне, как секретный ключ (р, q). 2. Алиса перемножает эти числа, чтобы получить их произведение n=p*q. з. Алиса вычисляет функцию Эйлера (тотиент) ф(n)= (р-1)(q -1). Эта функция есть количество целых чисел, меньших n, и взаимно простых с n. 4. Алиса выбирает показатель е такой, что 1 < е < ф(n), и наибольший общий делитель для е и ф(n) равен 1. 5. Алиса делает произведение n и показатель е общедоступными в виде открытого ключа (n, е). 6. Алиса вычисляет число d, инверсию по модулю n от е, такое, что для любого х выполняется: х = (xe)d(mod n).
Принцип асимметричного шифрования Далее события развиваются на стороне Боба. 1. Боб получает общедоступный открытый ключ (n, е). 2. Боб создает сообщение в открытом тексте и представляет eгo как число t. 3. Боб вычисляет зашифрованный текст, как число с = tе(mоdn) и отправляет eгo Алисе. Далее в ход событий вмешивается Ева - ее ждет разочарование. 1. Ева перехватывает шифрованный текст с. 2. Поскольку ей неизвестно d, она не в состоянии вычислить t = cd(mod n) 3. Ей не удается вычислить d, даже зная открытый ключ (n, е), поскольку задача факторизации (разложение на сомножители) слишком трудна для вычисления.
Принцип асимметричного шифрования А вот Алиса счастлива: 1. Алиса получает с. 2. Алиса прямо вычисляет открытый текст: t= cd(mod n) В .NET Framework предусмотрены следующие классы для работы сасимметричными алгoритмами: • System.Security.Cryptography.DSA; • System.Security.Cryptography.RSA.
ГEHEPATOPЫ ПСЕВДОСЛУЧАЙНЫХ ЧИСЕЛ Фактически все современные шифры зависят от случайности своих ключей. Если последовательность чисел, rенерируемая PRNG, недостаточно случайна, то среди ее чисел могут существовать зависимости, которые облегчат атаку на шифр. В случае успеха атакующая сторона может угадать закономерность, по которой гeнерируются ваши ключи, что будет означать полный крах криптосистемы. Программный гeнepaтop псевдослучайных чисел хорошего качества отличается тем, что для нeгo очень трудно предсказать очередное число на основе ранее выданных чисел. Гeнepaтopы PRNG зависят от нeкoeгo начального, инициализирующего числа, которое называют семенем (seed). Начав paботу с заданного значения seed, гeнepaтоp производит детерминированную последовательность, которая будет повторена с начала, если задать ему такое же число seed. Конечно, одно и то же число seed ни в коем случае не следует использовать повторно.
ГEHEPATOPЫ ПСЕВДОСЛУЧАЙНЫХ ЧИСЕЛ • Если наш источник случайных чисел несовершенен, то мы можем стремиться к тому, чтобы он был, по крайней мере, хорош. Хороший гeнератор PRNG обладает как можно более «плоской» кривой распределения, то есть на большом отрезке все числа встречаются с примерно одинаковой частотой. Также никакая последовательность чисел не встрeчается чаще других. • Если вас интересуют максимальные возможности, то существуют специальные устройства, которые используют случайность некоторых физических процессов таких, как квантовый шум резисторов или диодов, или шум радиоактивного распада, детектированный счетчиком Гейгeра.
ГEHEPATOPbI ПСЕВДОСЛУЧАЙНЫХ ЧИСЕЛ И .NET FRAMEWORK Класс RNGCryptoServiceProvider предоставляет доступ к высококачественному генepaтоpy, входящему в coстав поставщика услуг криптографии (CSP cryptographic service provider). Тем не менее, может оказаться, что вам никогда не потребуется обращаться к этому классу напрямую, поскольку криптогpафические классы .NET Framework неявно используют eгo для генерации ключей. Абстрактный базовый класс RandomNumberGenerator производит лишь один дочерний класс с именем RNGCryptoServiceProvider. Класс RandomNumberGenerator поддерживает стандартный метод класса Object, а также методы GetBytes и GetNonZeroBytes, которые возвращают массив с байтами, содержащими криптогpафически сильную последовательность значений. Как понятно из eгo имени, метод GetNonZeroBytes возвращает массив случайных чисел без нулевых значений. Также класс GetNonZeroBytes поддерживает два переопределения метода Create, который создает экземпляр производной конкретной реализации криптогpафическоrо гeнepaтopa случайных чисел.
ГEHEPATOPbI ПСЕВДОСЛУЧАЙНЫХ ЧИСЕЛ И .NET FRAMEWORK Конкретный объект класса RNGCryptoServiceProvider можно создать и использовать напрямую. Следующий фрaгмент кода иллюстрирует генерацию 128 случайных байт при помощи этого класса. Здесь использован конструктор RNGCryptoServiceProvider, но вы можете, если хотите, использовать вместо этоrо один из статических методов Create. byte[] randomВytes = new byte[128]; RNGCryptoServiceProvider rngcsp = new RNGCryptoServiceProvider(); rngсsр.GetBytes(randomВytes); //получение массива случайных чисел
КРИПТОГРАФИЧЕСКИЕ ХЕШИРУЮЩИЕ АЛГОРИТМЫ Криптографические хеширующие алгоритмы получают на входе произвольный объем данных и на выходе уменьшают eгo до заданного размера (обычно это 128, 160 или 256 бит). Результат работы такoгo алгоритма называют «дайджестом сообщения» или «отпечатком пальца», и он, peзультат, в высокой степени идентифицирует исходное сообщение, подобно тому, как отпечаток пальца идентифицирует человека. В идеале криптографический хеширующий алгоритм должен удовлетворять следующим требованиям: • трудно восстановить входные данные по выходным (то есть алгоритм должен быть односторонним); • трудно подобрать такие входные данные, которые дали бы на выходе заранее заданный результат; • трудно найти два варианта входных данных, которые дали бы одинаковые выходные результаты; • изменение одного бита во входных данных приводит к изменению, примерно, половины битов в результате.
КРИПТОГРАФИЧЕСКИЕ ХЕШИРУЮЩИЕ АЛГОРИТМЫ Хеш -алrоритм генерирует «отпечаток пальца» фиксированного размера для произвольного объема входных данных. Результат работы хеш-алrоритма используется в следующих целях: • с eгo помощью можно обнаружить изменения, внесенные во входные данные; • он используется в алгoритмах, реализующих цифровую подпись; • eгo можно использовать для трансформации пароля в такое ceкретное представление, которое можно безопасно передавать по сети или хранить на незащищенном устройстве; • eгo можно использовать для трансформации пароля в ключ для использования в алгоритмах шифрования.
КРИПТОГРАФИЧЕСКИЕ ХЕШИРУЮЩИЕ АЛГОРИТМЫ В библиотеке .NET Security Framework предусмотрены следующие классы для работы с хеширующими aлгоритмами: • System.Security .Cryptography. KeyedHashAlgorithm; • System.Security.Cryptography.MD5; • System.Security.Cryptography.SHA1; • System.Security.Cryptography.SHA256; • System.Security.Cryptography.SHA384; • System.Security.Cryptography.SHA512. Класс KeyedНashAlgorithm - это абстрактный класс, из кoтopoгo производятся все классы, реализующие конкретные алгoритмы. Хеш с ключом (keyed hash) отличается от обычного криптографическоrо хеша тем, что принимает в качестве дополнительных входных данных ключ.
КРИПТОГРАФИЧЕСКИЕ ХЕШИРУЮЩИЕ АЛГОРИТМЫ Таким образом, для верификации хеша необходимо знать ключ. Есть два производных класса, получаемых из KeyedНashAlgorithm, это HMACSHAl и MACТripleDES.HMACSHA1, они получают ключ произвольного размера и генерируют 20байтовый «код аутентификации сообщения» МАС (Message Authentication Соде), используя при этом алroритм SHA1. Буквы НМАС расшифровываются, как KeyedHash Message Authentication Соdе (код аутентификации сообщения при помощи ключевого хеша). MACТripleDES генерирует код МАС при помощи «тройного DES», используемого в качестве хеширующего алгoритма. Он принимает ключи размером 8, 16 или 24 байта и генерирует 8-байтовый хеш. Алгоритмы хеширования с ключом полезны в схемах аутентификации и проверки целостности, фактически они являются альтернативой электронной подписи.
Криптографические протоколы • Криптографические протоколы - это общепринятое соглашение, касающееся набора алгоритмов, последовательности действий и определения функций каждого из участников процесса. • Например, простой криптографический протокол RSA + Triple DES, мoг бы выглядеть следующим образом.
Криптографические протоколы 1. Алиса и Боб генерируют каждый для себя пару ключей RSA (открытый и секретный ключи). 2. Они обмениваются открытыми ключами RSA, оставляя секретные ключи при себе. З. Каждый из них генерирует собственный ключ Triple DES и шифрует этот ключ при помощи oткрытoгo ключа RSA, принадлежащего своему партнеру. Теперь расшифровать сообщение и получить ключ Triple DES можно только при помощи ceкpeтногo ключа партнера. 4. Они пересылают друг другу зашифрованные ключи Triple DES. 5. Теперь, если Алисе или Бобу потребуется отправить секретное coобщение, каждый шифрует eгo при помощи ключа Triple DES cвoeгo партнера и отсылает eгo. 6. Партнер получает шифрованное сообщение и дешифрует eгo при помощи cвoeгo ключа Triple DES.
Криптографические протоколы Дрyгoй пример протокола основывается на асимметричном алгoритме RSA и хеш-алгoритме SНA1 и обеспечивает надежную идентификацию отправителя сообщения. 1. Алиса и Боб генерируют каждый для себя пару ключей RSA (открытый и секретный ключи). 2. Они обмениваются открытыми ключами RSA, оставляя секретные ключи при себе. з. При необходимости отправить сообщение своему корреспонденту каждый из них вычисляет хеш сообщения при помощи алгоритма SНA1, затем шифрует этот хеш собственным секретным ключом RSA и отправляет сообщение вместе с зашифрованным хешем. 4. Коrда Алиса или Боб получают сообщение, и если у них возникает необходимость убедиться в том, что отправителем является именно второй партнер, они расшифровывают присоединенный хеш при помощи открытoгo ключа RSA cвoeгo партнера. Затем они заново вычисляют хеш-сообщения и сравнивают полученный результат с расшифрованным хешем. Если оба хеша совпадают, значит, отправителем является владелец использованного открытого ключа RSA.
Криптографические протоколы В отличии от этих простых сценариев, криптографические протоколы могут подразумевать участие людей, которые не доверяют друг дрyгу полностью, но тем не менее должны взаимодействовать каким-то образом. Например, это могyт быть финансовые транзакции, банковские и тоpгoвыe операции - везде используются специальные криптографические протоколы, учитывающие особенности конкретной среды. Зачастую криптографические протоколы становятся компьютерными стандартами или конвенциями.
Криптографические протоколы Например, протокол Kerberos повсеместно используется для тoгo, чтобы сервер и клиент могли надежно идентифицировать друг друга. Дрyгой пример - это модель безопасного доступа к коду (CAS Соdе Access Security) на платформе .NET, в которой исполняемый код снабжен цифровой подписью автора для верификации перед выполнением. Еще один пример: SSL - протокол защищенных сокетов (Secure Sockets Layer), используемый для безопасных коммуникаций через Internet. Есть многo других примеров, включая PGP (Pretty Good Privacy - достаточно надежная секретность) для шифрования электронной почты или «соглашение о ключах Диффи-Хеллмана» для обмена сеансовыми ключами по незащищенному каналу и без предварительного обмена какой-либо секретной информацией.
Криптоаналитические атаки • Атака на основе только зашифрованного текста: в распоряжении атакующей стороны имеется только некоторый, случайно выбранный шифрованный текст. • Атака с открытым текстом: в распоряжении атакующей стороны имеется случайно выбранный открытый текст и соответствующий ему шифрованный текст. • Атака с выбранным открытым текстом: в распоряжении атакующей стороны имеется выбранный открытый текст и соответствующий ему шифрованный текст. • Атака с выбранным зашифрованным текстом: в распоряжении атакующей стороны имеется выбранный шифрованный текст и coответствующий ему открытый текст. • Адаптивная атака с выбранным открытым текстом: атакующая сторона может многократнo получать шифрованный текст, соответствующий заданному открытому тексту, основывая каждый очередной выбор на предыдущих вычислениях.
Задание • Напишите «техническое задание» для вашей семестровой задачи. Укажите, какие криптографические возможности вы будете использовать.