Blog. Just Blog

Алгоритмы шифрования TEA и XTEA на Ассемблере

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Алгоритмы шифрования TEA и XTEA на Ассемблере
Алгоритмы шифрования TEA и XTEA на Ассемблере

Tiny Encryption Algorithm (TEA) - один из видов блочных алгоритмов шифрования данных. Главными отличиями TEA являются высокая скорость работы, нетребовательность к памяти и простота реализации на различных языках программирования. Не обошлось и без недостатков в виде уязвимости к некоторым типам криптографических атак, но даже несмотря на это алгоритм завоевал широкую популярность в различных системах.

У меня в качестве языка для реализации будет мой любимый Ассемблер. Сперва надо определить несколько констант, которые будут использоваться в обоих алгоритмах. В принципе, можно было бы обойтись и без них, прописав все нужные значения в коде функций, но так красивее.
  1. TEA_MAGIC1 = 09E3779B9h ; sqr(5)-1 * 2^31
  2. TEA_MAGIC2 = 0C6EF3720h ; TEA_MAGIC1 shl 5
  3. TEA_ROUNDS = 32
Функция шифрования принимает четыре параметра: lpData - указатель на блок данных, которые должны быть зашифрованы, ddSize - размер шифруемых данных, lpKey - ключ шифрования, это может быть не только строка, но и произвольные бинарные данные, dkSize - длина строки ключа. Несколько важных замечаний. Поскольку шифр блочный, размер шифруемых данных должен быть выровнен до кратности 8, это надо учитывать как при резервировании памяти под эти данные, так и при передаче размера данных в функцию шифрования. "Хвост", который может появиться при выравнивании, должен быть заполнен байтами 01h. Хранить зашифрованные данные надо также с учетом выравнивания, их размер может оказаться больше исходных данных. Размер ключа шифрования может быть произвольный, но реально использоваться будут только его первые 16 символов. Ключи меньшего размера допускаются.
  1. ;-------------------------------------------------------
  2. ; TEA Encryption
  3. ;-------------------------------------------------------
  4. ; Параметры:
  5. ;     lpData - указатель на шифруемые данные
  6. ;     ddSize - размер данных, выравненный до кратности 8
  7. ;     lpKey - указатель на строку ключа
  8. ;     dkSize - длина ключа
  9. ;-------------------------------------------------------
  10. proc TEA_encrypt lpData:DWORD, ddSize:DWORD, lpKey:DWORD, dkSize:DWORD
  11.         locals
  12.                 TEA_key rb 16
  13.         endl
  14.  
  15.         pusha
  16.  
  17.         ; Скопировать ключ шифрования
  18.         xor     eax,eax
  19.         mov     ecx,4
  20.         lea     edi,[TEA_key]
  21.         cld
  22.         rep     stosd
  23.         mov     ecx,[dkSize]
  24.         cmp     ecx,16
  25.         jbe     @f
  26.         mov     ecx,16
  27. @@:
  28.         mov     esi,[lpKey]
  29.         lea     edi,[TEA_key]
  30.         rep     movsb
  31.  
  32.         ; Цикл шифрования
  33.         mov     ebx,[lpData]
  34.         xor     ecx,ecx
  35. .loc_encrypt:
  36.         cmp     ecx,[ddSize]
  37.         jae     .loc_ret
  38.  
  39.         push    ecx
  40.         push    ebx
  41.  
  42.         mov     edi,[ebx+ecx+0]
  43.         mov     esi,[ebx+ecx+4]
  44.  
  45.         xor     edx,edx
  46.         mov     ecx,TEA_ROUNDS
  47.         lea     ebx,[TEA_key]
  48. @@:
  49.         add     edx,TEA_MAGIC1
  50.         mov     eax,esi
  51.         shl     eax,4
  52.         add     edi,eax
  53.         mov     eax,esi
  54.         xor     eax,[ebx+0]
  55.         add     edi,eax
  56.         mov     eax,esi
  57.         shr     eax,5
  58.         xor     eax,edx
  59.         add     edi,eax
  60.         add     edi,[ebx+4]
  61.         mov     eax,edi
  62.         shl     eax,4
  63.         add     esi,eax
  64.         mov     eax,edi
  65.         xor     eax,[ebx+8]
  66.         add     esi,eax
  67.         mov     eax,edi
  68.         shr     eax,5
  69.         xor     eax,edx
  70.         add     esi,eax
  71.         add     esi,[ebx+12]
  72.         dec     ecx
  73.         jnz     @b
  74.  
  75.         pop     ebx
  76.         pop     ecx
  77.  
  78.         mov     [ebx+ecx+0],edi
  79.         mov     [ebx+ecx+4],esi
  80.  
  81.         add     ecx,8
  82.         jmp     .loc_encrypt
  83. .loc_ret:
  84.         popa
  85.         ret
  86. endp
Функция расшифровки принимает в качестве параметров точно такие же данные. Указатель и размер шифрованных данных с учетом выравнивания, ключ и размер ключа для расшифровки. После расшифровки данные будут выровнены до границы 8 байт, поэтому при использовании алгоритма TEA надо обязательно где-то хранить размер исходных данных, чтобы обрезать ненужные "хвосты".
  1. ;-------------------------------------------------------
  2. ; TEA Decryption
  3. ;-------------------------------------------------------
  4. ; Параметры:
  5. ;     lpData - указатель на расшифровываемые данные
  6. ;     ddSize - размер данных, выравненный до кратности 8
  7. ;     lpKey - указатель на строку ключа
  8. ;     dkSize - длина ключа
  9. ;-------------------------------------------------------
  10. proc TEA_decrypt lpData:DWORD, ddSize:DWORD, lpKey:DWORD, dkSize:DWORD
  11.         locals
  12.                 TEA_key rb 16
  13.         endl
  14.  
  15.         pusha
  16.  
  17.         ; Скопировать ключ шифрования
  18.         xor     eax,eax
  19.         mov     ecx,4
  20.         lea     edi,[TEA_key]
  21.         cld
  22.         rep     stosd
  23.         mov     ecx,[dkSize]
  24.         cmp     ecx,16
  25.         jbe     @f
  26.         mov     ecx,16
  27. @@:
  28.         mov     esi,[lpKey]
  29.         lea     edi,[TEA_key]
  30.         rep     movsb
  31.  
  32.         ; Цикл расшифровки
  33.         mov     ebx,[lpData]
  34.         xor     ecx,ecx
  35. .loc_decrypt:
  36.         cmp     ecx,[ddSize]
  37.         jae     .loc_ret
  38.  
  39.         push    ecx
  40.         push    ebx
  41.  
  42.         mov     edi,[ebx+ecx+0]
  43.         mov     esi,[ebx+ecx+4]
  44.  
  45.         mov     edx,TEA_MAGIC2
  46.         mov     ecx,TEA_ROUNDS
  47.         lea     ebx,[TEA_key]
  48. @@:
  49.         mov     eax,edi
  50.         shl     eax,4
  51.         sub     esi,eax
  52.         mov     eax,edi
  53.         xor     eax,[ebx+8]
  54.         sub     esi,eax
  55.         mov     eax,edi
  56.         shr     eax,5
  57.         xor     eax,edx
  58.         sub     esi,eax
  59.         sub     esi,[ebx+12]
  60.         mov     eax,esi
  61.         shl     eax,4
  62.         sub     edi,eax
  63.         mov     eax,esi
  64.         xor     eax,[ebx+0]
  65.         sub     edi,eax
  66.         mov     eax,esi
  67.         shr     eax,5
  68.         xor     eax,edx
  69.         sub     edi,eax
  70.         sub     edi,[ebx+4]
  71.         sub     edx,TEA_MAGIC1
  72.         dec     ecx
  73.         jnz     @b
  74.  
  75.         pop     ebx
  76.         pop     ecx
  77.  
  78.         mov     [ebx+ecx+0],edi
  79.         mov     [ebx+ecx+4],esi
  80.  
  81.         add     ecx,8
  82.         jmp     .loc_decrypt
  83. .loc_ret:
  84.         popa
  85.         ret
  86. endp
После выявления слабых мест в исходном алгоритме TEA были созданы несколько его расширенных вариантов, нацеленных на устранение уязвимостей. Один из таких вариантов - алгоритм XTEA (Extended TEA). Поскольку он основан на оригинальном алгоритме, все требования к шифруемым данным и ключу, а также параметры вызова функций шифрования и расшифровки будут точно такие же. Функция шифрования:
  1. ;-------------------------------------------------------
  2. ; XTEA Encryption
  3. ;-------------------------------------------------------
  4. ; Параметры:
  5. ;     lpData - указатель на шифруемые данные
  6. ;     ddSize - размер данных, выравненный до кратности 8
  7. ;     lpKey - указатель на строку ключа
  8. ;     dkSize - длина ключа
  9. ;-------------------------------------------------------
  10. proc XTEA_encrypt lpData:DWORD, ddSize:DWORD, lpKey:DWORD, dkSize:DWORD
  11.         locals
  12.                 XTEA_key rb 16
  13.         endl
  14.  
  15.         pusha
  16.  
  17.         ; Скопировать ключ шифрования
  18.         xor     eax,eax
  19.         mov     ecx,4
  20.         lea     edi,[XTEA_key]
  21.         cld
  22.         rep     stosd
  23.         mov     ecx,[dkSize]
  24.         cmp     ecx,16
  25.         jbe     @f
  26.         mov     ecx,16
  27. @@:
  28.         mov     esi,[lpKey]
  29.         lea     edi,[XTEA_key]
  30.         rep     movsb
  31.  
  32.         ; Цикл шифрования
  33.         mov     ebx,[lpData]
  34.         xor     ecx,ecx
  35. .loc_encrypt:
  36.         cmp     ecx,[ddSize]
  37.         jae     .loc_ret
  38.  
  39.         push    ecx
  40.         push    ebx
  41.  
  42.         mov     esi,[ebx+ecx+0]
  43.         mov     edi,[ebx+ecx+4]
  44.  
  45.         xor     edx,edx
  46.         mov     ecx,TEA_ROUNDS
  47. @@:
  48.         push    ecx
  49.         mov     eax,edi
  50.         mov     ebx,edi
  51.         shl     eax,4
  52.         shr     ebx,5
  53.         mov     ecx,edx
  54.         xor     eax,ebx
  55.         and     ecx,3
  56.         add     eax,edi
  57.         lea     ebx,[XTEA_key]
  58.         mov     ebx,[ebx+4*ecx]
  59.         add     ebx,edx
  60.         xor     eax,ebx
  61.         add     edx,TEA_MAGIC1
  62.         add     esi,eax
  63.         mov     ecx,edx
  64.         mov     eax,esi
  65.         mov     ebx,esi
  66.         shl     eax,4
  67.         shr     ebx,5
  68.         shr     ecx,11
  69.         xor     eax,ebx
  70.         and     ecx,3
  71.         mov     ebx,edx
  72.         add     eax,esi
  73.         push    edx
  74.         lea     edx,[XTEA_key]
  75.         add     ebx,[edx+4*ecx]
  76.         pop     edx
  77.         xor     eax,ebx
  78.         add     edi,eax
  79.         pop     ecx
  80.         dec     ecx
  81.         jnz     @b
  82.  
  83.         pop     ebx
  84.         pop     ecx
  85.  
  86.         mov     [ebx+ecx+0],esi
  87.         mov     [ebx+ecx+4],edi
  88.  
  89.         add     ecx,8
  90.         jmp     .loc_encrypt
  91. .loc_ret:
  92.         popa
  93.         ret
  94. endp
Функция расшифровки:
  1. ;-------------------------------------------------------
  2. ; XTEA Decryption
  3. ;-------------------------------------------------------
  4. ; Параметры:
  5. ;     lpData - указатель на расшифровываемые данные
  6. ;     ddSize - размер данных, выравненный до кратности 8
  7. ;     lpKey - указатель на строку ключа
  8. ;     dkSize - длина ключа
  9. ;-------------------------------------------------------
  10. proc XTEA_decrypt lpData:DWORD, ddSize:DWORD, lpKey:DWORD, dkSize:DWORD
  11.         locals
  12.                 XTEA_key rb 16
  13.         endl
  14.  
  15.         pusha
  16.  
  17.         ; Скопировать ключ шифрования
  18.         xor     eax,eax
  19.         mov     ecx,4
  20.         lea     edi,[XTEA_key]
  21.         cld
  22.         rep     stosd
  23.         mov     ecx,[dkSize]
  24.         cmp     ecx,16
  25.         jbe     @f
  26.         mov     ecx,16
  27. @@:
  28.         mov     esi,[lpKey]
  29.         lea     edi,[XTEA_key]
  30.         rep     movsb
  31.  
  32.         ; Цикл расшифровки
  33.         mov     ebx,[lpData]
  34.         xor     ecx,ecx
  35. .loc_decrypt:
  36.         cmp     ecx,[ddSize]
  37.         jae     .loc_ret
  38.  
  39.         push    ecx
  40.         push    ebx
  41.  
  42.         mov     esi,[ebx+ecx+0]
  43.         mov     edi,[ebx+ecx+4]
  44.  
  45.         mov     edx,TEA_MAGIC2
  46.         mov     ecx,TEA_ROUNDS
  47. @@:
  48.         push    ecx
  49.         mov     eax,esi
  50.         mov     ebx,esi
  51.         shl     eax,4
  52.         shr     ebx,5
  53.         mov     ecx,edx
  54.         xor     eax,ebx
  55.         shr     ecx,11
  56.         add     eax,esi
  57.         mov     ebx,edx
  58.         and     ecx,3
  59.         sub     edx,TEA_MAGIC1
  60.         push    edx
  61.         lea     edx,[XTEA_key]
  62.         add     ebx,[edx+4*ecx]
  63.         pop     edx
  64.         xor     ebx,eax
  65.         sub     edi,ebx
  66.         mov     eax,edi
  67.         mov     ebx,edi
  68.         shl     eax,4
  69.         shr     ebx,5
  70.         mov     ecx,edx
  71.         xor     eax,ebx
  72.         and     ecx,3
  73.         mov     ebx,edx
  74.         add     eax,edi
  75.         push    edx
  76.         lea     edx,[XTEA_key]
  77.         add     ebx,[edx+4*ecx]
  78.         pop     edx
  79.         xor     ebx,eax
  80.         sub     esi,ebx
  81.         pop     ecx
  82.         dec     ecx
  83.         jnz     @b
  84.  
  85.         pop     ebx
  86.         pop     ecx
  87.  
  88.         mov     [ebx+ecx+0],esi
  89.         mov     [ebx+ecx+4],edi
  90.  
  91.         add     ecx,8
  92.         jmp     .loc_decrypt
  93. .loc_ret:
  94.         popa
  95.         ret
  96. endp
Все функции самодостаточные, не требуют никаких дополнительных переменных и массивов в сегменте данных. Исходный ключ также остается без изменений.

В приложении примеры двух программ с исходными текстами, которые сперва шифруют файл data_original.txt с помощью алгоритма TEA или XTEA, а затем расшифровывают его обратно.

Примеры программ с исходными текстами (FASM)Примеры программ с исходными текстами (FASM)

TEA.XTEA.Demo.zip (5,284 bytes)


Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 936 | Комментариев: 8

Комментарии

Отзывы посетителей сайта о статье
Olegych (27.12.2018 в 17:35):
Владислав, и судя по всему, в коде есть остатки от чего-то другого. Иначе как рационально можно объяснить, например, эту процедуру?

proc MemCopy,Source,Dest,ln   ; procedure from masm32 library

cld
mov esi, [Source]
mov edi, [Dest]
mov ecx, [ln]
shr ecx, 2
rep movsd
mov ecx, [ln]
and ecx, 3
rep movsb
ret
endp
Olegych (27.12.2018 в 17:16):
Владислав, возможно, что Вы не в курсе, но в Вашем говнокоде много лишнего - начиная от пустого инклюда macros.inc, заканчивая встроенным трояном.
ManHunter (16.12.2018 в 04:19):
Я тоже соглашусь, если мне поставят задачу сделать все максимально красиво, то я с радостью заюзаю нехилый такой бутербродик из всяких Blowfish, DES, AES и прочего, да еще и не по разу. И срать на время/ресурсы, бо выстрел будет разовый. Но если задача будет что-то типа шустро криптовать стрим в реальном времени, чисто чтобы мамкины хацкеры не подглядели, то блочный TEA тут как раз то что доктор прописал. А если надо прям ващще чтобы летало, то и банальный XOR с переменным ключом сгодится. Инструментарий же подбирается под задачу.
Владислав (16.12.2018 в 02:59):
ManHunter, согласен, но в таких случаях мне вот больше RC4 нравится, хотя вот он вообе уже дырявый, но для некоторых случаев годится (использую как деструктор структур - или как пояснить, перед реальным шифрованием хорошим шифром (чтоб не было возможности сравнивать пары открытый-закрытый текст - криптоаналитики в курсе))
ManHunter (15.12.2018 в 12:36):
Владислав, таким макаром сюда можно притянуть еще с десяток полноценных шифров. Но сравни размеры исходников и размеры получаемого кода. Для (X)TEA все укладывается в менее чем сотню строчек со всеми потрохами. Так что про устаревание не надо, у каждого алгоритма свои области применения.
Владислав (15.12.2018 в 03:36):
они устарели, дерите ГОСТ-14 Кузнечик - ra.nebka.ru/get/gost14.zip
ManHunter (14.12.2018 в 19:41):
А что еще надо? Full Retail? Или Cracked? :))
avp1965 (14.12.2018 в 19:34):
Айя-я-яй.... классическая мудрость гласит: "Вы в ответе за тех, кого приручили...". А, чего только Demo?

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2019
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.26 сек. / MySQL: 2 (0.0073 сек.) / Память: 4.75 Mb
Наверх