Добрый вечер,мне нужна ваша помощь в решении данной задачи Исходные данные: С помощью РПГЧ сформирована 64 битовая псевдослучайная пос- ледовательность. Задача: Необходимо составить оптимизированыый по скорости код, цель которого проверить уникальность значения каждого байта в этой последовательности.
Охрененный тест :-/ Смысла, как всегда, нет. Сугубо по решению задачи - создавать аналог хеш-таблицы. Только при коллизии не вставлять узел, а говорить об ошибке. На перле скрипт ваяется за две минуты.
вот мое решение: eax - major dword ebx - minor dword Код (Text): mov ecx,4d correct_sychro_message: push eax push ebx xor eax,ebx jne short next mov ecx,1 mov edx,0fh jmp short next next: pop ebx pop eax bswap eax mov al,bl bswap eax bswap ebx mov bl,al bswap ebx rol eax,8d rol ebx,8d loop correct_sychro_message xor dl,0fh je init_synchro_message volodya Смысл, спроси у разработчиков ГОСТа про уникальность и создание синхропосылки. Наверное есть, если они это ввели, а разрабатывали они не для нас а для себя. следовательно это что-то дает
EvilsInterrupt знаешь, уникальность синхропосылки -- это совсем не то де самое что уникальность каждого байта в 64-битной последовательности; синхропосылка 0х0000000000000000 ничем не хуже и не лучше чем 0х1223344556677889. наверное, прежде чем умные слова писать, нужно хоть немного подумать, да?
хорошо сказал. очевидно, с этим имеем ряд проблем. что же до тестов PRNG - таких много и я упоминал их на этом форуме. Кнут рулит. DieHard рулит. Автокорреляция, спектральные тесты - все это описано.
flankerx Я брал из А.Винокурова документ про ГОСТ про гаммирование со стр. 10, там и сказано, про выбор начального заполнения РПГЧ. Если я не так понял скажи где? вот дословно: "соседние значения, вырабатываемые РПГЧ должны отличаться друг от друга в каждом байте, иначе задача криптоаналитика будет упрощена"
EvilsInterrupt ну даже если и должны, что с того? соседние значения -- значит _ДВА _РАЗНЫХ_ IV, но никак не один и тот же.
flankerx Ты прав там получается два РГПЧ, один для c1, другой для c2 следовательно два dword`а говорят о том,что должны быть уни- кальны байты в каждой последовательности, а не во всей. А о том, что дополнять не следует нулями А.Винокуров гово- рил в своей статье когда речь шла про метод "простая замена" в частности когда последний блок менее чем 8 байт. А так как синхропосылка есть результат первой гаммы, а первая гамма есть результат 32-З от синхропосылки,то и здесь это условие также следует применять! Ссылка на доку ниже. В "Простая замена" п.2. Или я не прав? http://www.enlight.ru/crypto/frame.htm - поэтой ссылке можно найти доку которой я руковдствуюсь. называется она: "Алгоритм шифрования ГОСТ 28147-89, его использование и реализация, для компьютеров платформы Intel x86". Вот моя текущая реализация, она выполняет то, что мне надо. Но можно ли написать еще лучше? Может кому интересно напишет лучше меня. Код (Text): xor edx,edx mov ecx,2d correct_sychro_dword: push eax push ebx ror ebx,16d ror eax,16d xor ebx,[esp] jne short next_second mov dl,0fh mov ecx,1 jmp short next next_second: xor eax,[esp+4] jne short next mov dh,0f0h mov ecx,1 next: pop eax pop ebx ror ebx,8d ror eax,8d loop correct_sychro_dword xor dl,0fh je init_synchro_first xor dh,0f0h je init_synchro_second
64 битовая псевдослучайная последовательность. проверить уникальность значения каждого байта в этой последовательности. eax< edx< z> proc _check mov ecx,4 call @@1 jnz @@ex push edx,edx mov edx,eax call @@0 pop edx,eax jnz @@ex @@0: mov ecx,2 @@1: ror eax,8 push eax xor eax,edx mov ebx,7EFEFEFFh add ebx,eax not eax xor eax,ebx test eax,81010100h pop eax loopz @@1 @@ex: ret endp
Proteus, можешь, пожалуйста, прокомментировать как работает твой исходник ? Что-то не совсем понятно, как с помощью 6 итераций (4+2) и набора арифметическо-логических операций осуществляется проверка уникальности каждого байта в строке ?
Задачу можно усложнить, проверку не байтов а dword`ов в последовательности из 8ми dword`ов. Это нужно для генерации ключей, как правило для генерации используют какую либо хеш-функцию, но проверить ее результат не мешает, хоть это и бесмысслено
Вообще это может уже не актуально. Но я заданные числа накладываю сами на себя со смещением. Там где байты совпадают, получается ноль. После @@1 идёт проверка, не содержит ли регистр нулевой байт. Но вот чтобы этот момент понять уже нужно иметь какое-то воображение.