Next: 49783156431138-я попытка
Up: 6.2. Немного теории
Previous: Какой алгоритм выбрать?
Contents: Содержание
Перед вами программа для шифрования. Что является секретным в этой
программе? Сама программа? Исходный текст? Описание алгоритма? Ответ,
безусловно, зависит от условий ее применения. Конечно, лучше всего
сделать так, чтобы ваш конкурент не имел ни того, ни другого, ни
третьего. Поэтому обычно подобные программы защищают и от копирования,
и от дизассемблирования, и от работы под отладчиком и т.д. Если она
защищена грамотным специалистом, то пройдет не один месяц, пока
защита будет снята. Тем не менее, программа, как правило, используется
длительное время, а хакеров сейчас великое
множество. Поэтому лучше сразу исходить из того, что все связанное
с программой секрета на представляет.
Что еще представляет интерес для вашего конкурента? Закрытая
программой информация? От нее никто не откажется, но она мало что
дает. Если алгоритм шифрования выбран надежный, то закрытая
информация не представляет секрета, так как она непосредственно
предназначена для хранения и передачи в открытом виде. Поэтому при
отсутствии следов не уничтоженной открытой информации можно быть
спокойным.
Остаются ключи. Имея ключи, ваши конкуренты откроют все закрытые
двери. Это главный секрет во всем процессе шифрования, и, можете не
сомневаться, что основные усилия вашего конкурента будут направлены
именно на подкуп персонала, имеющего доступ к ключам.
Но как вводить ключ в программу и где хранить ключи? Если программу
использовать интенсивно, то ключей нужно очень много. Где их брать и
как заменять один на другой?
Скупой рыцарь хранил свои сокровища в сундуках, которые были закрыты с
помощью замков, ключи от которых он постоянно носил с собой. Он
правильно делал, что никогда не расставался с ключами. Но поскольку он
был очень богат, то ключей у него было очень много, и носить такую
связку ему, наверно, было очень неудобно.
Вообще-то, он мог завести еще
один сундук, куда можно было бы сложить все ключи. Тогда бы ему
потребовалось носить всего один ключ. Именно эта идея используется в
ключевых системах с главным
ключом, когда все ключи, кроме главного,
хранятся в компьютере на винчестере в зашифрованном виде. Хотя такой
способ хранения ключей несколько усложняет процедуру доступа к
зашифрованной информации, преимущества здесь неоспоримы. Действительно,
можете ли вы представить себе человека, который помнит несколько
сотен ключей?
Таким образом, задача сводится к обеспечению надежного хранения всего
одного ключа. Правда, при этом ценность этого ключа резко возрастает и
носить его в кармане становится очень опасным. Не только потому, что
наверняка найдутся люди, которые будут испытывать непреодолимое желание
взять у вас его, хотя бы на время; но еще и потому, что если он
потеряется или испортится, получив механическое повреждение, то вы уже
никогда не сможете ничего восстановить из той информации, которую вы
хранили в своем компьютере. С ключами надо быть очень осторожным.
В 1976 году американские математики Диффи и Хеллман предложили перейти
к системам с открытым ключом. Давайте издадим книгу-справочник с
открытыми ключами всех корреспондентов и поместим ее на общедоступном
сервере. Это полностью снимет проблему с хранением большого числа
ключей.
Нетрудно догадаться, сколь неоднозначный и шокирующий эффект это
предложение произвело на криптографическую общественность. Но уж больно
заманчивы были те возможности, которые предоставляла такая система. Как
показали авторы идеи, такая система дает возможность подписывать
сообщения электронной цифровой подписью, которая выполняет роль обычной
подписи под документом. Таким образом, сразу снимался тяжкий груз по
производству, запоминанию, хранению, распределению и
уничтожению огромного количества секретных ключей, да к тому же
открывались новые возможности и сферы применения.
Более того, плодотворность идеи выразилась в
проявлении большого интереса к ней у
значительной части крупных математиков. Ведь для реализации такой
системы нужны были труднорешаемые математические задачи. А кто, кроме
самих математиков, может придумать такие задачи!
Посмотрим, например, как организуется выработка ключей в широко
распространенном протоколе SSH (Secure Shell).
Данный протокол
обеспечивает аутентификацию и закрытие коммуникаций при взаимодействии
UNIX машин. Для выработки ключей в нем используется протокол,
являющийся модификацией хорошо известного протокола обмена ключами,
предложенного Диффи и Хеллманом. Пусть - большое простое число и
. Пусть - число, имеющее порядок равный по модулю
. Оно является образующим элементом мультипликативной группы порядка
. Помимо операции возведения в степень в протоколе используются
алгоритмы вычисления функции хеширования SHA
(secure hash algorithm) и
цифровой подписи DSS (digital signature
standard), принятые в США в
качестве стандартов. Протокол состоит в следующем (см. [6]).
Клиент C генерирует случайное число , ,
вычисляет значение
и отправляет сообщение ``'' серверу S.
Сервер S генерирует случайное число , ,
вычисляет значение ,
вычисляет значение ключа , вычисляет
проверочное значение
(здесь - функция
хеширования на основе алгоритма SHA, - некоторая строка,
содержащая идентифицирующую информацию о клиенте и сервере, -
открытый ключ сервера), вычисляет значение цифровой подписи
под на
своем секретном ключе в соответствии с алгоритмом DSS, а затем
отправляет сообщение ``'' клиенту C.
Клиент C
проверяет, действительно ли является ключом сервера. Если да, то
вычисляет значение ключа , проверяет правильность значения
вектора . Наконец, проверяет подпись под этим значением.
В этом протоколе
простое число строится из известного каждому школьнику числа
по формуле
и равно
179769313486231590770839156793787453197860296048756011706444 |
423684197180216158519368947833795864925541502180565485980503 |
646440548199239100050792877003355816639229553136239076508735 |
759914822574862575007425302077447712589550957937778424442426 |
617334727629299387668709205606050270810842907692932019128194 |
467627007. |
Его шестнадцатиричная запись имеет ``менее случайный'' вид
FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 |
29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD |
EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 |
E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED |
EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE65381 |
FFFFFFFF FFFFFFFF.
|
Данное число построено Ричардом Шреппелем из университета
штата Аризона, а его свойства описаны в работе [7].
В качестве образующего элемента для этого простого числа взято число . Возведение в степень такого числа выполняется достаточно быстро,
так как умножение на 2 - это простой сдвиг двоичной записи числа в
сторону старших разрядов.
Next: 49783156431138-я попытка
Up: 6.2. Немного теории
Previous: Какой алгоритм выбрать?
Contents: Содержание