📄 rc6.inc
字号:
comment *
Algorithm : RC6 by Ron Rivest and RSA Labs ( Block Cipher )
Block : 16 bytes
Round : 20
KeySize : 128/192/256 bits
Usage:
invoke rc6_setkey,addr ptrIndata,ptrIndata_length ( setkey )
128 bits : invoke rc6_setkey,addr ptrIndata,16
192 bits : invoke rc6_setkey,addr ptrIndata,24
256 bits : invoke rc6_setkey,addr ptrIndata,32
invoke rc6_encrypt,addr ptrIndata,addr ptrOutdata ( 16bytes : encrypt )
invoke rc6_decrypt,addr ptrIndata,addr ptrOutdata ( 16bytes : decrypt )
coded by x3chun (2004.05.04)
( x3chun@korea.com or x3chun@hanyang.ac.kr ) ( http://x3chun.wo.to )
comment *
rc6_setkey proto :DWORD,:DWORD
rc6_encrypt proto :DWORD,:DWORD
rc6_decrypt proto :DWORD,:DWORD
f_rnd macro i,a,b,c,d
mov ecx,d
lea eax,[d+d+1]
imul ecx,eax
rol ecx,5 ; u
mov eax,b
lea ebp,[b+b+1]
imul eax,ebp
rol eax,5 ; t
xor a,eax
rol a,cl
add a,l_key[i*4]
xor c,ecx
mov ecx,eax
rol c,cl
add c,l_key[i*4+4]
endm
i_rnd macro i,a,b,c,d
mov ecx,d
lea eax,[d+d+1]
imul ecx,eax
rol ecx,5 ; u
mov eax,b
lea ebp,[b+b+1]
imul eax,ebp
rol eax,5 ; t
sub a,l_key[i*4]
ror a,cl
xor a,eax
mov ebp,ecx
mov ecx,eax
sub c,l_key[i*4+4]
ror c,cl
xor c,ebp
endm
.const
_looprc6 equ 132
.data?
l_key dd 44 dup(?)
l dd 32 dup(?)
_round dd ?
.code
rc6_setkey proc ptrInkey:DWORD,ptrInkeylen:DWORD
pushad
lea edi,l_key+4
mov dword ptr [edi-4],0b7e15163h
mov ecx,43
@_r1:
mov eax,[edi-4]
sub eax,61C88647h
stosd
loop @_r1
mov eax,ptrInkeylen
shr eax,2
mov ecx,eax
dec eax
mov _round,eax
mov esi,ptrInkey
mov edi,offset l
rep movsd
xor eax,eax ;a
xor ecx,ecx ;b
xor edx,edx ; i
xor ebx,ebx ; j
mov edi,_looprc6
mov esi,offset l
@loop:
mov ebp,[edx*4+l_key]
add ebp,eax
add ebp,ecx
rol ebp,3
mov eax,ebp
mov [edx*4+l_key],eax
add ecx,eax
mov ebp,[ebx*4+esi]
add ebp,ecx
rol ebp,cl
mov ecx,ebp
mov [ebx*4+esi],ecx
cmp edx,43
jnz @_r2
xor edx,edx
jmp @@_r2
@_r2:
inc edx
@@_r2:
cmp ebx,_round
jnz @_r3
xor ebx,ebx
jmp @@_r3
@_r3:
inc ebx
@@_r3:
dec edi
jnz @loop
popad
ret
rc6_setkey endp
rc6_encrypt proc ptrInkey:DWORD, ptrOutkey:DWORD
pushad
mov esi,[esp+28h] ; ptrInkey
mov ebx,[esi+4] ; b
add ebx,[l_key]
mov edi,[esi+8] ;c
mov edx,[esi+12] ;d
add edx,[l_key+4]
mov esi,[esi] ; a
f_rnd 2,esi,ebx,edi,edx
f_rnd 4,ebx,edi,edx,esi
f_rnd 6,edi,edx,esi,ebx
f_rnd 8,edx,esi,ebx,edi
f_rnd 10,esi,ebx,edi,edx
f_rnd 12,ebx,edi,edx,esi
f_rnd 14,edi,edx,esi,ebx
f_rnd 16,edx,esi,ebx,edi
f_rnd 18,esi,ebx,edi,edx
f_rnd 20,ebx,edi,edx,esi
f_rnd 22,edi,edx,esi,ebx
f_rnd 24,edx,esi,ebx,edi
f_rnd 26,esi,ebx,edi,edx
f_rnd 28,ebx,edi,edx,esi
f_rnd 30,edi,edx,esi,ebx
f_rnd 32,edx,esi,ebx,edi
f_rnd 34,esi,ebx,edi,edx
f_rnd 36,ebx,edi,edx,esi
f_rnd 38,edi,edx,esi,ebx
f_rnd 40,edx,esi,ebx,edi
add esi,[l_key+4*42]
add edi,[l_key+4*43]
mov ecx,[esp+2ch] ; ptrOutkey
mov [ecx],esi
mov [ecx+4],ebx
mov [ecx+8],edi
mov [ecx+12],edx
popad
ret
rc6_encrypt endp
rc6_decrypt proc ptrInKey:DWORD, ptrOutkey:DWORD
pushad
mov esi,[esp+28h]
mov edx,[esi+12] ;d
mov edi,[esi+8] ;c
sub edi,[l_key+4*43]
mov ebx,[esi+4] ;b
mov esi,[esi] ;a
sub esi,[l_key+4*42]
i_rnd 40,edx,esi,ebx,edi
i_rnd 38,edi,edx,esi,ebx
i_rnd 36,ebx,edi,edx,esi
i_rnd 34,esi,ebx,edi,edx
i_rnd 32,edx,esi,ebx,edi
i_rnd 30,edi,edx,esi,ebx
i_rnd 28,ebx,edi,edx,esi
i_rnd 26,esi,ebx,edi,edx
i_rnd 24,edx,esi,ebx,edi
i_rnd 22,edi,edx,esi,ebx
i_rnd 20,ebx,edi,edx,esi
i_rnd 18,esi,ebx,edi,edx
i_rnd 16,edx,esi,ebx,edi
i_rnd 14,edi,edx,esi,ebx
i_rnd 12,ebx,edi,edx,esi
i_rnd 10,esi,ebx,edi,edx
i_rnd 8,edx,esi,ebx,edi
i_rnd 6,edi,edx,esi,ebx
i_rnd 4,ebx,edi,edx,esi
i_rnd 2,esi,ebx,edi,edx
sub edx,[l_key+4]
sub ebx,[l_key]
mov ecx,[esp+2ch] ; ptrOutkey
mov [ecx],esi
mov [ecx+4],ebx
mov [ecx+8],edi
mov [ecx+12],edx
popad
ret
rc6_decrypt endp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -