MiniM Overview |
MiniM
Additional Tools | Jun 18,
2012 Генератор псевдослучайных чисел A4RNG A4rng - это потоковый генератор псевдослучайных чисел с переменным и многократно добавляемым ключем. Используется P-блок размером в 256 байт, сами элементы представляют собой перестановку чисел от 0 до 255, перестановка является функцией ключа или строки инициализации (зависит в т.ч. от дополнительного вектора IV). Базовая функция очень похожа на аналогичную используемую в алгоритме RC4 (1987 Ron Rivest RSA) но со значительной доработкой, перестановка выполняется еще в "глубину" по таблице P и несколько раз с использованием дополнительного смещения O (для ускорения лавинообразности). A4rng может находится в 256! состояниях , что достаточно для большинства приложений на много лет. Для устранения проблемы (RC4 - подобных алгоритмов )корреляции ключа и выходного потока, генератор пропускает первые A4RNG_DROP_N байт, прежде чем начнет отдавать значения. Оглавление
В качестве параметров передается:
Возвращается: значение/структура в которой хранится состояние генератора. Пример вызова: s %Z4=$zdll("call","ZA4rng.dll","init","ключ",1024,17) s %Z3=$zdll("call","ZA4rng.dll","init","ключ") Прочитать N байт, если без параметров, то вертаем 1 байт.
Возвращает: строку байтов длиной 2го параметра или 1 байт если параметр не указан. Пример: s b99=$zdll("call","ZA4rng.dll","rng",$na(%Z4),99) w !,$l(b99) 3. Добавит вектор(строку) в "мешанину" Добавляем в существующее состояние генератора дополнительную последовательность IV (как строка). Обязательный параметр ето имя переменной, где хранится состояние генератора. Возвращает 0 Пример: i $zdll("call","ZA4rng.dll","vector",$na(%Z4),"смещаемгенератор") 4. Пример использования всех функций zdll za4rng w $zdll("load","ZA4rng.dll") ; ;иниализация генератора, в %Z4 храним состояние генератора s (%Z0,%Z4)=$zdll("call","ZA4rng.dll","init","testkey") ; ;прочитать N байт, если без параметров, то вертаем 1 байт s ret=$zdll("call","ZA4rng.dll","rng",$na(%Z4),99) w !,$l(ret) ; ;проверка, что переменная %Z4 модифицирована i %Z0=%Z4 w !,"rng:problem modify %Z4" ; ;добавит IV вектор в ключ i $zdll("call","ZA4rng.dll","vector",$na(%Z4),"addingvector") ; ;шифровать или дешифровать строку, в данном случе шифровать, т.к. что ;бы дешифровать придется привести генератор в тоже состояние, что и до ;вызова,т.е. можно сохранить переменную %Z4 s %Z2=%Z4 ; ;строка для шифрования s text="plain" ;получили зашифрованую строку s code=$zdll("call","ZA4rng.dll","ecode",$na(%Z4),text) ; ;здесь уже дешифруем используя предыдущее состояние генератора из %Z2, ;в %Z4 уже другое состояне, после преобразования %Z2==%Z4! s plain=$zdll("call","ZA4rng.dll","ecode",$na(%Z2),code) ; w !,plain,"==",text ; ;пример хеширования строки/строк w !,"hash:",$zdll("call","ZA4rng.dll","hash","ключдляхеша",plain) ; w $zdll("unload","ZA4rng.dll") q ; Важно! Все генераторы псч должны инициализироватся перед использованием, чем интересней строка иницализации (и/или восстановление сохраненого состояния) тем лучше последовательность (хоть тесты и показывают, что генерится почти равномерное распределение значений). не забывайте почаще добавлять IV при длительных генерациях. struct A4RNG_T { BYTE P[A4RNG_P_SIZE]; // таблица перестановок, 0-255 (аналогично RC4) BYTE S,N,O; // индексы в таблице S-случаный,N-последовательный, // накапливамое смещение O для увеличения // лавинообразности WORD R,Y; // сколько раз крутануть блок // (при заполнении вектора) и байт }; A4RNG_EXPORT BYTE __A4rng_F(A4RNG_T *e, BYTE o); Базовая функция F преобразования байта. Байт о подмешивается в поток на выходе байт после преобразования. Алгоритм работает так: выполняется перестановка чисел от 0 до 255, применяются 3 счетчика, N,S,O , N-последовательно обегает все значения таблицы перестановок, S - выбирает псевдослучайное значение для обмена в таблице, O- "ускоритель" лавинообразности перестановки, таблица используется несколько раз в "глубину", прежде чем получить результат. A4RNG_EXPORT BYTE __A4rng_B(A4RNG_T *e, WORD n); Получаем следующий байт. N-сколько раз крутануть байт в таблице перестановок (функция F) прежде, чем его отдать в работу. A4RNG_EXPORT WORD __A4rng_W(A4RNG_T *e, WORD n); Получаем 16-бит (сдвоенный байт). A4RNG_EXPORT BYTE __A4rng_A(A4RNG_T *e, BYTE b, WORD n); Добавить байт в мешанину, покрутить N-раз. Фактически дополнительная инициализация блока перестановок. Данные функции _F,_B,_A,_W являются ядром генератора A4rng. A4RNG_EXPORT BYTE A4rng_B(A4RNG_T *e); Получить сл.байт prng A4RNG_EXPORT int A4rng_S(A4RNG_T *e, BYTE *o, DWORD z); Получить блок байтов длиной z A4RNG_EXPORT int A4rng_V(A4RNG_T *e, BYTE *v, DWORD z); Добавить вектор в мешанину. A4RNG_EXPORT void A4rng_I(A4RNG_T *e, BYTE *k, DWORD z, WORD r, WORD y); Первоначальная инициалализация, параметры:
На базе предыдущего функционала, пример организации функции хеширования Структура: typedef struct _A4RNG_HASH_T { QWORD L; // сколько всего пропихнули символов.. BYTE H[A4RNG_HASH_SIZE]; // здесь накапливается текущий хеш A4RNG_T E; // нам в помощь при формировании потока. } A4RNG_HASH_T; A4RNG_EXPORT void __A4rng_H(A4RNG_HASH_T *e, BYTE b); Базовая мешалка хеша. A4RNG_EXPORT void A4rng_HI(A4RNG_HASH_T *e, BYTE *s, DWORD z); Инициализация хеша,подмешиваем s - первоначальный ключ/вектор длиной z. A4RNG_EXPORT void A4rng_HU(A4RNG_HASH_T *e, BYTE *s, DWORD z); Обновление хеша, s-строка, z- длина строки. A4RNG_EXPORT int A4rng_HF(A4RNG_HASH_T *e, BYTE *s); Закончили/финиш работу и получили результат в массив s. Длина массива должна быть не мешьше чем размер хеша A4RNG_HASH_SIZE. Возвращает тек. размер хеша. A4RNG_EXPORT int A4rng_HFile (char *f, BYTE *pwd, DWORD pwd_z, BYTE *outh); A4RNG_EXPORT int A4rng_HS(BYTE *str, DWORD str_z, BYTE *pwd, DWORD pwd_z, BYTE *outh); Сервисные функции: хеш файла и хеш строки. A4RNG_EXPORT BYTE A4rng_E(A4RNG_T *e, BYTE b); A4RNG_EXPORT void A4rng_ES(A4RNG_T *e, BYTE *b, DWORD z); A4RNG_EXPORT int A4rng_EFile(char *from, char *to, BYTE *pwd, DWORD pwd_z); Пример функционала: симметричное де/шифрование байта, строки и файла, т.к. используется XOR для шифрования, то повторное использование тех же значений ключа/e позволяет расшифровать. Пример в приложении. A4RNG_EXPORT int A4rng_VS(A4RNG_T *e, char *to); Сохранить состояние ключа во внешнем файле. A4RNG_EXPORT int A4rng_VL(A4RNG_T *e, char *from); Восстановить состояние ключа из файла. Bin24bmp - Конвертируем любой файл в bmp картинку размерностью 24 бита, цветную, для просмотра результата в графическом вьюере, самый простой визуальный тест на "крипторафическую" стойкость (не должно быть регулярных скоплений и т.п. регулярных форм), остальные тесты стойкости проверяем через diehard и др..известные статистические программы. Testbit - формирует статистику использования битов. При правильной работе генератора, распределение должно быть максимально приближено к равномерному во всех таблицах.
Testbitlen - проверяет максимальные последовательности одинаковых бит.
Diehard - классическая утилита построения данных для анализа. Downloads Source code, a4rng.zip (ZIP, 40 Kb)
azbuka@rbcmail.ru
To add module send text description and zip archive to mail: support@minimdb.com
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Info Support |