|
转载:http://waitforlynn.spaces.live.com/blog/cns!F297AF6761A0D71!163.entry
(下面是TEA的汇编代码,感觉上面的C++语言还能优化下,可以使用汇编代码来写,所以先转载收藏下)
Tea加密算法的核心代码-Win32Asm原创
;---------------------------------
;Tea 加密算法
;Writer:Linfeng
;E-mail:foryouforhappy@gmail.com
;Date: 2007-1-21
.386
.model flat,stdcall
option casemap:none
;---------------------------------
;include 定义
include windows.inc
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
include gdi32.inc
includelib gdi32.lib
;---------------------------------
;equ 定义
DLG_Main equ 101
Main_Ico equ 103
Edt_Input equ 1001
Edt_key equ 1002
Edt_EncryptionStr equ 1004
Edt_IncryptionStr equ 1005
Btn_Encryption equ 1006h
Btn_Incryption equ 1007h
IDC_STATIC equ -1
;---------------------------------
;MACRO 宏定义
;---------------------------------
;data 数据段
.data
hInstance dd ?
strCaption db '系统提示',0
strText db '请输入轮数',0
strText1 db '请输入的密匙不正确!',0
FormatTea db '%08x%8x',0
TeaHex db 17 dup(0)
Key db 17 dup(0)
.data?
SumStrLen dd ? ;格式化后的串长度
lpSumStr dd ? ;格式化后的串的指针
;---------------------------------
;code 代码段
.code
;-----------------------------------
;格式化串
_FormatStrTea proc uses ebx edi esi _lpData
LOCAL @strLen
invoke lstrlen,_lpData ;取得字符串长度(byte)
mov @strLen,eax
shr eax,3 ;长度除8(byte)
inc eax
shl eax,3
mov SumStrLen,eax
invoke VirtualAlloc,NULL,SumStrLen,MEM_COMMIT,PAGE_EXECUTE_READWRITE
mov lpSumStr,eax
invoke RtlZeroMemory,lpSumStr,SumStrLen
mov esi,_lpData
mov edi,lpSumStr
mov ecx,@strLen
rep movsb
mov eax,lpSumStr
ret
_FormatStrTea endp
;---------------------------------
;Tea Hex Tea加密算法
_EncryptionTea proc uses ebx edi esi _lpData,_keyStr ;加密
LOCAL @v0,@v1
LOCAL @y,@z
LOCAL @Sum,@Delta
LOCAL @a_,@b_,@c_,@d_
LOCAL @_Count ;轮数
mov @_Count,32 ;32轮
mov @Sum,0 ;初始一些变量值
mov @Delta,9E3779B9h
;设置密匙
mov esi,_keyStr
mov edi,offset Key
mov ecx,16
rep movsb
mov edi,offset Key
mov eax,dword ptr [edi+0]
mov @a_,eax
mov eax,dword ptr [edi+4]
mov @b_,eax
mov eax,dword ptr [edi+8]
mov @c_,eax
mov eax,dword ptr [edi+12]
mov @d_,eax
invoke _FormatStrTea,_lpData
mov edi,lpSumStr
mov eax,dword ptr [edi+0]
mov @v0,eax
mov eax,dword ptr [edi+4]
mov @v1,eax
mov eax,@v0
mov @y,eax
mov eax,@v1
mov @z,eax
.while @_Count > 0
mov eax,@Sum ; Sum <- Sum + Delata
add eax,@Delta
mov @Sum,eax
;----------------------------
;y <- y +(((z<<4)+a)^(z+Sum)^((z>>5)+b))
mov eax,@z ; z << 4 --> eax
shl eax,4
add eax,@a_ ; a + (z<<4) --> ebx
mov ecx,@z ; ( z >> 5) + b --> ecx
shr ecx,5
add ecx,@b_
mov ebx,@z ; z + sum
add ebx,@Sum
xor eax,ebx
xor eax,ecx
add eax,@y
mov @y,eax
;------------------------------
;z <- z +(((y<<4)+c)^(y+Sum)^((y>>5)+d))
mov eax,@y ;(y << 4)+c --> eax
shl eax,4
add eax,@c_
mov ebx,@y ; y + sum --> ebx
add ebx,@Sum
mov ecx,@y ; Sum ^ (y>>5) --> ecx
shr ecx,5
add ecx,@d_
xor eax,ebx ; eax+ebx+ecx+d+z --> z
xor eax,ecx
add eax,@z
mov @z,eax
dec @_Count
.endw
mov eax,@y
xchg al,ah
rol eax,16
xchg al,ah
mov @v0,eax
mov eax,@z
xchg al,ah
rol eax,16
xchg al,ah
mov @v1,eax
mov edi,lpSumStr
mov eax,@v0
mov dword ptr [edi+0],eax
mov eax,@v1
mov dword ptr [edi+4],eax
invoke wsprintf,offset TeaHex,offset FormatTea,@v0,@v1
ret
_EncryptionTea endp
;-----------------------------------
_DecryptionTea proc uses ebx edi esi _lpData ;解密
LOCAL @v0,@v1
LOCAL @y,@z
LOCAL @Sum,@Delta
LOCAL @a_,@b_,@c_,@d_
LOCAL @_Count ;轮数
mov @_Count,32 ;32轮
mov @Sum,0c6ef3720h ;初始一些变量值
mov @Delta,09e3779b9h
mov edi,offset Key
mov eax,dword ptr [edi+0]
mov @a_,eax
mov eax,dword ptr [edi+4]
mov @b_,eax
mov eax,dword ptr [edi+8]
mov @c_,eax
mov eax,dword ptr [edi+12]
mov @d_,eax
mov edi,_lpData
mov eax,dword ptr [edi+0]
xchg al,ah
rol eax,16
xchg al,ah
mov @v0,eax
mov eax,dword ptr [edi+4]
xchg al,ah
rol eax,16
xchg al,ah
mov @v1,eax
mov eax,@v0
mov @y,eax
mov eax,@v1
mov @z,eax
.while @_Count > 0
;----------------------------
;z <- z - (((y<<4) + c)^(y + Sum)^((y>>5) + d))
mov eax,@y ; (y << 4) + c--> eax
shl eax,4
add eax,@c_
mov ebx,@y ; y + sum --> ebx
add ebx,@Sum
mov ecx,@y ; Sum ^ ( y >> 5) --> ecx
shr ecx,5
add ecx,@d_
xor eax,ebx ; eax +ebx + ecx + d -->eax
xor eax,ecx
mov ebx,eax
mov eax,@z
sub eax,ebx
mov @z,eax
;------------------------------
;y <- y - ((z<<4) + a)^(z + Sum)^((z>>5) + b))
mov eax,@z ;z << 4 --> eax
shl eax,4
add eax,@a_
mov ebx,@z ;z + Sum --> ebx
add ebx,@Sum
mov ecx,@z ; (z>>5)+ b--> ecx
shr ecx,5
add ecx,@b_
xor eax,ebx ;y-(eax^ebx^ecx) --> ebx
xor eax,ecx
mov ebx,eax
mov eax,@y
sub eax,ebx
mov @y,eax
mov eax,@Sum ;sum <-- sum - Delata
sub eax,@Delta
mov @Sum,eax
dec @_Count
.endw
mov eax,@y
mov @v0,eax
mov eax,@z
mov @v1,eax
mov edi,lpSumStr
mov eax,@v0
mov dword ptr [edi+0],eax
mov eax,@v1
mov dword ptr [edi+4],eax
ret
_DecryptionTea endp
PS:错误处请大家批评
提提供给大家使用,原本想用Win32Asm写一个QQ登陆的,结果对协议分析那块不熟.
等掌握了再写咯~!
|