Code (Text): ;Key - указатель на ключ, длина 64 байта. ;Data - указатель на блок данных в 64 байта. Decrypt proc Key:dword, Data:dword LOCAL tKey:dword LOCAL counter :dword LOCAL _ebp :dword mov edi, 10h _nextdword: cmp edi, 0 jz _end dec edi mov counter, edi mov ebx, Data mov eax, Key mov eax, [eax+edi*4] mov ecx, eax and ecx, 0Fh push [ebx+edi*4] pop _ebp sub _ebp, eax mov edi, [ebx+ecx*4] sub edi, eax mov tKey, edi mov esi, _ebp and esi, eax mov edx, eax not edx and edi, edx or esi, edi mov edi, counter mov [ebx+edi*4], esi mov esi, tKey and esi, eax and _ebp, edx or esi, _ebp mov [ebx+ecx*4], esi jmp _nextdword _end: ret Decrypt endp Задача следующая: Известны входной и выходной блок данных (Data) необходимо получить ключ, но обратить аглоритм, что-то не получается. Может кто встречал такое, гляньте, в архиве исходники тестовой прогрммы которая криптует и раскриптвывает блок данных.
Проверьте правильно ли я это транслировал в С: Code (Text): void encrypt(uint32_t* Data, const uint32_t* Key) { for(int i=15;i>=0;--i) { uint32_t k = Key[i]; uint32_t j = k & 0x0F; uint32_t iKey = Data[i] - k; uint32_t jKey = Data[j] - k; Data[i] = (iKey & k) | (jKey & ~k); Data[j] = (jKey & k) | (iKey & ~k); } } Если так, то ключик должен вычисляться. Попробую расписать на досуге.
Кстати, вам нужно определять ключи на периодической основе или же нужно решить одноразовую проблему? В общем виде я писать не буду - слишком муторно (много вариантов), но один какой-то ключик могу вычислить...
по приведенному RElf-ом коду, вообще непонятно, на чем там сложность восстановления ключа держаться может? KeSqueer - стыдно за такое денег просить