FASM macro TEA implementation

Тема в разделе "WASM.CRYPTO", создана пользователем K_O_T, 9 фев 2005.

  1. K_O_T

    K_O_T New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2003
    Сообщения:
    25
    Пытаюсь реализовать шифроку данных алгоритмом TEA до записи в бинарник с помощью макроса в FASM.

    Сам алгоритм TEA(new)на С выглядит так :
    Код (Text):
    1. void encipher(const unsigned long *const v,unsigned long *const w,
    2.    const unsigned long * const k)
    3. {
    4.    register unsigned long       y=v[0],z=v[1],sum=0,delta=0x9E3779B9,n=32;
    5.  
    6.    while(n-->0)
    7.       {
    8.       y += (z << 4 ^ z >> 5) + z ^ sum + k[sum&3];
    9.       sum += delta;
    10.       z += (y << 4 ^ y >> 5) + y ^ sum + k[sum>>11 & 3];
    11.       }
    12.  
    13.    w[0]=y; w[1]=z;
    14. }
    15.  


    Шифровка 4х слов в FASM у меня выглядит(но не работает) так:
    Код (Text):
    1. macro Encipher src, dest, key {
    2.   local y, z, k, sum
    3.   sum = 0
    4.  
    5.   load y from src
    6.   load z from src + 4
    7.  
    8.   repeat N
    9.  
    10.     load k from (key + (sum and 3))
    11.     y = y + ((z shl 4) xor (z shr 5)) + (z xor sum) + k
    12.  
    13.     sum = sum + Delta
    14.  
    15.     load k from (key + ((sum shr 11) and 3))
    16.     z = z + ((y shl 4) xor (y shr 5)) + (y xor sum) + k;
    17.  
    18.   end repeat
    19.  
    20.   store dword y at dest
    21.   store dword z at dest + 4
    22. }  


    Поправьте, где был не прав :/
     
  2. Johnikum

    Johnikum Member

    Публикаций:
    0
    Регистрация:
    6 июн 2003
    Сообщения:
    97
    >repeat N

    Бегло взглянув. А откуда берется N?
     
  3. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    load по умолчанию читает байт, а на сколько я понял, нужно dword.
     
  4. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
    load y from src:0:4



    ?
     
  5. K_O_T

    K_O_T New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2003
    Сообщения:
    25
    to Johnikum:

    N, как и Delta определены ранее.



    to comrade:

    Похоже, что load y dword from src



    З.Ы. фасм - суперр.
     
  6. K_O_T

    K_O_T New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2003
    Сообщения:
    25
    Может я с С перевел не правильно?

    Обшибка звучит так: value out of range
     
  7. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    приоретет 'xor' в fasm выше, чем '+', а в Си наоборот.



    по поводу ошибки - делай and 0xffffffff перед сохранением

    т.к. fasm работает с 64 разрядной арифметикой может быть переполнение dword на отрицательных числах
     
  8. K_O_T

    K_O_T New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2003
    Сообщения:
    25
    Спасибо, ошибки "value out of range" больще нету.

    Но и шифрует не правильно. Я правильно перевел с С на макросы?
     
  9. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Приолрететы операций исправил?
     
  10. K_O_T

    K_O_T New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2003
    Сообщения:
    25
    ИМХО да :)


    Код (Text):
    1. macro Encipher src, dest, key {
    2.    local y, z, k, sum, a
    3.    sum = 0
    4.    load  y dword from src
    5.    load  z dword from (src + 4)
    6.  
    7.  
    8.   repeat N
    9.  
    10.     load k dword from (key + (sum and 3))
    11.     y = y + ( (((z shl 4) xor (z shr 5)) + z) xor (sum + k)     )
    12.     y = y and 0xFFFFFFFF
    13.  
    14.     sum = sum + Delta
    15.  
    16.     load k dword from (key + ((sum shr 11) and 3))
    17.     z = z + ( (((y shl 4) xor (y shr 5)) + y) xor (sum + k)    )
    18.     z = z and 0xFFFFFFFF
    19.  
    20.   end repeat
    21.  
    22.   store dword y at dest
    23.   store dword z at (dest + 4)
    24.  
    25. }




    Се равно не пашет :/
     
  11. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    K_O_T Ты видимо забыл умножить на размер дворда
    Код (Text):
    1. load k dword from (key + (sum and 3)*4)
    2. load k dword from (key + ((sum shr 11) and 3)*4)
     
  12. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Да, фасм рулит, воть даже крякмис можна сделать (ищет файл license, читает 16 байт, если ключ правильный выводит свой исходник и мессаджбокс :)

    [​IMG] 1440081727__xtea.exe
     
  13. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Код (Text):
    1. ;==============================================================
    2. macro       encrypt data,size,[arg] {local key
    3.  
    4.         if ~ arg eq
    5.            key file arg
    6.         else
    7.            key = demo
    8.         end if
    9. ;            ...
    10. ;            load k dword from (key+1*4) }
    11. ;==============================================================
    12. demo        dd      0x12345678,0x12345678,0x12345678,0x12345678
    13. ;==============================================================
    Примерно такой макрос вызываю так: "encrypt demo,$-demo" , всё нормально, но когда я хочу зашифровать какой-то участок с ключем из файла, то вызываю "encrypt demo,$-demo,'license'" и файл license оказывается включен в выходной файл, а этого как-раз и не надо. Как этого избежать в таком макросе, может virtual какой-то поможет?

    Или пытаюсь так, но пишет "invalid use of symbol"
    Код (Text):
    1. macro       encrypt [arg] {local k
    2.  
    3.             if ~ arg eq
    4.             load k dword from arg:1*4
    5.             end if
    6. }
    7.             encrypt,'license'
     
  14. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    попробуй убрать <font face="monospace]key file arg</font><!--face--> и <font face="monospace]load k dword from (key+1*4)</font><!--face--> заменить на что0то вроде:
    Код (Text):
    1.  
    2. virtual
    3.     file arg: N * 4, 4
    4.     load k dword from $-4
    5. end virtual
    6.  
     
  15. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Спасибо, хоть и дольше компиляется, но работает :)
    Код (Text):
    1. macro       encrypt data,size { d = data
    2. repeat      size
    3.         s = 0
    4.         load y dword from d
    5.         load z dword from (d + 4)
    6. repeat      32
    7.         virtual
    8.            file 'license': (s and 3)*4, 4
    9.            load k dword from $-4
    10.         end virtual
    11.         y = (y +((((z shl 4)xor(z shr 5))+z)xor(s+k)))and 0xffffffff
    12.         s = s + 0x9e3779b9
    13.         virtual
    14.            file 'license': ((s shr 11)and 3)*4, 4
    15.            load k dword from $-4
    16.         end virtual
    17.         z = (z +((((y shl 4)xor(y shr 5))+y)xor(s+k)))and 0xffffffff
    18. end repeat
    19.         store dword y at d
    20.         store dword z at (d + 4)
    21.         d = d + 8
    22. end repeat  }




    [​IMG] 995930221__xtea.zip