· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› ГОСТ 28.147-89

. 1 . 2 . 3 . 4 . >>

Посл.отвђт Сообщенiе


Дата: Июл 8, 2004 22:41:30

Пишу прогу которая будет зашифровывать входной файл не больше
31 Мб и шифровать его по алгоритму согласно стандарту ГОСТ
28.147-89 и выдавать выходной.
Опираюсь на известную статью Андрея Винокурова:
"Алгоритм криптографического преобразования данных ГОСТ 28147
-89". У этой статьи есть существенный минус - это то, что не
каждый программист хороший математик. Это токо в идеале прог-
раммист - хороший прикладной математик, а что же делать тем
кто этого, как ни старается, но практически ни в зуб ногой?
Ну да ладно, беру любимый Tasm, дай кодерам Борланда вкусного
пива! Беру башку и пытаюсь разобраться как этот алгоритм дол-
жен работать, как его реализовать под Дос с применением 16ти
разрядной, то бишь безо всякий e.x(к примеру eax), на днях ре-
бята сказали интересные сорцы пришлют надо подготовиться :).
Для начала основной шаг, если что не так понимаю просьба ткнуть
и нормальным человским языком объяснить, хотя приветсвуется и
математика, но разжованная(для поднятия эрудиции других зашед-
ших):
1.Выбираем из таблицы ключа элемент ключа к примеру к0
2.Считываем 64 битный блок N делим его на n1,n2
/* далее основной шаг */
3.складываем n1 и к0 по mod2^32
4.Элементы из полученного и 32битного результа R=(r0,r1,r2,r3,
r4,r5,r6,r7) меняем на элементы таблицы замен S=(s0,s1,s2,s3,
s4,s5,s6,s7), слова Винокурова:
- Далее значение каждого из восьми блоков заменяется новым, ко-
торое выбирается по таблице замен следующим образом : значение
блока Si меняется на Si-тый по порядку элемент(нумерация с нуля)
i-того узла замен (т .е . i-той строки таблицы замен , нумерация
также с нуля ).

Вопрос1: Как это блин замена происходит, эти сухие математические
слова мне ничего не дают.
Вопрос2: Мне уже говорили что (A+B)mod2^32 это add a,b. Но поче-
му где логика, смысл?

Надеюсь не слишком напряг, если что извините!


Дата: Июл 8, 2004 23:54:19 · Поправил: Black_mirror

;перестановки различны!
sblock0 db <перестановка чисел от 0 до 15>
sblock1 db <перестановка чисел от 0 до 15>
sblock2 db <перестановка чисел от 0 до 15>
sblock3 db <перестановка чисел от 0 до 15>
sblock4 db <перестановка чисел от 0 до 15>
sblock5 db <перестановка чисел от 0 до 15>
sblock6 db <перестановка чисел от 0 до 15>
sblock7 db <перестановка чисел от 0 до 15>

;функция f(eax - r,edx - k)
  add eax,edx
;cмысл этого цикла в том, каждую 16-ричную цифру
;заменяем цифрой из соответствующей таблиц
  mov ecx,sblock0;база таблицы
.l0:
  mov ebx,eax;отправляем одну из цифр в регистр ebx
  and ebx,0Fh;мы её будем использовать в качестве индекса
  xor eax,ebx
  or al,byte [ecx+ebx];записываем на её место цифру из таблицы
  ror eax,4;переходим к цифре
  add ecx,16;и таблице
  cmp ecx,sblock+16*8
  jb .l0


Дата: Июл 9, 2004 17:17:57

Black_mirror
Спасибо большое за отклик, но ты наверное невидел.
Смысла что я этот основной шаг непонимаю точнее
замену, что и как там должно делаться иначе бы я не
привел бы слова Винокурова.
За код большое спасибо, хотя его не вижу, т.е. не по-
нимаю. Для этого см.выше! Если ты понимаешь, как
делается замена просьба поделиться.
Я хочу как ты мог видеть ранее реализовать его для
16ти разрядного доса, ну для 8086 чтоли. Ну нравится
мне этот проц!


Дата: Июл 9, 2004 17:53:36 · Поправил: Black_mirror

EvilsInterrupt

Для алгоритма требуется восемь таблиц сожержащих перестановки чисел от 0 до 15. Вот пример одной из таблиц:
;номер     0 1 2  3 4 5  6 7 8 9  A  B C  D E  F
sblock0 db 8,0,5,13,4,9,11,2,3,7,12,14,6,15,1,10
sblock1 db здесь другая перестановка 

и т.д.

Помещаем в регистр bx указатель на нулевую таблицу:
mov bx,sblock0

Загружаем в ax младшие 16 бит правой половины:
mov ax,word [R]

Получаем нулевой 4х битный блок:
mov si,ax
and si,0Fh

Обнуляем этот блок в регистре ax:
xor ax,si

Ну а вот и сама замена, на место нулевого блока записываем блок из таблицы, номер которого совпадает с числом содержащимся до этого в нулевом блоке:
or al,[bx+si]

То есть если в ax у нас например было 3В8Сh после выполнения этого кода в ax будет 3B86. И выполнив ror ax,4 и add bx,16 можно переходить к замене следующей цифры.

Как проще объяснить я не знаю, так как вся заменя осуществляется одной командой: or al,[bx+si] (или mov al,[bx+si] но тогда потеряется следующий блок)


Дата: Июл 9, 2004 19:31:23

В ГОСТе замена производится вот как.

DWORD рассматривается как массив из восьми элементов по 4 бита. Далее, к каждому элементу этого "массива" применяется операция a=Si[a], т.е. каждые 4 бита независимо от других заменяются на значение из таблицы, на которое эти самые 4 бита и указывают.

С точки зрения реализации ИМО лучше из 8 таблиц 16x4 сделать 4 256x8 -- проще и быстрее побайтовые замены делать.

В аттаче реализация, если интересно -- посмотри.

1286295530__gost_asm.asm


Дата: Июл 9, 2004 19:44:10

спасибо пойду смотреть!
Да линк на Романец ни кто случайно на int20h@yandex.ru


Дата: Июл 9, 2004 23:07:58

Я понял как происходит замена.
Теперь вопрос после того как заменили все элементы
мы делаем rol rezult,11d, получился S. А после это-
го мы что должны не шифрованную часть за xor`ить с
S? Получаем скажем А и что потом?
За аттачеваю свой проект, есть ли что не правильного
в работе или в эффективности для 16ти разрядной?

535376834__28.147_89.zip


Дата: Июл 10, 2004 11:03:10

в общем да. такая схема построения блочных шифров называется сетью Файстеля: входной блок делится на де равные части, далее на каждой итерации выполняется некоторая функция f() от одной половины (в ГОСТе от правой), результат этого выполнения ксорится с другой половиной ( с левой) и результат сохраняется в этой же части (т.е. в правой). Новой левой частью становится то, что было перед началом итерации в правой.

Вообще, советую почитать или сам ГОСТ или хотя бы какое-нибуь описание, хотя бы в том же Шнаере.


Дата: Июл 10, 2004 15:29:23

flankerx
Так в самом начале указал, что опираюсь на Андрея Винокурова. Но там такой густой лес Математических записей, что просто не сразу поймешь, что автор имел ввиду.


Дата: Июл 10, 2004 18:40:57

В основном шаге вспомогательный блок делится на n1,n2
далее (n1+k(i))mod 2^32, с результатом замена, и xor вмес-
те с n2, получаемое циклически сдвинуть на 11d(rol rezult,
cl, cl=11d) потом по Винокурову n2=n1,n1=rezult и теперь
у меня возникает непонимание, что на самом деле с n1 ни-
каких махинаций не делается, то в случае если информация
будет текстовой то это даст криптоаналитику даст пищу для
размышлений.
Может я что то не так понял?


Дата: Июл 10, 2004 19:12:58

у тебя 32 раунда шифрования. ты описал только один.

Давай так. Пусть f(x,k) -- это функция преобразования в одном цикле, т.е. сложение с подключом, S-блок, циклический сдвиг.

Пусть также n1i (n2i) -- значение правого (левого) блока после i-го раунда шифрования

Тогда перед выполнением алгоритма иммем
n20 = L, n10 = R (просто входные данные)

После первой итерации алгоритма:
n21=n10; n11=f(n10,k) XOR n20

После второй
n22=n11; n12=f(n11,k) XOR n21

И так 32 раза. Так что не похоже что где-то открытый текст остается.


Дата: Июл 10, 2004 21:29:24

Для генарации ключа и таблицы замен:
Задолбался делать генератор псесвдослучайных чисел
может кто подакажет хорошее решение диапазон {1,4}

Вот моя дурь!

1136918234__generat.asm


Дата: Июл 10, 2004 22:03:50

flankerx
Я думаю, смотри пикчу, мы из файла выбираем 64 битный
блок N1 делим на n1,n2.
шаг:
Далее складываем (n1+k(i)) mod2^32
получаем Sслож. далее делаем замену получаем Sз потом
rol Sз,11d итог Srol и xor Sr,n2 получаем Send. теперь я думаю
мы берем ki+1 и jmp шаг и так 32 раза.
После на место n2 ложим n1, а на n1 кидаем Send и выбираем
N2,N3... и так до конца массива данных.
Где глуплю?

845381851__crypt_bmp.zip


Дата: Июл 11, 2004 10:04:44

А что мешает тебе взять таблицы замены ГОСТа из Шнаера?
Свой ГСЧ лучше не пиши -- хорошо не получится, а плохо и rand() умеет.

Как только ты получил Send, ты в n1 записываешь Send XOR n2, а в n2 -- содержимое регистра n1 до начала раунда.
И вот только после этого повторяешь еще 31 раз этот цикл.

Если совсем непонятно -- поищи другие описания ГОСТа, погугль на тему "сети Файстеля", посмотри описание DESа на худой конец.

А вообще, наверное, тебе стоит посмотреть на существующие реализации -- в Интернете полно их и на Сях и на асме.. Да и здесь я вроде постил..


Дата: Июл 12, 2004 14:05:32

На сайте Винокурова А. есть исходники на асме под 16-ти разрядный проц. _http://www.enlight.ru/crypto/frame.htm если надо.
Этим ГОСТом я занимался, могу тебе посоветовать еще вести проверку нестойких и стойких таблиц перестановки.

. 1 . 2 . 3 . 4 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.211