Пытаюсь реализовать шифроку данных алгоритмом TEA до записи в бинарник с помощью макроса в FASM. Сам алгоритм TEA(new)на С выглядит так : Код (Text): void encipher(const unsigned long *const v,unsigned long *const w, const unsigned long * const k) { register unsigned long y=v[0],z=v[1],sum=0,delta=0x9E3779B9,n=32; while(n-->0) { y += (z << 4 ^ z >> 5) + z ^ sum + k[sum&3]; sum += delta; z += (y << 4 ^ y >> 5) + y ^ sum + k[sum>>11 & 3]; } w[0]=y; w[1]=z; } Шифровка 4х слов в FASM у меня выглядит(но не работает) так: Код (Text): macro Encipher src, dest, key { local y, z, k, sum sum = 0 load y from src load z from src + 4 repeat N load k from (key + (sum and 3)) y = y + ((z shl 4) xor (z shr 5)) + (z xor sum) + k sum = sum + Delta load k from (key + ((sum shr 11) and 3)) z = z + ((y shl 4) xor (y shr 5)) + (y xor sum) + k; end repeat store dword y at dest store dword z at dest + 4 } Поправьте, где был не прав :/
to Johnikum: N, как и Delta определены ранее. to comrade: Похоже, что load y dword from src З.Ы. фасм - суперр.
приоретет 'xor' в fasm выше, чем '+', а в Си наоборот. по поводу ошибки - делай and 0xffffffff перед сохранением т.к. fasm работает с 64 разрядной арифметикой может быть переполнение dword на отрицательных числах
Спасибо, ошибки "value out of range" больще нету. Но и шифрует не правильно. Я правильно перевел с С на макросы?
ИМХО да Код (Text): macro Encipher src, dest, key { local y, z, k, sum, a sum = 0 load y dword from src load z dword from (src + 4) repeat N load k dword from (key + (sum and 3)) y = y + ( (((z shl 4) xor (z shr 5)) + z) xor (sum + k) ) y = y and 0xFFFFFFFF sum = sum + Delta load k dword from (key + ((sum shr 11) and 3)) z = z + ( (((y shl 4) xor (y shr 5)) + y) xor (sum + k) ) z = z and 0xFFFFFFFF end repeat store dword y at dest store dword z at (dest + 4) } Се равно не пашет :/
K_O_T Ты видимо забыл умножить на размер дворда Код (Text): load k dword from (key + (sum and 3)*4) load k dword from (key + ((sum shr 11) and 3)*4)
Да, фасм рулит, воть даже крякмис можна сделать (ищет файл license, читает 16 байт, если ключ правильный выводит свой исходник и мессаджбокс 1440081727__xtea.exe
Код (Text): ;============================================================== macro encrypt data,size,[arg] {local key if ~ arg eq key file arg else key = demo end if ; ... ; load k dword from (key+1*4) } ;============================================================== demo dd 0x12345678,0x12345678,0x12345678,0x12345678 ;============================================================== Примерно такой макрос вызываю так: "encrypt demo,$-demo" , всё нормально, но когда я хочу зашифровать какой-то участок с ключем из файла, то вызываю "encrypt demo,$-demo,'license'" и файл license оказывается включен в выходной файл, а этого как-раз и не надо. Как этого избежать в таком макросе, может virtual какой-то поможет? Или пытаюсь так, но пишет "invalid use of symbol" Код (Text): macro encrypt [arg] {local k if ~ arg eq load k dword from arg:1*4 end if } encrypt,'license'
попробуй убрать <font face="monospace]key file arg</font><!--face--> и <font face="monospace]load k dword from (key+1*4)</font><!--face--> заменить на что0то вроде: Код (Text): virtual file arg: N * 4, 4 load k dword from $-4 end virtual
Спасибо, хоть и дольше компиляется, но работает Код (Text): macro encrypt data,size { d = data repeat size s = 0 load y dword from d load z dword from (d + 4) repeat 32 virtual file 'license': (s and 3)*4, 4 load k dword from $-4 end virtual y = (y +((((z shl 4)xor(z shr 5))+z)xor(s+k)))and 0xffffffff s = s + 0x9e3779b9 virtual file 'license': ((s shr 11)and 3)*4, 4 load k dword from $-4 end virtual z = (z +((((y shl 4)xor(y shr 5))+y)xor(s+k)))and 0xffffffff end repeat store dword y at d store dword z at (d + 4) d = d + 8 end repeat } 995930221__xtea.zip