Помогите определить закономерность.

Тема в разделе "WASM.CRYPTO", создана пользователем Oxy, 16 ноя 2009.

  1. Oxy

    Oxy New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2005
    Сообщения:
    28
    Какой-то примитивный хеш. На выходе всего один ворд :)

    Вот нескошлько примеров (блок заполнен константой (она слева), а справа--результаты для блока длиной 1, 2, 3 и т.д. байт).
    00:=0000,0000.
    АА:=AA00,AAAA,54AB,5555,FF55,FFFF,AA00.
    BB:=BB00,BBBB,76BC,7777,3278,3333,EE33,EEEE,
    A9EF,AAAA,65AB,6666,2167,2222,ED22,DDDD,,
    CC:=CC00,CCCC,,
    DD DD DD=DD00,DDDD,BADE,,
    EE:=EE00,EEEE,DCEF,DDDD,CBDE,CCCC,BACD,BBBB,,
    FF:=FF00,FFFF,FF00.

    Хотелось бы узнать формулу.
     
  2. Oxy

    Oxy New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2005
    Сообщения:
    28
    DD:=DD00,DDDD,BADE,BBBB,98BC,9999,769A,7777,
    5478,5555,3256,3333,1034,1111,EE11,EEEE,
    CBEF,CCCC(A9CD,AAAA,87AB,8888,6589,6666,
    4367,4444,2145,2222)FF22,FFFF,DD00.
     
  3. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Oxy
    Это обычное сложение по модулю 65535.
     
  4. Oxy

    Oxy New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2005
    Сообщения:
    28
    А можно привести алгоритм на Асме? А то я в матчасти не силен :dntknw:
     
  5. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Oxy
    Код (Text):
    1. char buf[N];
    2. uint32 sum=0;
    3. for(i=0;i<(N&-2);i+=2)
    4.   sum+=*(uint16*)(buf+i);
    5. if(N&1)
    6.   sum+=*(uint8*)(buf+(N&-2));
    7. sum%=65535;
     
  6. Oxy

    Oxy New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2005
    Сообщения:
    28
    Код для меня нечитабельный (Си наверное--так я его не знаю :)
    Но все равно спасибо! Я уже разобрался. Просто сразу не въехал, что суммируются слова, а не байты.
    Вот код, воспроизводящий цепочку (точне, ее четные звенья):
    (константу полдожить в Bx)
    Код (Text):
    1. 0050AFEE      66:03C3       ADD AX,BX
    2. 0050AFF1      66:83D0 00    ADC AX,0
    3. 0050AFF5    ^ EB F7         JMP SHORT 0050AFEE
     
  7. Oxy

    Oxy New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2005
    Сообщения:
    28
    Походу, оказалось, что всё не так просто. :dntknw:
    При большой длине блока последовательность нарушается!
    Вот пример:
    Код (Text):
    1. DD:[256k-5(626139)]:FD22,FEFF,DB00,DCDD,B9DE,BABB,97BC
    Какие есть идеи?
     
  8. Oxy

    Oxy New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2005
    Сообщения:
    28
    Небольшая ошибка в стартовой длине блока (в скобках, а 256к-5--правильно):
    DD:[256k-5(262139)]:FD22,FEFF,DB00,DCDD,B9DE,BABB,97BC
     
  9. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Oxy
    Просто в программе используется не совсем правильный алгоритм, который на блоках длинее 64К слов в общем случае может работать не правильно:
    Код (Text):
    1. xor eax,eax
    2. xor ebx,ebx
    3. jmp c
    4. s:
    5. mov bx,[edx]
    6. add eax,ebx
    7. add edx,2
    8. c:
    9. sub ecx,2
    10. jnc s
    11. test cl,1
    12. jz e
    13. movzx ebx,byte [edx]
    14. add eax,ebx
    15. e:
    16. mov ebx,eax
    17. shr eax,16
    18. add ax,bx
    19. adc ax,0
     
  10. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Oxy
    Попробуй конец моего кода заменить на:
    Код (Text):
    1. e:
    2. cdq
    3. mov ecx,65535
    4. idiv ecx
    5. xchg eax,edx
    Возможно что там дело в переполнении.
     
  11. Oxy

    Oxy New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2005
    Сообщения:
    28
    Этот хвост совсем не подходит: с ним цепочка FF принимает вид:
    FF00,0000,FF00

    Кроме того, два предыдущих моих поста оказались БРЕДОМ :dntknw:
    Как бы их удалить ???

    На самом деле, цепочка FF мутирует гараздо раньше 32-х К, и после 64k эта мутация не отменяется, причем это не простое вычитание единицы
    FF00,FFFF,FF00,..FE00,FFFF,FE00,..(1082300:)F7FF,F600...
     
  12. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Oxy
    Тогда к хвосту нужно добавить cmp ax,1/adc ax,0.
    Вообще если считать по модулю 65535, то 0000 и FFFF эквивалентны.

    Чтобы выяснить где именно в функции баг, нужно посмотреть несколько элементов последовательности при количестве слов около 7FFFFFFF/W, FFFFFFFF/W,17FFFFFFF/W, где W это слово(не байт) которым заполнен буфер. Нечетное количество байт можно пока не рассматривать, как они обрабатываются можно будет определить потом.

    Вообще очень желательно увидеть код самой функции которая это считает. Вы его можете вытащить?
     
  13. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Black_mirror
    Он же код функции уже цитировал (адрес 0050AFEE). Непонятно, зачем тогда это соревнование на эрудицию?
     
  14. Oxy

    Oxy New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2005
    Сообщения:
    28
    Спасибо! Я, уже расковырял :)
    Все свелось к предложеному Вами коду, только без последнего adc. Кроме того, сразу я не учел, что при поблочной обработке большого массива (когда процедура вызывается многократно), коррекцию суммы следует делать не для каждого блока, а только один раз, после обработки всего массива.
     
  15. Oxy

    Oxy New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2005
    Сообщения:
    28
    crypto
    То был не код функции, а код, успешно воспроизводящий цепочку для малых блоков.

    Функцию я только сейчас расковырял.