ЛАБОРАТОРНАЯ РАБОТА №3
ИЗУЧЕНИЕ СТАНДАРТНЫХ СРЕДСТВ КРИПТОГРАФИЧЕСКОЙ АУТЕНТИФИКАЦИИ – ЭЛЕКТРОННОЙ ЦИФРОВОЙ ПОДПИСИ
1. Цель работы
Изучить возможности и уяснить порядок работы с программой электронной цифровой подписи PGP.
2. Порядок проведения работы
2.1. Изучить теоретический материал и рекомендованную литературу.
2.2. Выполнить задание на лабораторную работу.
2.3. Ответить на контрольные вопросы.
3. Задание на лабораторную работу
Создайте два каталога на одном компьютере либо на двух компьютерах в сети.
ЧАСТЬ 1. ГЕНЕРАЦИЯ ОТКРЫТОГО И СЕКРЕТНОГО КЛЮЧА.
1.1.Запустите программу pgp с опцией –k
pgp –k
Вы увидите на экране следующие сообщения:
Pretty Good Privacy 1.0 – RSA public key cryptography for the masses. (c) Copyright 1990
Philip Zimmermann, Phil's Pretty Good Software. 5 Jun 91
Key file name is required for RSA key pair: my
Введите имя для размещения открытого и секретного ключа, в данном случае my Pick your RSA key size:
1) 288 bits – Casual grade, fast but less secure
2) 512 bits – Commercial grade, medium speed, good security
3) 992 bits – Military grade, very slow, highest security
Choose 1, 2, or 3, or enter desired number of bits: 286
Введите длину ключа RSA в битах, не вводите большую длину – программа будет долго
работать, рекомендуется 286 бит.
Generating an RSA key with a 286-bit modulus...
Enter a user ID for your public key (your name): dima
Введите свое имя, сообщения будут подписаны им. Могут использоваться любые
символы английского алфавита, в т. ч. пробел и знаки препинания.
You need a pass phrase to protect your RSA secret key.
Enter pass phrase:
Enter same pass phrase again:
Защитите паролем свой секретный ключ
Note that key generation is a VERY lengthy process.
We need to generate 30 random bytes. This is done by measuring the time intervals between
your keystrokes. Please enter some text on your keyboard, at least 60 nonrepeating keystrokes,
until you hear the bell:
Система попросит Вас ввести несколько случайных неповторяющихся клавиш для
выработки случайных чисел.
После этого Ваши ключи готовы:
my. pub – открытый ключ,
my. sec – секретный ключ.
Система предложит Вам включить ваши ключи в файлы keyring. pub и keyring. sec (так называемые "связки", или каталоги ключей) – соглашайтесь: программа при работе с ключами в первую очередь ищет введенный пользовательский идентификатор в этих файлах и, если не находит, попросит Вас ввести явно имя файла. Включив ключи в связки, Вы уменьшите количество информации, которую Вам придется вводить с клавиатуры.
Полезно также включать в связки полученные ключи:
pgp –a [полученный файл]
Просмотреть отдельные файлы ключей и их связки Вы можете, запустив pgp с
соответствующим именем файла, например, для просмотра связки публичных ключей
запустите
pgp keyring. pub.
1.2. Рассылка открытого ключа.
Разошлите свой открытый ключ всем, кому Вы хотите посылать сообщения, для проверки на подлинность.
ЧАСТЬ 2. ЗАВЕРЕННАЯ ПЕРЕПИСКА.
2.1. Сформируйте текстовый файл, например, text#.doc
2.2. Подпишите его. Для подписания текстового файла вашим секретным ключом наберите:
pgp –s textfile [-u your_userid]
Скобки []обозначают необязательное поле.
В результате выполнения этой команды получится подписанный файл
textfile. ctx. Пример:
pgp –s letter. txt –u User
По этой команде PGP будет искать в файле каталога секретных ключей "keyring. sec" сертификаты секретного ключа, в которых содержится строка "User" в поле идентификатора пользователя. Поиск ведется без учета регистра. Если соответствующий секретный ключ будет найден, он будет использован для подписания текстового файла "letter. txt", в результате будет получен подписанный файл "letter. ctx". Если вы не указываете поле идентификатора пользователя, то имя будет запрошено в процессе подписывания.
2.3.Перешлите подписанный файл и примите подписанные файлы с открытыми
ключами (*.pub) от других корреспондентов.
ЧАСТЬ 3. ПРОВЕРКА ПОДПИСИ.
Для дешифровки зашифрованного файла или проверки целостности подписи подписанного файла используется команда:
pgp ciphertextfile [-o plaintextfile]
По умолчанию для шифрованного файла принимается расширение ".ctx". Необязательное имя выходного текстового файла определяет, где размещать обработанный текстовый файл. Если никакое имя не задается, то используется имя шифрованного файла без расширения. Если подпись находится внутри шифрованного файла, то производится дешифровка и проверка целостности подписи. На экран будет выведен полный идентификатор пользователя, подписавшего текст. Обратите внимание, что расшифровка файла ведется полностью автоматически, независимо от того, только подписан ли он, только зашифрован, или и то и другое.
PGP использует префикс идентификатора ключа из зашифрованного файла для автоматического поиска соответствующего секретного ключа для расшифровки в каталоге секретных ключей. Если в файле имеется вложенная подпись, PGP будет использовать затем префикс идентификатора из вложенной подписи для автоматического нахождения соответствующего общего ключа в вашем каталоге открытых ключей, чтобы проверить подпись. Если в ваших каталогах ключей уже имеются все верные ключи, то вмешательство пользователя не требуется, за исключением того, что PGP запросит у вас пароль для вашего секретного ключа, если это необходимо. Если файл шифровался традиционным способом без использования общего ключа, PGP определит это и запросит у вас фразу пароля для дешифровки.
ЧАСТЬ 4. ШИФРОВАНИЕ СООБЩЕНИЯ
Для шифровки текстового файла открытым ключом получателя, введите:
pgp –e textfile [her_userid]
Если Вы не вводите в командной строке имя корреспондента, то оно будет запрошено в процессе шифрования.
В результате будет получен зашифрованный файл textfile. ctx.
Пример:
pgp –e letter. txt User
или:
pgp –e letter. txt "User 1"
В первом примере PGP будет искать в каталоге ваших открытых ключей сертификаты открытых ключей, которые содержат строку "User" в поле идентификатора пользователя. Во втором примере PGP будет искать идентификаторы пользователя, которые содержат строку "User 1". Нельзя использовать пробелы в командной строке, если вы не заключаете целую строку в кавычки. Поиск ведется без учета регистра. Если соответствующий открытый ключ найден, то он используется для шифровки текстового файла "letter. txt", получается зашифрованный файл "letter. ctx".
PGP будет пытаться упаковывать текст перед шифрованием, таким образом значительно усиливая его сопротивляемость криптоанализу. Это означает, что зашифрованный файл скорее всего будет меньше, чем исходный текстовый файл.
Если вы хотите послать полученное шифрованное сообщение через каналы электронной почты, преобразуйте его в печатаемый ASCII-формат Radix-64 с помощью добавления опции –a. Если вы хотите послать одно и то же сообщение более чем одному человеку, вы можете задать шифрование для нескольких адресатов, любой из которых может его расшифровать. Для задания нескольких адресатов просто добавьте несколько идентификаторов пользователей в командную строку, примерно так:
pgp –e letter. txt Olga Serg Bob
В результате будет создан зашифрованный u1092 файл letter. ctx, который может быть прочитан любым адресатом: Olga, Bob или Serg. Можно задать любое количество адресатов.
ЧАСТЬ 5. ПОДПИСАНИЕ И ШИФРОВАНИЕ
Для подписания текстового файла вашим секретным ключом и последующей его зашифровки открытым ключом адресата, наберите:
pgp –es textfile her_userid [-u your_userid]
В результате выполнения данного примера будет получен "вложенный" зашифрованный файл textfile. ctx. Ваш секретный ключ для создания подписи автоматически ищется в вашем каталоге секретных ключей по your_userid. Открытый ключ адресата для шифрования автоматически ищется в вашем каталоге открытых ключей по her_userid. Если вы опускаете один из параметров в командной строке, PGP запросит его у вас. Обратите внимание, что PGP будет пытаться упаковывать текст перед шифрованием. Если вы хотите послать полученное шифрованное сообщение через каналы электронной почты, преобразуйте его в печатаемый ASCII-формат Radix-64 с помощью добавления опции –a.
Можно определить несколько адресатов, задавая в командной строке несколько идентификаторов пользователя.
ЧАСТЬ 6. ИСПОЛЬЗОВАНИЕ СТАНДАРТНОГО ШИФРОВАНИЯ
Иногда вам необходимо зашифровать файл традиционным способом, с помощью шифрования с одним ключом. Это может быть полезно для защиты файлов в архиве, которые будут сохраняться, но не будут посылаться кому-нибудь. Так как расшифровывать файл будет тот же самый человек, который и шифровал его, шифрование с открытым ключом действительно в этом случае не является необходимым.
Чтобы зашифровать текстовый файл традиционным способом, наберите:
pgp –c textfile
В этом случае PGP зашифрует текстовый файл и получит выходной файл textfile. ctx без использования метода открытого ключа, каталогов ключей, идентификаторов и т. д. PGP запросит у вас фразу пароля для шифрования файла. Эта фраза не должна быть одинаковой с фразой пароля, которую вы используете для защиты вашего секретного ключа. PGP будет пытаться упаковать текст перед шифрованием. PGP не будет шифровать один и тот же файл тем же самый способом дважды, даже если вы используете ту же самую фразу пароля.
Теоретический материал к лабораторной работе
Система RSA. Структура цифровой подписи
В стандартных криптографических системах, таких, как DES или Гост, один и тот же ключ используется и для шифрования, и для расшифровки. Это значит, что ключ должен первоначально быть передан через секретные каналы так, чтобы обе стороны могли иметь его до того, как шифрованные сообщения будут посылаться по обычным каналам, и, естественно, он может быть перехвачен. В криптографической системе с открытым ключом каждый имеет два связанных взаимно однозначно ключа: публикуемый открытый ключ и секретный ключ. Каждый из них дешифрует код, сделанный с помощью другого. Знание открытого ключа не позволяет вам вычислить соответствующий секретный ключ. Открытый ключ может публиковаться и широко распространяться через коммуникационные сети. Такой протокол обеспечивает секретность без необходимости использовать специальные каналы связи, необходимые для стандартных криптографических систем. Рассмотрим сначала систему RSA в общем виде.
Нам потребуется несколько алгебраических терминов и утверждений:
1. a сравнимо с b по модулю n
27
a=b(mod n)
означает, что число n нацело делит разность a-b.
2. Числа a и b имеют наибольший общий делитель (НОД) d, если d делит и a и b и
максимально среди таких чисел.
НОД(a, b)=d
3. Числа a и b взаимно просты, если НОД(a, b)=1
4. Число p называется простым, если оно делится только на 1 и самого себя.
5. Если p – простое и b<p, то НОД(b, p)=1
6. Малая теорема Ферма.
p – простое число, НОД(a, p)=1
ap-1 = 1(mod p)
7. Если a=b(mod n)
и c=d(mod k), то
ab=cd(mod nk) (умножение сравнений)
8. Если a=b(mod n)
и c=d(mod k), то
ac=bd(mod n)
ac=bd(mod k)
Пусть числа p и q – простые.
n=pxq, k=(p-1)x(q-1).
Выработаем число e случайным образом, e<n.
Вычислим d из соотношения ed=1(mod k)
Рассмотрим теперь числа e и d. Предположим, что мы знаем одно из них и знаем соотношение, которым они связаны. Мы бы с легкостью вычислили второе число, как обратный элемент мультипликативной группы с операцией умножения по модулю k (он существует и однозначно определяется по определению группы), однако мы не знаем чисел p и q
(p-1)x(q-1)=pq-p-q+1=n+1-p-q
Следовательно, одно из чисел мы смело можем подарить кому-нибудь вместе с числом n и попросить его посылать нам сообщения таким образом:
1. Сообщения представить как векторы длины l
X = ( x1, x2, ...,xl ), 0<xi<k,
28
2. Каждое xi возвести в степень e по модулю n
3. Прислать нам Y = ( x1
e(mod n), x2
e(mod n), ...,xl
e(mod n) )
Выделим t=yi
Возведем полученное число t в степень второго числа пары – d:
R=td(mod n) = (x e(mod n)) d (mod n)
Что значит, что ed сравнимо с единицей по модулю k?
e x d – 1 делится на (p-1)x(q-1) нацело, т. е.
e x d=1+a x (p-1) x (q-1),
a – целое число, x – операция умножения в кольце целых чисел.
Рассмотрим:
U= x1+a(p-1)(q-1) .
Утверждается, что U(mod n)=x.
Действительно, по малой теореме Ферма:
xp-1 = 1(mod p),
xq-1 = 1(mod q),
x(p-1)(q-1) = 1(mod pq)
Перемножим а раз и получим требуемое равенство.
Тем самым мы доказали, что при возведении полученного сообщения в степень числа d по модулю n будет получено исходное сообщение x. Если же отправлять сообщения необходимо владельцу секретного ключа, то он будет пользоваться для шифрования открытым ключом своего корреспондента. Описанная система называется системой RSA, или несимметричной системой шифрования Райвеста-Шамира-Адлемана (Rivest-Shamir-Adleman). Часто применяется термин "система с открытым ключом". Надо признать не совсем удачным этот термин – мы всегда исходим из предположения секретности части ключа. Более корректно именовать такие системы системами несимметричного шифрования. Числа в паре (e, d) называются: e – открытой частью ключа ("публичный ключ", или public key), d – секретной частью ключа (secret key).
Внимательно рассмотрев описанную систему шифрования, можно заметить еще одно ее ценное качество – она обеспечивает аутентичность передаваемой информации при условии знания секретной части ключа только отправителем сообщения и шифровании сообщение на секретной части ключа. При этом будем полагать, что для проверки аутентичности используется открытая часть ключа. Действительно, автором такого сообщения может быть только владелец секретной части ключа. Рассматривая систему RSA, мы отметили, что зашифровывать на открытой части ключа может любой, а расшифровывать на секретной – только получатель сообщения. На практике очень часто возникает потребность в обратном – зашифровать некоторую информацию (например, свое имя) на секретном ключе так, чтобы некоторый набор лиц мог расшифровать это имя (используя разосланный ранее открытый ключ). Очень ценно то, что в системе RSA не придется ничего менять – нужно просто использовать для шифрования свою секретную часть ключа, тогда в силу симметричности ключей e и d (которая в свою очередь возникает из-за коммутативности операции модульного умножения) процесс расшифрования у получающих будет аналогичным.
Кроме того, мы получим неожиданный эффект – зашифрованную на секретном ключе информацию почти невозможно осмысленно изменить, ведь для этого нужно сначала ее найти (т. е. дешифровать систему RSA), а уж потом исправить. Тем самым, получатели сообщения могут аутентифицировать отправителя т. е. быть уверены, что операцию зашифрования провел он (отправитель), а никто иной. Тем самым мы получим криптографический аналог обыкновенной подписи под некоторой информацией. К тому же вполне логичным будет в качестве открытого текста использовать информацию, существенно зависящую от содержания послания, но значительно меньшего объема. Такую информацию как правило называют хеш-значением сообщения, а способ (алгоритм) получения хеш-значения – хеш-функцией (от английского – hash). Таким образом, мы можем указать основные компоненты электронной цифровой подписи (ЭЦП): хеш-функция (алгоритм "сворачивания" текста в более короткий) и некоторый криптографический алгоритм (шифрующее преобразование), которое воздействует на хеш-значение.
Рассмотрим теперь особенности RSA в реализации программы PGP. Программа Pretty Good ™ Privacy (PGP) выпущена фирмой Phil's Pretty Good Software и является криптографической системой с высокой степенью секретности для операционных систем MS-DOS, Unix, VAX/VMS и других [8]. PGP позволяет пользователям обмениваться файлами или сообщениями с использованием функций секретности и установлением подлинности. Секретность означает, что прочесть сообщение сможет только тот, кому оно адресовано. Установление подлинности позволяет установить, что сообщение, полученное от какого-либо человека, было послано именно им. Нет необходимости использовать секретные каналы связи, что делает PGP простым в использовании программным обеспечением.
PGP объединяет в себе удобство использования криптографической системы с открытым ключом RSA и скорость обычной криптографической системы, алгоритм "дайджеста сообщений" для реализации электронной подписи, упаковку данных перед шифрованием, и развитую систему управления ключами. PGP выполняет функции открытого ключа быстрее, чем большинство других аналогичных реализаций этого алгоритма. Кто угодно может использовать открытый ключ получателя, чтобы зашифровать сообщение ему, а получатель использует его собственный соответствующий секретный ключ для расшифровки сообщения. Никто, кроме получателя, не может расшифровать его, потому что никто больше не имеет доступа к секретному ключу. Даже тот, кто шифровал сообщение, не будет иметь возможности расшифровать его.
Кроме того, обеспечивается также установление подлинности сообщения. Собственный секретный ключ отправителя может быть использован для шифровки сообщения, таким образом "подписывая" его. Так создается электронная подпись сообщения, которую получатель (или кто-либо еще) может проверять, используя открытый ключ отправителя для расшифровки. Это доказывает, что отправителем был действительно создатель сообщения и что сообщение впоследствии не изменялось кем-либо, так как отправитель – единственный, кто обладает секретным ключом, с помощью которого была создана подпись. Подделка подписанного сообщения невозможна, и отправитель не может впоследствии изменить свою подпись. Эти два процесса могут быть объединены для обеспечения и секретности, и установления подлинности: сначала подписывается сообщение вашим собственным секретным ключом, а потом шифруется уже подписанное сообщение открытым ключом получателя. Получатель делает наоборот: расшифровывает сообщение с помощью собственного секретного ключа, а затем проверяет подпись с помощью вашего открытого ключа. Эти шаги выполняются автоматически с помощью программного обеспечения получателя.
В связи с тем, что алгоритм шифрования с открытым ключом значительно медленнее, чем стандартное шифрование с одним ключом, шифрование сообщения лучше выполнять с использованием высококачественного быстрого стандартного алгоритма шифрования с одним ключом. Первоначальное незашифрованное сообщение называется "открытым текстом" (или просто текст). В процессе, невидимом для пользователя, временный произвольный ключ, созданный только для этого одного "сеанса", используется для традиционного шифрования файла открытого текста. Тогда открытый ключ получателя используется только для шифровки этого временного произвольного стандартного ключа. Этот зашифрованный ключ "сеанса" посылается наряду с зашифрованным текстом (называемым "ciphertext" – "зашифрованный") получателю. Получатель использует свой собственный секретный ключ, чтобы восстановить этот временный ключ сеанса, и затем
применяет его для выполнения быстрого стандартного алгоритма декодирования с одним ключом, чтобы декодировать все зашифрованное сообщение. Открытые ключи хранятся в виде "сертификатов ключей", которые включают в себя идентификатор пользователя владельца ключа (обычно это имя пользователя), временную метку, которая указывает время генерации пары ключей, и собственно ключи. Сертификаты открытых ключей содержат открытые ключи, а сертификаты секретных ключей – секретные. Каждый секретный ключ также шифруется с отдельным паролем. Файл ключей, или каталог ключей ("кольцо с ключами" – "keyring") содержит один или несколько таких сертификатов. В каталогах открытых ключей хранятся сертификаты открытых ключей, а в каталогах секретных – сертификаты секретных ключей.
На ключи также внутренне ссылаются "идентификаторы ключей", которые являются "сокращением" открытого ключа (самые младшие 64 бита большого открытого ключа). Когда этот идентификатор ключа отображается, то показываются лишь младшие 24 бита для краткости. Если несколько ключей могут одновременно использовать один и тот же идентификатор пользователя, то никакие два ключа не могут использовать один и тот же идентификатор ключа. PGP использует "дайджесты сообщений" для формирования подписи. Дайджест сообщения – это криптографически мощная 128-битная односторонняя хэш-функция от сообщения. Она несколько напоминает контрольную сумму, или CRC-код (контроль циклическим избыточным кодом), она однозначно представляет сообщение и может использоваться для обнаружения изменений в сообщении. В отличие от CRC - кода, дайджест не позволяет создать два сообщения с одинаковым дайджестом.
Дайджест сообщения шифруется секретным ключом для создания электронной подписи сообщения. Документы подписываются посредством добавления перед ними удостоверяющей подписи, которая содержит идентификатор ключа, использованного для подписи, подписанный секретным ключом дайджест сообщения и метку даты и времени, когда подпись была сгенерирована. Идентификатор ключа используется получателем сообщения, чтобы найти открытый ключ для проверки подписи. Программное обеспечение получателя автоматически ищет открытый ключ отправителя и идентификатор пользователя в каталоге открытых ключей получателя. Шифрованным файлам предшествует идентификатор открытого ключа, который был использован для их шифрования. Получатель использует этот идентификатор для поиска секретного ключа, необходимого для расшифровки сообщения. Программное обеспечение получателя автоматически ищет требуемый для расшифровки секретный ключ в каталоге секретных ключей получателя. Эти два типа каталогов ключей и есть главный метод сохранения и работы с открытыми u1080 и секретными ключами. Вместо того, чтобы хранить индивидуальные ключи в отдельных файлах ключей, они собираются в каталогах ключей для облегчения автоматического поиска ключей либо по идентификатору ключа, либо по
идентификатору пользователя. Каждый пользователь хранит свою собственную пару каталогов ключей. Индивидуальный открытый ключ временно хранится в отдельном файле, достаточно большом для посылки его вашим друзьям, которые добавят его в свои каталоги ключей.
Контрольные вопросы.
1. Объясните схему шифрования RSA.
2. Опишите особенности реализации RSA в программе pgp.
3. Что такое хеш-функция и для чего она используется в подписи?
33
4. Чем отличается режим подписи и шифрования в системе RSA?
5. Для чего используется секретный и для чего – открытый ключ?


