ACE Encrypt
ACE (Advanced Cryptographic Engine) — набор программных средств, реализующих шифрование в режиме схемы шифрования с открытым ключом, а также в режиме цифровой подписи. Соответствующие названия этих режимов — «ACE Encrypt» и «ACE Sign». Схемы являются вариантами реализации схем Крамера-Шоупа. Внесённые изменения нацелены на достижение наилучшего баланса между производительностью и безопасностью всей системы шифрования.
Авторы
Все алгоритмы, написанные в ACE, основаны на алгоритмах, разработанных Виктором Шоупом(Victor Shoup) и Рональдом Крамером (Ronald Cramer). Полная спецификация алгоритмов написана Виктором Шоупом. Реализация алгоритмов выполнена Томасом Швейнбергером(Thomas Schweinberger) и Медди Нассей (Mehdi Nassehi), их поддержкой и развитием занимается Виктор Шоуп. Томас Швейнберг принимал участие в составлении документа спецификаций ACE, а также написал руководство пользователя.
Рональд Крамер в настоящее время находится в университете Орхуса, Дания. Он принимал участие в работе, относящейся к ACE Encrypt пока находился в ETH в Цюрихе, Швейцария.
Медди Нассей и Томасом Швейнбергер работали над проектом ACE в исследовательской лаборатории IBM в Цюрихе, Швейцария, но в настоящее время закончили своё пребывание там.
Виктор Шоуп работает в исследовательской лаборатории IBM в Цюрихе, Швейцария.
Безопасность
Доказательство безопасности схемы шифрования и схемы цифровой подписи в ACE проводится с использованием обоснованных и естественных допущений. Четырьмя основными допущениями являются:
- Допущение Диффи-Хеллмана
- Сильное допущение RSA
- Стойкость к коллизиям на второй прообраз в SHA-1
- Псевдо-случайность режима сумматора/счётчика MARS
Основные обозначения и терминология
Приведём определения некоторых обозначений и терминов, используемых в данной статье.
Основные математические обозначения
[math]\displaystyle{ Z }[/math] — множество целых чисел.
[math]\displaystyle{ F_2[T] }[/math] — множество одномерных полиномов с коэффициентами в конечном поле [math]\displaystyle{ F_2 }[/math] с числом элементов поля — 2.
[math]\displaystyle{ A rem n }[/math] — такое целое число [math]\displaystyle{ r \in \left\{0,...,n-1\right\} }[/math], для которого [math]\displaystyle{ A\equiv r(mod n) }[/math] при целом [math]\displaystyle{ n\gt 0 }[/math] и [math]\displaystyle{ A \in Z }[/math].
[math]\displaystyle{ A rem f }[/math] — такой полином [math]\displaystyle{ r \in F_2[T] }[/math] с [math]\displaystyle{ deg(r)\lt deg(f) }[/math], такой что [math]\displaystyle{ A\equiv r(mod f) }[/math] при [math]\displaystyle{ A,f \in F_2[T],f \ne 0 }[/math].
Основные строковые обозначения
[math]\displaystyle{ A^{\ast} }[/math] — множество всевозможных строк.
[math]\displaystyle{ A^{n} }[/math] — множество всевозможных строк длины n.
Для [math]\displaystyle{ x \in A^{\ast} L(x) }[/math] — длина строки [math]\displaystyle{ x }[/math]. Обозначения для длины нулевой строки — [math]\displaystyle{ \lambda_A }[/math].
Для [math]\displaystyle{ x,y \in A^{\ast} }[/math] [math]\displaystyle{ x||y }[/math] — результат конкатенации строк [math]\displaystyle{ x }[/math] и [math]\displaystyle{ y }[/math].
Биты, байты, слова
[math]\displaystyle{ b\stackrel{\mathrm{def}}{=}\left\{0,1\right\} }[/math] — множество битов.
Рассмотрим множества вида [math]\displaystyle{ b, b^{n_1}, (b^{n_1})^{n_2},... }[/math]. Для такого множества A определим нулевой элемент:
[math]\displaystyle{ 0_b\stackrel{\mathrm{def}}{=}0 \in b }[/math];
[math]\displaystyle{ 0_{A^n}\stackrel{\mathrm{def}}{=}(0_A,...,0_A) \in A^n }[/math] для [math]\displaystyle{ n\gt 0 }[/math].
Определим [math]\displaystyle{ B\stackrel{\mathrm{def}}{=}b^8 }[/math] как множество байтов, а [math]\displaystyle{ W\stackrel{\mathrm{def}}{=}b^{32} }[/math] как множество слов.
Для [math]\displaystyle{ x \in A^{\ast} }[/math] с [math]\displaystyle{ A \in \left\{b,B,W\right\} }[/math] и [math]\displaystyle{ l\gt 0 }[/math] определим оператор заполнения:
[math]\displaystyle{ pad_l(x) \stackrel{\mathrm{def}}{=} \begin{cases} x, & L(x) \ge l \\ x||0_{A^{l-L(x)}}, & L(x)\lt l \end{cases} }[/math].
Оператор преобразования
Оператор преобразования [math]\displaystyle{ I_{src}^{dst}: src \rightarrow dst }[/math] выполняет преобразования между элементами [math]\displaystyle{ Z,F_2[T],b^{\ast},B^{\ast},W^{\ast} }[/math].
Схема шифрования
Пара ключей шифрования
В схеме шифрования ACE задействованы два типа ключей:
открытый ключ ACE: [math]\displaystyle{ (P,q,g_1,g_2,c,d,h_1,h_2,k_1,k_2) }[/math].
закрытый ключ ACE: [math]\displaystyle{ (w,x,y,z_1,z_2) }[/math].
Для заданного параметра размера [math]\displaystyle{ m }[/math], такого что [math]\displaystyle{ 1024 \le m \le 16384 }[/math], компоненты ключей определяются следующим образом:
[math]\displaystyle{ q }[/math] — 256-битное простое число.
[math]\displaystyle{ P }[/math] — m-битное простое число, такое что [math]\displaystyle{ P\equiv1(mod q) }[/math].
[math]\displaystyle{ g_1,g_2,c,d,h_1,h_2 }[/math] — элементы [math]\displaystyle{ \left\{1,...,P-1\right\} }[/math] (чей мультипликативный порядок по модулю [math]\displaystyle{ P }[/math] делит [math]\displaystyle{ q }[/math]).
[math]\displaystyle{ w,x,y,z_1,z_2 }[/math] — элементы [math]\displaystyle{ \left\{0,...,q-1\right\} }[/math].
[math]\displaystyle{ k_1,k_2 }[/math] — элементы [math]\displaystyle{ B^\ast }[/math], для которых [math]\displaystyle{ L(k_1)=20l^\prime+64 }[/math] и [math]\displaystyle{ L(k_2)=32\left\lceil l/16 \right\rceil+40 }[/math], где [math]\displaystyle{ l=\left\lceil m/8 \right\rceil }[/math] и [math]\displaystyle{ l^\prime=L_b(\left\lceil (2\left\lceil l/4 \right\rceil +4)/16 \right\rceil) }[/math].
Генерация ключа
Алгоритм. Генерация ключа для схемы шифрования ACE.
Вход: параметра размера [math]\displaystyle{ m }[/math], такой что [math]\displaystyle{ 1024 \le m \le 16384 }[/math].
Выход: пара открытый/закрытый ключ.
- Сгенерировать случайное простое число [math]\displaystyle{ q }[/math], такое что [math]\displaystyle{ 2^{255} \lt q \lt 2^{256} }[/math].
- Сгенерировать случайное простое число [math]\displaystyle{ P }[/math], [math]\displaystyle{ 2^{m-1} \lt P \lt 2^{m} }[/math], такое что [math]\displaystyle{ P\equiv1(mod q) }[/math].
- Сгенерировать случайное целое число [math]\displaystyle{ g_1 \in \left\{ 2,...,P-1 \right\} }[/math], такое что [math]\displaystyle{ g_1^q\equiv1(mod P) }[/math].
- Сгенерировать случайные целые числа [math]\displaystyle{ w \in \left\{ 1,...,q-1 \right\} }[/math] и [math]\displaystyle{ x,y,z_1,z_2 \in \left\{ 0,...,q-1 \right\} }[/math]
- Вычислить следующие целые числа в [math]\displaystyle{ \left\{ 1,...,P-1 \right\} }[/math]:
[math]\displaystyle{ g_2 \leftarrow g_1^w rem P }[/math],
[math]\displaystyle{ c \leftarrow g_1^x rem P }[/math],
[math]\displaystyle{ d \leftarrow g_1^y rem P }[/math],
[math]\displaystyle{ h_1 \leftarrow g_1^{z_1} rem P }[/math],
[math]\displaystyle{ h_2 \leftarrow g_1^{z_2} rem P }[/math].
- Сгенерировать случайные байтовые строки [math]\displaystyle{ k_1 \in B^{20l^\prime+64} }[/math] и [math]\displaystyle{ k_2 \in B^{2\left\lceil l/16 \right\rceil+40} }[/math], где [math]\displaystyle{ l=L_B(P) }[/math] и [math]\displaystyle{ l^\prime = L_B(\left\lceil (2\left\lceil l/4 \right\rceil +4)/16 \right\rceil) }[/math].
- Вернуть пару открытый/закрытый ключ
[math]\displaystyle{ ((P,q,g_1,g_2,c,d,h_1,h_2,k_1,k_2),(w,x,y,z_1,z_2)) }[/math]
Представление шифротекста
Шифротекст в схеме шифрования ACE имеет вид
[math]\displaystyle{ (s,u_1,u_2,v,e) }[/math],
где компоненты определяются следующим образом:
[math]\displaystyle{ u_1,u_2,v }[/math] — целые числа из [math]\displaystyle{ \left\{ 1,...,P-1 \right\} }[/math] (чей мультипликативный порядок по модулю [math]\displaystyle{ P }[/math] делит [math]\displaystyle{ q }[/math]).
[math]\displaystyle{ s }[/math] — элемент [math]\displaystyle{ W^4 }[/math].
[math]\displaystyle{ e }[/math] — элемент [math]\displaystyle{ B^{\ast} }[/math].
[math]\displaystyle{ s,u_1,u_2,v }[/math] назовём преамбулой, а [math]\displaystyle{ e }[/math] — криптограммой. Если текст — строка из [math]\displaystyle{ l }[/math] байт, то тогда длина [math]\displaystyle{ e }[/math] равна [math]\displaystyle{ l+16\left\lceil l/1024 \right\rceil }[/math].
Необходимо ввести функцию [math]\displaystyle{ CEncode }[/math], которая представляет шифротекст в виде байтовой строки, а также обратную функцию [math]\displaystyle{ CDecode }[/math]. Для целого [math]\displaystyle{ l\gt 0 }[/math], символьной строки [math]\displaystyle{ s \in W^4 }[/math], целых [math]\displaystyle{ 0 \le u_1,u_2,v\lt 256^l }[/math], и байтовой строки [math]\displaystyle{ e \in B^{\ast} }[/math],
[math]\displaystyle{ CEncode(l,s,u_1,u_2,v,e) \stackrel{\mathrm{def}}{=}I_{W^{\ast}}^{B^{\ast}}(s)||pad_l(I_{Z}^{B^{\ast}}(u_1))||pad_l(I_{Z}^{B^{\ast}}(u_2))||pad_l(I_{Z}^{B^{\ast}}(v))||e \in B^{\ast} }[/math].
Для целого [math]\displaystyle{ l\gt 0 }[/math], байтовой строки [math]\displaystyle{ \psi \in B^{\ast} }[/math], для которой [math]\displaystyle{ L(\psi) \ge 3l+16 }[/math],
[math]\displaystyle{ CDecode(l,\psi) \stackrel{\mathrm{def}}{=}(I_{B^{\ast}}^{W^{\ast}}(\Bigl[\psi\Bigr]_{0}^{16}),I_{B^{\ast}}^{Z}(\Bigl[\psi\Bigr]_{16}^{16+l}),I_{B^{\ast}}^{Z}(\Bigl[\psi\Bigr]_{16+l}^{16+2l}),I_{B^{\ast}}^{Z}(\Bigl[\psi\Bigr]_{16+2l}^{16+3l}),\Bigl[\psi\Bigr]_{16+3l}^{L(\psi)}) \in W^4 \times Z \times Z \times Z \times B^{\ast} }[/math].
Процесс шифрования
Алгоритм. Асимметричный процесс шифрования ACE.
Вход: открытый ключ [math]\displaystyle{ (P,q,g_1,g_2,c,d,h_1,h_2,k_1,k_2) }[/math] и байтовая строка [math]\displaystyle{ M \in B^{\ast} }[/math].
Выход: байтовая строка — шифротекст [math]\displaystyle{ \psi\ }[/math], полученный из [math]\displaystyle{ M }[/math].
- Сгенерировать случайное [math]\displaystyle{ r \in \left\{ 0,...,q-1 \right\} }[/math].
- Сгенерировать преамбулу шифротекста:
- Сгенерировать [math]\displaystyle{ s \in W^4 }[/math].
- Вычислить [math]\displaystyle{ u_1 \leftarrow g_1^r rem P }[/math], [math]\displaystyle{ u_2 \leftarrow g_2^r rem P }[/math].
- Вычислить [math]\displaystyle{ \alpha\ \leftarrow UOWHash^\prime (k_1,L_B(P),s,u_1,u_2) \in Z }[/math]; заметим, что [math]\displaystyle{ 0 \lt \alpha\ \lt 2^{160} }[/math].
- Вычислить [math]\displaystyle{ v \leftarrow c^r d^{\alpha\ r} rem P }[/math].
- Вычислить ключ для операции симметричного шифрования:
- [math]\displaystyle{ \tilde{h_1} \leftarrow h_1^r rem P }[/math], [math]\displaystyle{ \tilde{h_2} \leftarrow h_2^r rem P }[/math].
- Вычислить [math]\displaystyle{ k \leftarrow ESHash(k,L_B(P),s,u_1,u_2,\tilde{h_1},\tilde{h_2}) \in W^8 }[/math].
- Вычислить криптограмму [math]\displaystyle{ e \leftarrow SEnc(k,s,1024,M) }[/math].
- Закодировать шифротекст:
[math]\displaystyle{ \psi\ \leftarrow CEncode(L_B(P),s,u_1,u_2,v,e) }[/math].
- Вернуть [math]\displaystyle{ \psi\ }[/math].
Перед запуском процесса симметричного шифрования входное сообщение [math]\displaystyle{ M \in B^{\ast} }[/math] разбивается на блоки [math]\displaystyle{ M_1,...,M_t }[/math], где каждый блок кроме, возможно, последнего имеет 1024 байт. Каждый блок шифруется потоковым шифратором. Для каждого зашифрованного блока [math]\displaystyle{ E_i }[/math] вычисляется 16-байтовый код аутентификации. Получаем криптограмму
[math]\displaystyle{ e=E_1||C_1||...||E_t||C_t }[/math].
[math]\displaystyle{ L(e)=L(M)+16\left\lceil L(M)/m \right\rceil }[/math]. Заметим, что если [math]\displaystyle{ L(M)=0 }[/math], то [math]\displaystyle{ L(e)=0 }[/math].
Алгоритм. Симметричный процесс шифрования ACE.
Вход: [math]\displaystyle{ (k,s,M,m) \in W^8 \times W^4 \times Z \times B^{\ast} }[/math] [math]\displaystyle{ m\gt 0 }[/math]
Выход: [math]\displaystyle{ e \in B^l }[/math], [math]\displaystyle{ l=L(M)+16 \left\lceil L(N)/m \right\rceil }[/math].
- Если [math]\displaystyle{ M=\lambda_B }[/math], тогда вернуть [math]\displaystyle{ \lambda_B }[/math].
- Проинициализировать генератор псевдо-случайных чисел:
[math]\displaystyle{ genState \leftarrow InitGen(k,s) \in GenState }[/math]
- Сгенерировать ключ [math]\displaystyle{ k_{AXU} AXUHash }[/math]:
[math]\displaystyle{ (k_{AXU},genState) \leftarrow GenWords((5L_b(\left\lceil m/64 \right\rceil)+24),genState). }[/math].
- [math]\displaystyle{ e \leftarrow \lambda_B, i \leftarrow 0 }[/math].
- Пока [math]\displaystyle{ i\lt L(M) }[/math], выполнять следующее:
- [math]\displaystyle{ r \leftarrow min(L(M)-i,m) }[/math].
- Сгенерировать значения масок для шифрования и MAC:
- [math]\displaystyle{ (mask_m,genState) \leftarrow GenWords(4,genState) }[/math].
- [math]\displaystyle{ (mask_e,genState) \leftarrow GenWords(r,genState) }[/math].
- Зашифровать текст: [math]\displaystyle{ enc \leftarrow \Bigl[M\Bigr]_i^{i+r} \oplus mask_e }[/math].
- Сгенерировать аутентификационный код сообщения:
- Если [math]\displaystyle{ i+r=L(M) }[/math], тогда [math]\displaystyle{ lastBlock \leftarrow 1 }[/math]; иначе [math]\displaystyle{ lastBlock \leftarrow 0 }[/math].
- [math]\displaystyle{ mac \leftarrow AXUHash(k_{AXU},lastBlock,enc) \in W^4 }[/math].
- Обновить шифротекст: [math]\displaystyle{ e \leftarrow e||enc||I_{W^{\ast}}^{B^{\ast}}(mac \oplus mask_m) }[/math].
- [math]\displaystyle{ i \leftarrow i+r }[/math].
- Вернуть [math]\displaystyle{ e }[/math].
Процесс дешифрования
Алгоритм. Процесс дешифрования ACE.
Вход: открытый ключ [math]\displaystyle{ (P,q,g_1,g_2,c,d,h_1,h_2,k_1,k_2) }[/math] и соответствующий закрытый ключ [math]\displaystyle{ (w,x,y,z_1,z_2) }[/math], байтовая строка [math]\displaystyle{ \psi \in B^{\ast} }[/math].
Выход: Расшифрованное сообщение [math]\displaystyle{ M \in B^{\ast} \cup {Reject} }[/math].
- Дешифровать шифротекст:
- Если [math]\displaystyle{ L(\psi) \lt 3L_B(P)+16 }[/math], тогда вернуть [math]\displaystyle{ Reject }[/math].
- Вычислить:
[math]\displaystyle{ (s,u_1,u_2,v,e) \leftarrow CDecode(L_B(P),\psi) \in W^4 \times Z \times Z \times Z \times B^{\ast} }[/math];
заметим, что [math]\displaystyle{ 0 \le u_1,u_2,v\lt 256^l }[/math], где [math]\displaystyle{ l=L_B(P) }[/math].
- Подтвердить преамбулу шифротекста:
- Если [math]\displaystyle{ u_1 \ge P }[/math] или [math]\displaystyle{ u_2 \ge P }[/math] или [math]\displaystyle{ v \ge P }[/math], тогда вернуть [math]\displaystyle{ Reject }[/math].
- Если [math]\displaystyle{ u_1^q \ne 1 rem P }[/math], тогда вернуть [math]\displaystyle{ Reject }[/math].
- [math]\displaystyle{ reject \leftarrow 0 }[/math].
- Если [math]\displaystyle{ u_2 \ne u_1^w rem P }[/math], тогда [math]\displaystyle{ reject \leftarrow 1 }[/math].
- Вычислить [math]\displaystyle{ \alpha \leftarrow UOWHash^{\prime}(k_1,L_B(P),s,u_1,u_2) \in Z }[/math]; заметим, что [math]\displaystyle{ 0 \le \alpha \le 2^{160} }[/math].
- Если [math]\displaystyle{ v \ne u_1^{x+{\alpha}y} rem P }[/math], тогда [math]\displaystyle{ reject \leftarrow 1 }[/math].
- Если [math]\displaystyle{ reject=1 }[/math], тогда вернуть [math]\displaystyle{ Reject }[/math].
- Вычислить ключ для процесс симметричного дешифрования:
- [math]\displaystyle{ \tilde{h_1} \leftarrow u_1^{z_1} rem P }[/math], [math]\displaystyle{ \tilde{h_2} \leftarrow u_1^{z_2} rem P }[/math].
- Вычислить [math]\displaystyle{ k \leftarrow ESHash(k_2,L_B(P),s,u_1,\tilde{h_1},\tilde{h_2}) \in W^8 }[/math].
- Вычислить [math]\displaystyle{ M \leftarrow SDec(k,s,1024,e) }[/math];заметим, что [math]\displaystyle{ SDec }[/math] может вернуть [math]\displaystyle{ Reject }[/math].
- Вернуть [math]\displaystyle{ M }[/math].
Алгоритм. Операция дешифрования [math]\displaystyle{ SDec }[/math].
Вход: [math]\displaystyle{ (k,s,m,e) \in W^8 \times W^4 \times Z \times B^{\ast} }[/math] [math]\displaystyle{ m\gt 0 }[/math]
Выход: Расшифрованное сообщение [math]\displaystyle{ M \in B^{\ast} \cup {Reject} }[/math].
- Если [math]\displaystyle{ e=\lambda_B }[/math], тогда вернуть [math]\displaystyle{ \lambda_B }[/math].
- Проинициализировать генератор псевдо-случайных чисел:
[math]\displaystyle{ genState \leftarrow InitGen(k,s) \in GenState }[/math]
- Сгенерировать ключ [math]\displaystyle{ k_{AXU} AXUHash }[/math]:
[math]\displaystyle{ (k_{AXU},genState^{\prime}) \leftarrow GenWords((5L_b(\left\lceil m/64 \right\rceil)+24),genState). }[/math].
- [math]\displaystyle{ M \leftarrow \lambda_B, i \leftarrow 0 }[/math].
- Пока [math]\displaystyle{ i\lt L(e) }[/math], выполнять следующее:
- [math]\displaystyle{ r \leftarrow min(L(e)-i,m+16)-16 }[/math].
- Если [math]\displaystyle{ r \le 0 }[/math], тогда вернуть [math]\displaystyle{ Reject }[/math].
- Сгенерировать значения масок для шифрования и MAC:
- [math]\displaystyle{ (mask_m,genState) \leftarrow GenWords(4,genState) }[/math].
- [math]\displaystyle{ (mask_e,genState) \leftarrow GenWords(r,genState) }[/math].
- Подтвердить аутентификационный код сообщения:
- Если [math]\displaystyle{ i+r+16=L(M) }[/math], тогда [math]\displaystyle{ lastblock \leftarrow 1 }[/math]; иначе [math]\displaystyle{ lastblock \leftarrow 0 }[/math].
- [math]\displaystyle{ mac \leftarrow AXUHash(k_{AXU},lastBlock,\Bigl[e\Bigr]_i^{i+r}) \in W^4 }[/math].
- Если [math]\displaystyle{ \Bigl[e\Big]r_{i+r}^{i+r+16} \ne I_{W^{\ast}}^{B^{\ast}}(mac \oplus mask_m) }[/math], тогда вернуть [math]\displaystyle{ Reject }[/math].
- Обновить текст: [math]\displaystyle{ M \leftarrow M||(\Bigl[e\Bigr]_i^{i+r}) \oplus mask_e) }[/math].
- [math]\displaystyle{ i \leftarrow i+r+16 }[/math].
- Вернуть [math]\displaystyle{ M }[/math].
Схема цифровой подписи
В схеме цифровой подписи ACE задействованы два типа ключей:
открытый ключ цифровой подписи ACE: [math]\displaystyle{ (N,h,x,e^{\prime},k^{\prime},s) }[/math].
закрытый ключ цифровой подписи ACE: [math]\displaystyle{ (p,q,a) }[/math].
Для заданного параметра размера [math]\displaystyle{ m }[/math], такого что [math]\displaystyle{ 1024 \le m \le 16384 }[/math], компоненты ключей определяются следующим образом:
[math]\displaystyle{ p }[/math] — [math]\displaystyle{ \left\lfloor m/2 \right\rfloor }[/math]-битное простое число, для которого [math]\displaystyle{ (p-1)/2 }[/math] — тоже простое.
[math]\displaystyle{ q }[/math] — [math]\displaystyle{ \left\lfloor m/2 \right\rfloor }[/math]-битное простое число, для которого [math]\displaystyle{ (q-1)/2 }[/math] — тоже простое.
[math]\displaystyle{ N }[/math] — [math]\displaystyle{ N=pq }[/math]и может иметь как [math]\displaystyle{ m }[/math], так и [math]\displaystyle{ m-1 }[/math] бит.
[math]\displaystyle{ h,x }[/math] — элементы [math]\displaystyle{ \left\{1,...,N-1\right\} }[/math] (квадратичные остатки по модулю [math]\displaystyle{ N }[/math]).
[math]\displaystyle{ e^{\prime} }[/math] — 161-битное простое число.
[math]\displaystyle{ a }[/math] — элемент [math]\displaystyle{ \left\{0,...,(p-1)(q-1)/4-1\right\} }[/math]
[math]\displaystyle{ k^{\prime} }[/math] — элементы [math]\displaystyle{ B^{184} }[/math].
[math]\displaystyle{ s }[/math] — элементы [math]\displaystyle{ B^{32} }[/math].
Генерация ключа
Алгоритм. Генерация ключа для схемы цифровой подписи ACE.
Вход: параметра размера [math]\displaystyle{ m }[/math], такой что [math]\displaystyle{ 1024 \le m \le 16384 }[/math].
Выход: пара открытый/закрытый ключ.
- Сгенерировать случайные простые числа [math]\displaystyle{ p,q }[/math], такие что [math]\displaystyle{ (p-1)/2 }[/math] и [math]\displaystyle{ (q-1)/2 }[/math] — тоже простые, и
[math]\displaystyle{ 2^{m_1-1}\lt p\lt 2^{m_1} }[/math], [math]\displaystyle{ 2^{m_2-1}\lt q\lt 2^{m_2} }[/math], и [math]\displaystyle{ p \ne q }[/math],
где[math]\displaystyle{ m_1=\left\lfloor m/2 \right\rfloor }[/math] и [math]\displaystyle{ m_1=\left\lceil m/2 \right\rceil }[/math].
- Положить [math]\displaystyle{ N \leftarrow pq }[/math].
- Сгенерировать случайное простое число[math]\displaystyle{ e^{\prime} }[/math], где [math]\displaystyle{ 2^{160} \le e^{\prime} \le 2^{161} }[/math].
- Сгенерировать случайное [math]\displaystyle{ h^{\prime} \in \left\{1,...,N-1\right\} }[/math], при условии [math]\displaystyle{ gcd(h^{\prime},N)=1 }[/math] и [math]\displaystyle{ gcd(h^{\prime} \pm 1,N)=1 }[/math], и вычислить [math]\displaystyle{ h \leftarrow (h^{\prime})^{-2} rem N }[/math].
- Сгенерировать случайное [math]\displaystyle{ a \in \left\{0,...,(p-1)(q-1)/4-1\right\} }[/math] и вычислить [math]\displaystyle{ x \leftarrow h^a rem N }[/math].
- Сгенерировать случайные байтовые строки [math]\displaystyle{ k^{\prime} \in B^{184} }[/math], и [math]\displaystyle{ s \in B^{32} }[/math].
- Вернуть пару открытый ключ/закрытый ключ
[math]\displaystyle{ ((N,h,x,e^{\prime},k^{\prime},s),(p,q,a)) }[/math].
Представление подписи
Подпись в схеме цифровой подписи ACE имеет вид [math]\displaystyle{ (d,w,y,y^{\prime},\tilde{k}) }[/math], где компоненты определяются следующим образом:
[math]\displaystyle{ d }[/math] — элемент [math]\displaystyle{ B^{64} }[/math].
[math]\displaystyle{ w }[/math] — целое число, такое что [math]\displaystyle{ 2^{160} \le w \le 2^{161} }[/math].
[math]\displaystyle{ y,y^{\prime} }[/math] — элементы [math]\displaystyle{ \left\{1,...,N-1\right\} }[/math].
[math]\displaystyle{ \tilde{k} }[/math] — элемент [math]\displaystyle{ B^{\ast} }[/math];заметим, что [math]\displaystyle{ L(\tilde{k})=64+20L_B(\left\lceil (L(M)+8)/64 \right\rceil) }[/math], где [math]\displaystyle{ M }[/math] — подписываемое сообщение.
Необходимо ввести функцию [math]\displaystyle{ SEncode }[/math], которая представляет подпись в виде байтовой строки, а также обратную функцию [math]\displaystyle{ SDecode }[/math]. Для целого [math]\displaystyle{ l\gt 0 }[/math], байтовой строки [math]\displaystyle{ d \in B^{64} }[/math], целых [math]\displaystyle{ 0 \le w \le 256^{21} }[/math] и [math]\displaystyle{ 0 \le y,y^{\prime}\lt 256^l }[/math], и байтовой строки [math]\displaystyle{ \tilde{k} \in B^{\ast} }[/math],
[math]\displaystyle{ SEncode(l,d,w,y,y^{\prime},\tilde{k}) \stackrel{\mathrm{def}}{=}d||pad_{21}(I_{Z}^{B^{\ast}}(w))||pad_l(I_{Z}^{B^{\ast}}(y))||pad_l(I_{Z}^{B^{\ast}}(y^{\prime}))||\tilde{k} \in B^{\ast} }[/math].
Для целого [math]\displaystyle{ l\gt 0 }[/math], байтовой строки [math]\displaystyle{ \sigma \in B^{\ast} }[/math], для которой [math]\displaystyle{ L(\sigma) \ge 2l+53 }[/math],
[math]\displaystyle{ CSecode(l,\sigma) \stackrel{\mathrm{def}}{=}(\Bigl[\sigma\Bigr]_{0}^{64},I_{B^{\ast}}^{Z}(\Bigl[\sigma\Bigr]_{64}^{85}),I_{B^{\ast}}^{Z}(\Bigl[\sigma\Bigr]_{85}^{85+l}),I_{B^{\ast}}^{Z}(\Bigl[\sigma\Bigr]_{85+l}^{85+2l}),\Bigl[\sigma\Bigr]_{85+2l}^{L(\sigma)}) \in B^{64} \times Z \times Z \times Z \times B^{\ast} }[/math].
Процесс генерирования подписи
Алгоритм. Генерирование цифровой подписи ACE.
Вход: открытый ключ [math]\displaystyle{ (N,h,x,e^{\prime},k^{\prime},s) }[/math] и соответствующий закрытый ключ [math]\displaystyle{ (p,q,a) }[/math] и байтовая строка [math]\displaystyle{ M \in B^{\ast} }[/math], [math]\displaystyle{ 0 \le L(M) \le 2^{64} }[/math].
Выход: байтовая строка — цифровая подпись [math]\displaystyle{ \sigma \in B^{\ast} }[/math].
- Произвести следующие действия для хеширования входных данных:
- Сгенерировать случайно ключ хеша [math]\displaystyle{ \tilde{k} \in B^{20m+64} }[/math], такой что [math]\displaystyle{ m=L_b(\left\lceil (L(M)+8)/64 \right\rceil) }[/math].
- Вычислить [math]\displaystyle{ m_h \leftarrow I_{W^{\ast}}^{Z}(UOWHash^{\prime\prime}(\tilde{k},M)) }[/math].
- Выбрать случайное [math]\displaystyle{ \tilde{y} \in \left\{1,...,N-1\right\} }[/math], и вычислить [math]\displaystyle{ y^{\prime} \leftarrow \tilde{y}^2 rem N }[/math].
- Вычислить [math]\displaystyle{ x^{\prime} \leftarrow (y^{\prime})^{r^{\prime}}h^{m_h} rem N }[/math].
- Сгенерировать случайное простое число [math]\displaystyle{ e }[/math], [math]\displaystyle{ 2^{160} \le e \le 2^{161} }[/math], и его подтверждение корректности [math]\displaystyle{ (w,d) }[/math]: [math]\displaystyle{ (e,w,d) \leftarrow GenCertPrime(s) }[/math]. Повторять этот шаг до тех пор, когда [math]\displaystyle{ e \ne e^{\prime} }[/math].
- Положить [math]\displaystyle{ r \leftarrow UOWHash^{\prime\prime\prime}(k^{\prime},L_B(N),x^{\prime},\tilde{k}) \in Z }[/math]; заметим, что [math]\displaystyle{ 0 \le r \lt 2^{160} }[/math].
- Вычислить [math]\displaystyle{ y \leftarrow h^b rem N }[/math], где
[math]\displaystyle{ b \leftarrow e^{-1}(a-r)rem(p^{\prime}q^{\prime}) }[/math],
и где [math]\displaystyle{ p^{\prime}=(p-1)/2 }[/math] и [math]\displaystyle{ q^{\prime}=(q-1)/2 }[/math]. - Закодировать подпись:
[math]\displaystyle{ \sigma \leftarrow SEncode(L_B(N),d,w,y,y^{\prime},\tilde{k}) }[/math].
Замечания
В схемах шифрования и цифровой подписи ACE используются некоторые вспомогательные функции(такие как, например, UOWHash,ESHash и другие), описание которых выходит за рамки данной статьи. Подробнее о данных функциях можно найти в[1].
Реализация, применение и производительность
Схема шифрования ACE рекомендована проектом NESSIE (New European Schemes for Signatures, Integrity and Encryption) как асимметричная схема шифрования. Пресс-релиз датирован февралем 2003.
Обе схемы были реализованы в ANSI C, с использованием пакета GNU GMP. Тесты были проведены на двух платформах: Power PC 604 model 43P под системой AIX и 266 MHz Pentium под системой Windows NT. Таблицы показателей приведены ниже:
Таблица 1. Временные затраты на базовые операции.
| Power PC | Pentium | |||
| Размер операнда(байт) | Размер операнда(байт) | |||
| 512 | 1024 | 512 | 1024 | |
| Умножение | 3.5 * 10^(-5) сек | 1.0 * 10^(-4) сек | 4.5 * 10^(-5) сек | 1.4 * 10^(-4) сек |
| Возведение в квадрат | 3.3 * 10^(-5) сек | 1.0 * 10^(-4) сек | 4.4 * 10^(-5) сек | 1.4 * 10^(-4) сек |
| Потенцирование | 1.9 * 10^(-2) сек | 1.2 * 10^(-1) сек | 2.6 * 10^(-2) сек | 1.7 * 10^(-1) сек |
Таблица 2. Производительность схем шифрования и цифровой подписи.
| Power PC | Pentium | |||
| Постоянные затраты (мсек) | МБит/сек | Постоянные затраты (мсек) | МБит/сек | |
| Шифрование | 160 | 18 | 230 | 16 |
| Дешифрование | 68 | 18 | 97 | 14 |
| Подпись | 48 | 64 | 62 | 52 |
| Подпись (начальная установка) | 29 | 41 | ||
| Верификация | 52 | 65 | 73 | 53 |
Литература
- ↑ ACE: The Advanced Cryptographic Engine, T. Schweinberger and V. Shoup, manuscript 2000. Дата обращения: 17 декабря 2010. Архивировано 28 июля 2011 года.
Ссылки
- http://www.alphaworks.ibm.com/tech/ace Архивная копия от 26 июля 2011 на Wayback Machine
- http://www.zurich.ibm.com/security/ace/ Архивная копия от 28 июля 2011 на Wayback Machine
- NESSIE Portfolio of recommended cryptographic primitives Архивная копия от 12 августа 2011 на Wayback Machine