Алгоритмы шифрования TEA и XTEA на Ассемблере
Алгоритмы шифрования TEA и XTEA на Ассемблере
Tiny Encryption Algorithm (TEA) - один из видов блочных алгоритмов шифрования данных. Главными отличиями TEA являются высокая скорость работы, нетребовательность к памяти и простота реализации на различных языках программирования. Не обошлось и без недостатков в виде уязвимости к некоторым типам криптографических атак, но даже несмотря на это алгоритм завоевал широкую популярность в различных системах.
У меня в качестве языка для реализации будет мой любимый Ассемблер. Сперва надо определить несколько констант, которые будут использоваться в обоих алгоритмах. В принципе, можно было бы обойтись и без них, прописав все нужные значения в коде функций, но так красивее.
Code (Assembler) : Убрать нумерацию
- TEA_MAGIC1 = 09E3779B9h ; sqr(5)-1 * 2^31
- TEA_MAGIC2 = 0C6EF3720h ; TEA_MAGIC1 shl 5
- TEA_ROUNDS = 32
Code (Assembler) : Убрать нумерацию
- ;-------------------------------------------------------
- ; TEA Encryption
- ;-------------------------------------------------------
- ; Параметры:
- ; lpData - указатель на шифруемые данные
- ; ddSize - размер данных, выравненный до кратности 8
- ; lpKey - указатель на строку ключа
- ; dkSize - длина ключа
- ;-------------------------------------------------------
- proc TEA_encrypt lpData:DWORD, ddSize:DWORD, lpKey:DWORD, dkSize:DWORD
- locals
- TEA_key rb 16
- endl
- pusha
- ; Скопировать ключ шифрования
- xor eax,eax
- mov ecx,4
- lea edi,[TEA_key]
- cld
- rep stosd
- mov ecx,[dkSize]
- cmp ecx,16
- jbe @f
- mov ecx,16
- @@:
- mov esi,[lpKey]
- lea edi,[TEA_key]
- rep movsb
- ; Цикл шифрования
- mov ebx,[lpData]
- xor ecx,ecx
- .loc_encrypt:
- cmp ecx,[ddSize]
- jae .loc_ret
- push ecx
- push ebx
- mov edi,[ebx+ecx+0]
- mov esi,[ebx+ecx+4]
- xor edx,edx
- mov ecx,TEA_ROUNDS
- lea ebx,[TEA_key]
- @@:
- add edx,TEA_MAGIC1
- mov eax,esi
- shl eax,4
- add edi,eax
- mov eax,esi
- xor eax,[ebx+0]
- add edi,eax
- mov eax,esi
- shr eax,5
- xor eax,edx
- add edi,eax
- add edi,[ebx+4]
- mov eax,edi
- shl eax,4
- add esi,eax
- mov eax,edi
- xor eax,[ebx+8]
- add esi,eax
- mov eax,edi
- shr eax,5
- xor eax,edx
- add esi,eax
- add esi,[ebx+12]
- dec ecx
- jnz @b
- pop ebx
- pop ecx
- mov [ebx+ecx+0],edi
- mov [ebx+ecx+4],esi
- add ecx,8
- jmp .loc_encrypt
- .loc_ret:
- popa
- ret
- endp
Code (Assembler) : Убрать нумерацию
- ;-------------------------------------------------------
- ; TEA Decryption
- ;-------------------------------------------------------
- ; Параметры:
- ; lpData - указатель на расшифровываемые данные
- ; ddSize - размер данных, выравненный до кратности 8
- ; lpKey - указатель на строку ключа
- ; dkSize - длина ключа
- ;-------------------------------------------------------
- proc TEA_decrypt lpData:DWORD, ddSize:DWORD, lpKey:DWORD, dkSize:DWORD
- locals
- TEA_key rb 16
- endl
- pusha
- ; Скопировать ключ шифрования
- xor eax,eax
- mov ecx,4
- lea edi,[TEA_key]
- cld
- rep stosd
- mov ecx,[dkSize]
- cmp ecx,16
- jbe @f
- mov ecx,16
- @@:
- mov esi,[lpKey]
- lea edi,[TEA_key]
- rep movsb
- ; Цикл расшифровки
- mov ebx,[lpData]
- xor ecx,ecx
- .loc_decrypt:
- cmp ecx,[ddSize]
- jae .loc_ret
- push ecx
- push ebx
- mov edi,[ebx+ecx+0]
- mov esi,[ebx+ecx+4]
- mov edx,TEA_MAGIC2
- mov ecx,TEA_ROUNDS
- lea ebx,[TEA_key]
- @@:
- mov eax,edi
- shl eax,4
- sub esi,eax
- mov eax,edi
- xor eax,[ebx+8]
- sub esi,eax
- mov eax,edi
- shr eax,5
- xor eax,edx
- sub esi,eax
- sub esi,[ebx+12]
- mov eax,esi
- shl eax,4
- sub edi,eax
- mov eax,esi
- xor eax,[ebx+0]
- sub edi,eax
- mov eax,esi
- shr eax,5
- xor eax,edx
- sub edi,eax
- sub edi,[ebx+4]
- sub edx,TEA_MAGIC1
- dec ecx
- jnz @b
- pop ebx
- pop ecx
- mov [ebx+ecx+0],edi
- mov [ebx+ecx+4],esi
- add ecx,8
- jmp .loc_decrypt
- .loc_ret:
- popa
- ret
- endp
Code (Assembler) : Убрать нумерацию
- ;-------------------------------------------------------
- ; XTEA Encryption
- ;-------------------------------------------------------
- ; Параметры:
- ; lpData - указатель на шифруемые данные
- ; ddSize - размер данных, выравненный до кратности 8
- ; lpKey - указатель на строку ключа
- ; dkSize - длина ключа
- ;-------------------------------------------------------
- proc XTEA_encrypt lpData:DWORD, ddSize:DWORD, lpKey:DWORD, dkSize:DWORD
- locals
- XTEA_key rb 16
- endl
- pusha
- ; Скопировать ключ шифрования
- xor eax,eax
- mov ecx,4
- lea edi,[XTEA_key]
- cld
- rep stosd
- mov ecx,[dkSize]
- cmp ecx,16
- jbe @f
- mov ecx,16
- @@:
- mov esi,[lpKey]
- lea edi,[XTEA_key]
- rep movsb
- ; Цикл шифрования
- mov ebx,[lpData]
- xor ecx,ecx
- .loc_encrypt:
- cmp ecx,[ddSize]
- jae .loc_ret
- push ecx
- push ebx
- mov esi,[ebx+ecx+0]
- mov edi,[ebx+ecx+4]
- xor edx,edx
- mov ecx,TEA_ROUNDS
- @@:
- push ecx
- mov eax,edi
- mov ebx,edi
- shl eax,4
- shr ebx,5
- mov ecx,edx
- xor eax,ebx
- and ecx,3
- add eax,edi
- lea ebx,[XTEA_key]
- mov ebx,[ebx+4*ecx]
- add ebx,edx
- xor eax,ebx
- add edx,TEA_MAGIC1
- add esi,eax
- mov ecx,edx
- mov eax,esi
- mov ebx,esi
- shl eax,4
- shr ebx,5
- shr ecx,11
- xor eax,ebx
- and ecx,3
- mov ebx,edx
- add eax,esi
- push edx
- lea edx,[XTEA_key]
- add ebx,[edx+4*ecx]
- pop edx
- xor eax,ebx
- add edi,eax
- pop ecx
- dec ecx
- jnz @b
- pop ebx
- pop ecx
- mov [ebx+ecx+0],esi
- mov [ebx+ecx+4],edi
- add ecx,8
- jmp .loc_encrypt
- .loc_ret:
- popa
- ret
- endp
Code (Assembler) : Убрать нумерацию
- ;-------------------------------------------------------
- ; XTEA Decryption
- ;-------------------------------------------------------
- ; Параметры:
- ; lpData - указатель на расшифровываемые данные
- ; ddSize - размер данных, выравненный до кратности 8
- ; lpKey - указатель на строку ключа
- ; dkSize - длина ключа
- ;-------------------------------------------------------
- proc XTEA_decrypt lpData:DWORD, ddSize:DWORD, lpKey:DWORD, dkSize:DWORD
- locals
- XTEA_key rb 16
- endl
- pusha
- ; Скопировать ключ шифрования
- xor eax,eax
- mov ecx,4
- lea edi,[XTEA_key]
- cld
- rep stosd
- mov ecx,[dkSize]
- cmp ecx,16
- jbe @f
- mov ecx,16
- @@:
- mov esi,[lpKey]
- lea edi,[XTEA_key]
- rep movsb
- ; Цикл расшифровки
- mov ebx,[lpData]
- xor ecx,ecx
- .loc_decrypt:
- cmp ecx,[ddSize]
- jae .loc_ret
- push ecx
- push ebx
- mov esi,[ebx+ecx+0]
- mov edi,[ebx+ecx+4]
- mov edx,TEA_MAGIC2
- mov ecx,TEA_ROUNDS
- @@:
- push ecx
- mov eax,esi
- mov ebx,esi
- shl eax,4
- shr ebx,5
- mov ecx,edx
- xor eax,ebx
- shr ecx,11
- add eax,esi
- mov ebx,edx
- and ecx,3
- sub edx,TEA_MAGIC1
- push edx
- lea edx,[XTEA_key]
- add ebx,[edx+4*ecx]
- pop edx
- xor ebx,eax
- sub edi,ebx
- mov eax,edi
- mov ebx,edi
- shl eax,4
- shr ebx,5
- mov ecx,edx
- xor eax,ebx
- and ecx,3
- mov ebx,edx
- add eax,edi
- push edx
- lea edx,[XTEA_key]
- add ebx,[edx+4*ecx]
- pop edx
- xor ebx,eax
- sub esi,ebx
- pop ecx
- dec ecx
- jnz @b
- pop ebx
- pop ecx
- mov [ebx+ecx+0],esi
- mov [ebx+ecx+4],edi
- add ecx,8
- jmp .loc_decrypt
- .loc_ret:
- popa
- ret
- endp
В приложении примеры двух программ с исходными текстами, которые сперва шифруют файл data_original.txt с помощью алгоритма TEA или XTEA, а затем расшифровывают его обратно.
Просмотров: 3123 | Комментариев: 8
Метки: Assembler, полезные функции
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
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?
Добавить комментарий
Заполните форму для добавления комментария
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