46136 (665403), страница 4
Текст из файла (страница 4)
Таким образом, размер ключа подписи равен удвоенному размеру ключа использованного блочного шифра:
|KS|=2|K|=2nK
-
ключ проверки вычисляется как пара блоков криптоалгоритма по следующим уравнениям:
KC=(C0,C1), где:
C0=EK0(X0), C1=EK1(X1),
где являющиеся параметром схемы блоки данных X0 и X1 несекретны и известны проверяющей подпись стороне.
Таким образом, размер ключа проверки подписи равен удвоенному размеру блока использованного блочного шифра:
|KC|=2|X|=2n.
Алгоритмы схемы цифровой подписи Диффи и Хеллмана следующие:
-
Алгоритм G выработки ключевой пары:
Берем случайный блок данных размера 2nK, это и будет секретный ключ подписи:
KS=(K0,K1)=R.
Ключ проверки подписи вычисляем как результат двух циклов зашифрования по алгоритму EK:
KC=(C0,C1)=(EK0(X0),EK1(X1)).
-
Алгоритм S выработки цифровой подписи для бита t (t {0,1}) заключается просто в выборе соответствующей половины из пары, составляющей секретный ключ подписи:
s=S(t)=Kt.
-
Алгоритм V проверки подписи состоит в проверке уравнения EKt(Xt)=Ct, которое, очевидно, должно выполняться для нашего t. Получателю известны все используемые величины:
Kt=s – цифровая подпись бита,
Ct – соответствующая половина ключа проверки,
Xt – несекретный параметр алгоритма.
Таким образом, функция проверки подписи будет следующей:
.
Не правда ли, все три алгоритма этой схемы изумительно простоты в сравнении со схемами RSA и эль-Гамаля?! Покажем, что данная схема работоспособна, для чего проверим выполнение необходимых свойств схемы цифровой подписи:
-
Невозможность подписать бит t, если неизвестен ключ подписи.
Действительно, для выполнения этого злоумышленнику потребовалось бы решить уравнение Es(Xt)=Ct относительно s, эта задача эквивалентна определению ключа для известных блока шифротекста и соответствующего ему открытого текста, что вычислительно невозможно в силу использования стойкого шифра.
-
Невозможность подобрать другое значение бита t, которое подходило бы под заданную подпись очевидна, потому что число возможных значений бита всего два и вероятность выполнения двух следующих условий одновременно пренебрежимо мала в просто в силу использования криптостойкого алгоритма:
Es(X0)=C0,
Es(X1)=C1.
Таким образом, предложенная Диффи и Хеллманом схема цифровой подписи на основе классического блочного шифра криптостойка настолько, насколько стоек использованный шифр, и при этом весьма проста. Теперь самое время рассказать, почему же эта замечательная схема не нашла сколько-нибудь значительного практического применения. Все дело в том, что у нее есть два недостатка. Всего два, но каких!
Первый недостаток сразу бросается в глаза – он заключается в том, что данная схема позволяет подписать лишь один бит информации. В блоке большего размера придется отдельно подписывать каждый бит, поэтому даже с учетом хеширования сообщения все компоненты подписи – секретный ключ, проверочная комбинация и собственно подпись получаются довольно большими по размеру и более чем на два порядка превосходят размер подписываемого блока. Предположим, что в схеме используется криптографический алгоритм EK с размером блока и ключа, выраженными в битах, соответственно n и nK. Предположим также что размер хэш–блока в схеме равен nH. Тогда размеры основных рабочих блоков будут следующими:
-
размер ключа подписи:
nS=nH2nK=2nHnK.
-
размер ключа проверки подписи:
nС=nH2n=2nHn.
-
размер подписи:
nSg=nHnK=nHnK.
Если, например, в качестве основы в данной схеме будет использован шифр ГОСТ 28147–89 с размером блока n=64 бита и размером ключа nK=256 бит, и для выработки хэш–блоков будет использован тот же самый шифр в режиме выработки MDC, что даст размер хэш–блока nH=64 то размеры рабочих блоков будут следующими:
-
размер ключа подписи:
nS=nH2nK=2nHnK=264256=215 бит = 4096 байт.
-
размер ключа проверки подписи:
nС=nH2n=2nHn=26464=213 бит = 1024 байта.
-
размер подписи:
nSg=nHnK=nHnK=64256=214 бит = 2048 байт.
Согласитесь, довольно тяжелые ключики.
Второй недостаток данной схемы, быть может, менее заметен, но зато гораздо более серьезен. Дело в том, что пара ключей подписи и проверки в ней одноразовая! Действительно, выполнение процедуры подписи бита сообщения приводит к раскрытию половины секретного ключа, после чего он уже не является полностью секретным и не может быть использован повторно. Поэтому для каждого подписываемого сообщения необходим свой комплект ключей подписи и проверки. Это исключает возможность практического использования рассмотренной схемы Диффи–Хеллмана в первоначально предложенном варианте в реальных системах ЭЦП.
В силу указанных двух недостатков предложенная схемы до сравнительно недавнего времени рассматривалась лишь как курьезная теоретическая возможность, никто всерьез не рассматривал возможность ее практического использования. Однако несколько лет назад в работе [7] была предложена модификация схемы Диффи–Хеллмана, фактически устраняющая ее недостатки. В настоящей работе данная схема не рассматривается во всех деталях, здесь изложены только основные принципы подхода к модификации исходной схемы Диффи–Хеллмана и описания работающих алгоритмов.
-
Модификация схемы Диффи–Хеллмана для подписи битовых групп.
В данном разделе изложены идеи авторов [7], позволившие перейти от подписи отдельных битов в исходной схемы Диффи–Хеллмана к подписи битовых групп. Центральным в этом подходе является алгоритм «односторонней криптографической прокрутки», который в некотором роде может служить аналогом операции возведения в степень. Как обычно, предположим, что в нашем распоряжении имеется криптографический алгоритм EK с размером блока данных и ключа соответственно n и nK битов, причем размер блока данных не превышает размера ключа: nnK. Пусть в нашем распоряжении также имеется некоторая функция «расширения» n–битовых блоков данных в nK–битовые Y=PnnK(X), |X|=n, |Y|=nK. Определим функцию Rk «односторонней прокрутки» блока данных T размером n бит k раз (k0) с помощью следующей рекурсивной формулы:
где X – произвольный несекретный n-битовый блок данных, являющийся параметром процедуры прокрутки. По своей идее функция односторонней прокрутки чрезвычайно проста, надо всего лишь нужное количество раз (k) выполнить следующие действия: расширить n-битовый блок данных T до размера ключа использованного криптоалгоритма (nK), на полученном расширенном блоке как на ключе зашифровать блок данных X, результат зашифрования занести на место исходного блока данных (T). В силу определения операция Rk(T) обладает двумя крайне важными для нас свойствами:
-
Аддитивность по числу прокручиваний:
Rk+k'(T)=Rk'(Rk(T)).
-
Односторонность или необратимость прокрутки: если известно только некоторое значение функции Rk(T), то вычислительно невозможно найти значение Rk'(T) для любого k'<k – если бы это было возможно, в нашем распоряжении был бы способ определить ключ шифрования по известному входному и выходному блоку криптоалгоритма EK. что противоречит предположению о стойкости шифра.
Теперь покажем, как указанную операцию можно использовать для подписи группы битов: изложим описание схемы подписи блока T, состоящего из nT битов, по точно такой же схеме, по которой в предыдущем разделе описывается схема подписи одного бита.
-
секретный ключ подписи KS выбирается как произвольная пара блоков K0, K1, имеющих размер блока данных используемого блочного шифра:
KS=(K0,K1);
Таким образом, размер ключа подписи равен удвоенному размеру блока данных использованного блочного шифра:
|KS|=2n;
-
ключ проверки вычисляется как пара блоков, имеющих размер блоков данных использованного криптоалгоритма по следующим формулам:
KC=(C0,C1), где:
C0=R2nT–1(K0), C1=R2nT–1(K1).
В этих вычислениях также используются несекретные блоки данных X0 и X1, являющиеся параметрами функции «односторонней прокрутки», они обязательно должны быть различными.
Таким образом, размер ключа проверки подписи равен удвоенному размеру блока данных использованного блочного шифра:
|KC|=2n.
Алгоритмы модифицированной авторами [7] схемы цифровой подписи Диффи и Хеллмана следующие:
-
Алгоритм G выработки ключевой пары:
Берем случайный блок данных подходящего размера 2n, это и будет секретный ключ подписи:
KS=(K0,K1)=R.
Ключ проверки подписи вычисляем как результат «односторонней прокрутки» двух соответствующих половин секретного ключа подписи на число, равное максимальному возможному числовому значению nT-битового блока данных, то есть на 2nT–1.
KC=(C0,C1)=(R2nT–1(K0), R2nT–1(K1)).
-
Алгоритм SnT выработки цифровой подписи для nT-битового блока T, ограниченного, по своему значению, условием 0T2nT–1, заключается в выполнении «односторонней прокрутки» обеих половин ключа подписи T и 2nT–1–T раз соответственно:
s=SnT(T)=(s0,s1)=(RT(K0), R2nT–1–T(K1)).
-
Алгоритм VnT проверки подписи состоит в проверке истинности соотношений:
R2nT–1–T(s0)=C0, RT(s1)=C1, которые, очевидно, должны выполняться для подлинного блока данных T:
R2nT–1–T(s0)=R2nT–1–T(RT(K0))=R2nT–1–T+T(K0)=R2nT–1(K0)=C0,
RT(s1)=RT(R2nT–1–T(K1))=RT+2nT–1–T(K1)=R2nT–1(K1)=C1.
Таким образом, функция проверки подписи будет следующей:
Покажем, что для данной схемы выполняются необходимые условия работоспособности схемы подписи:
-
Предположим, что в распоряжении злоумышленника есть nT-битовый блок T, его подпись s=(s0,s1), и ключ проверки KC=(C0,C1). Пользуясь этой информацией, злоумышленник пытается найти правильную подпись s'=(s'0,s'1) для другого nT-битового блока T'. Для этого ему надо решить следующие уравнения относительно s'0 и s'1:
R2nT–1–T'(s'0)=C0,
RT'(s'1)=C1.
В распоряжении злоумышленника есть блок данных T с подписью s=(s0,s1), и это позволяет ему вычислить одно из значений s'0,s'1, даже не владея ключом подписи:
-
если T<T', то s'0=RT'(K0)=RT'–T(RT(K0))=RT'–T(s0),
-
если T>T', то s'1=R2nT–1–T'(K1)=RT–T'(R2nT–1–T(K1))=RT–T'(s1).
Однако для нахождения второй половины подписи (s'1 в случае (a) и s'0 в случае (b)) ему необходимо выполнить прокрутку в обратную сторону, т.е. найти Rk(X), располагая только значением для большего k: Rk'(X), k'>k, что является вычислительно невозможным. Таким образом, злоумышленник не может подделать подпись под сообщением, если не располагает секретным ключом подписи.
-
Второе требование также выполняется: вероятность подобрать блок данных T', отличный от блока T, но обладающий такой же цифровой подписью, чрезвычайно мала и может не приниматься во внимание. Действительно, пусть цифровая подпись блоков T и T' совпадает. Тогда подписи обоих блоков будут равны соответственно:
s=SnT(T)=(s0,s1)=(RT(K0), R2nT–1–T(K1)),
s'=SnT(T')=(s'0,s'1)=(RT'(K0), R2nT–1–T'(K1)),
s=s', следовательно:
RT(K0)=RT'(K0) & R2nT–1–T(K1)=R2nT–1–T'(K1).
Положим для определенности TT', тогда справедливо следующее:
RT'–T(K0*)=K0*,RT'–T(K1*)=K1*,где K0*=RT(K0), K1*=R2nT–1–T'(K1)
Последнее условие означает, что прокручивание двух различных блоков данных одно и то же число раз оставляет их значения неизменными. Вероятность такого события чрезвычайно мала и может не приниматься во внимание.
Таким образом рассмотренная модификация схемы Диффи–Хеллмана делает возможным подпись не одного бита, а целой битовой группы. Это позволяет в несколько раз уменьшить размер подписи и ключей подписи/проверки данной схемы. Однако надо понимать, что увеличение размера подписываемых битовых групп приводит к экспоненциальному росту объема необходимых вычислений и начиная с некоторого значения делает работу схемы недопустимо неэффективной. Граница «разумного размера» подписываемой группы находится где-то рядом с восемью битами, и блоки большего размера все равно необходимо подписывать «по частям».
Теперь найдем размеры ключей и подписи, а также объем необходимых для реализации схемы вычислений. Пусть размер хэш–блока и блока используемого шифра одинаковы и равны n, а размер подписываемых битовых групп равен nT. Предположим также, что если последняя группа содержит меньшее число битов, обрабатывается она все равно как полная nT-битовая группа. Тогда размеры ключей подписи/проверки и самой подписи совпадают и равны следующей величине:
бит,
где x обозначает округление числа x до ближайшего целого в сторону возрастания. Число операций шифрования EK(X), требуемое для реализации процедур схемы, определяются нижеследующими соотношениями:
-
при выработке ключевой информации оно равно:
,
-
при подписи и проверке подписи оно вдвое меньше:
.
В следующей ниже таблице 2 приведены рассчитанные значения размеров ключей и подписи, и числа требуемых операций шифрования в зависимости от размера подписываемых битовых групп при условии использования блочного криптоалгоритма с размером блока n=64 бита:
Таблица 2. Числовые показатели схемы подписи в зависимости от размера битовых групп.
| nT | Число бит. | Размер подписи и ключей, байт | Число операций шифрования | |
| групп | |KS|=|KC|=|s| | WK | WS=WC | |
| | 64 | 1024 | 128 | 64 |
| | 32 | 512 | 192 | 96 |
| | 22 | 352 | 308 | 154 |
| | 16 | 256 | 480 | 240 |
| | 13 | 208 | 806 | 403 |
| | 11 | 176 | 1386 | 693 |
| | 10 | 160 | 2540 | 1270 |
| | 8 | 128 | 4080 | 2040 |
| | 8 | 128 | 8176 | 4088 |
| | 7 | 112 | 14322 | 7161 |
| | 6 | 96 | 24564 | 12282 |
| | 6 | 96 | 49140 | 24570 |
| | 5 | 80 | 81910 | 40955 |
| | 5 | 80 | 163830 | 81915 |
| | 5 | 80 | 327670 | 163835 |
| | 4 | 64 | 524280 | 262140 |
Размер ключа подписи и проверки подписи можно дополнительно уменьшить следующими приемами:
-
Нет необходимости хранить ключи подписи отдельных битовых групп, их можно динамически вырабатывать в нужный момент времени с помощью генератора криптостойкой гаммы. Ключом подписи в этом случае будет являться обычный ключ использованного в схеме подписи блочного шифра. Для ГОСТа 28147–89 этот размер равен 256 битам, поэтому если схема подписи будет построена на ГОСТе, размер ключа подписи будет равен тем же 256 битам.
-
Точно так же, нет необходимости хранить массив ключей проверки подписи отдельных битовых групп блока, достаточно хранить его хэш-комбинацию. При этом алгоритм выработки ключа подписи и алгоритм проверки подписи будут дополнены еще одним шагом – вычислением хэш-кода для массива проверочных комбинаций отдельных битовых групп.
Таким образом, проблема размера ключей и подписи полностью решена, однако, главный недостаток схемы – одноразовость ключей – не преодолен, поскольку это невозможно в рамках подхода Диффи–Хеллмана. Для практического использования такой схемы, рассчитанной на подпись N сообщений, отправителю необходимо хранить N ключей подписи, а получателю – N ключей проверки, что достаточно неудобно. Однако эта проблема может быть решена в точности так же, как была решена проблема ключей для множественных битовых групп – генерацией ключей подписи для всех N сообщений из одного мастер-ключа и свертывание всех проверочных комбинаций в одну контрольную комбинацию с помощью алгоритма выработки хэш-кода. Такой подход решил бы проблему размера хранимых ключей, однако привел бы к необходимости вместе подписью каждого сообщения высылать недостающие N–1 проверочных комбинаций, необходимых для вычисления хэш-кода от массива всех контрольных комбинаций отдельных сообщений. Ясно, что такой вариант не обладает преимуществами по сравнению с исходным. Однако в [7] был предложен механизм, позволяющий значительно снизить остроту проблемы. Его основная идея – вычислять контрольную комбинацию (ключ проверки подписи) не как хэш от линейного массива проверочных комбинаций всех сообщений, а попарно – с помощью бинарного дерева. На каждом уровне проверочная комбинация вычисляется как хэш от двух проверочных комбинаций младшего уровня. Чем выше уровень комбинации, тем больше отдельных ключей проверки в ней «учтено». Предположим, что наша схема рассчитана на 2L сообщений. Обозначим через Ci(l) i-тую комбинацию l-того уровня. Если нумерацию комбинаций и уровней начинать с нуля, то справедливо следующее условие: 0i<2L–l, а i-тая проверочная комбинация l-того уровня рассчитана на 2l сообщений с номерами от i2l до (i+1)2l–1 включительно. Число комбинаций нижнего, нулевого уровня равно 2L, а самого верхнего, L-того уровня – одна, она и является контрольной комбинацией всех 2L сообщений, на которые рассчитана схема. На каждом уровне, начиная с первого, проверочные комбинации рассчитываются по следующей формуле:
2>














