📄 rc2.inc
字号:
comment *
Algorithm : RC2 by RSA security labs ( Block Cipher )
Block : 8 bytes
KeySize ; (between 1 and 128 bytes)
ex) 128 bits (16 bytes) RC2_KEY_SIZE = 128
ex) 64 bits ( 8 bytes ) RC2_KEY_SIZE = 64
Usage : invoke rc2_setkey,addr ptrIndata,ptrIndata_length ( Setkey )
invoke rc2_encrypt,addr ptrIndata,addr ptrOutdata ( Encrypt )
invoke rc2_decrypt,addr ptrIndata,addr ptrOutdata ( Decrypt )
coded by x3chun ( 2004.01.22)
( x3chun@korea.com or x3chun@hanyang.ac.kr ) ( http://x3chun.wo.to )
comment *
_enc macro A,B,C,D,round,rotAmount
mov bp,C
mov si,C
not si
and si,B
and bp,D
add A,si
add A,bp
mov bp,word ptr [rc2keytable+round]
add A,bp
rol A,rotAmount
endm
_dec macro A,B,C,D,round,rotAmount
ror A,rotAmount
mov bp,D
mov si,D
not bp
and bp,B
and si,C
sub A,bp
sub A,si
mov bp,word ptr [rc2keytable+round]
sub A,bp
endm
encR macro A,B,C,D,round
_enc A,B,D,C,(round*8)+0*2,1
_enc B,C,A,D,(round*8)+1*2,2
_enc C,D,B,A,(round*8)+2*2,3
_enc D,A,C,B,(round*8)+3*2,5
endm
decR macro A,B,C,D,round
_dec D,A,B,C,(round*8)+3*2,5
_dec C,D,A,B,(round*8)+2*2,3
_dec B,C,D,A,(round*8)+1*2,2
_dec A,B,C,D,(round*8)+0*2,1
endm
addSbox macro A,B,C,D
mov bp,D
and bp,(RC2_KEY_SIZE/2-1)
mov si,word ptr [rc2keytable+ebp*2]
add A,si
mov bp,A
and bp,(RC2_KEY_SIZE/2-1)
mov si,word ptr [rc2keytable+ebp*2]
add B,si
mov bp,B
and bp,(RC2_KEY_SIZE/2-1)
mov si,word ptr [rc2keytable+ebp*2]
add C,si
mov bp,C
and bp,(RC2_KEY_SIZE/2-1)
mov si,word ptr [rc2keytable+ebp*2]
add D,si
endm
subSbox macro A,B,C,D
mov bp,C
and bp,(RC2_KEY_SIZE/2-1)
mov si,word ptr [rc2keytable+ebp*2]
sub D,si
mov bp,B
and bp,(RC2_KEY_SIZE/2-1)
mov si,word ptr [rc2keytable+ebp*2]
sub C,si
mov bp,A
and bp,(RC2_KEY_SIZE/2-1)
mov si,word ptr [rc2keytable+ebp*2]
sub B,si
mov bp,D
and bp,(RC2_KEY_SIZE/2-1)
mov si,word ptr [rc2keytable+ebp*2]
sub A,si
endm
rc2_setkey proto :DWORD, :DWORD
rc2_encrypt proto :DWORD, :DWORD
rc2_decrypt proto :DWORd, :DWORD
.const
RC2_KEY_SIZE equ 128 ( you can change this constant RC2_KEY_SIZE ! )
.data
rc2sbox db 0D9h, 078h, 0F9h, 0C4h, 019h, 0DDh, 0B5h, 0EDh
db 028h, 0E9h, 0FDh, 079h, 04Ah, 0A0h, 0D8h, 09Dh
db 0C6h, 07Eh, 037h, 083h, 02Bh, 076h, 053h, 08Eh
db 062h, 04Ch, 064h, 088h, 044h, 08Bh, 0FBh, 0A2h
db 017h, 09Ah, 059h, 0F5h, 087h, 0B3h, 04Fh, 013h
db 061h, 045h, 06Dh, 08Dh, 009h, 081h, 07Dh, 032h
db 0BDh, 08Fh, 040h, 0EBh, 086h, 0B7h, 07Bh, 00Bh
db 0F0h, 095h, 021h, 022h, 05Ch, 06Bh, 04Eh, 082h
db 054h, 0D6h, 065h, 093h, 0CEh, 060h, 0B2h, 01Ch
db 073h, 056h, 0C0h, 014h, 0A7h, 08Ch, 0F1h, 0DCh
db 012h, 075h, 0CAh, 01Fh, 03Bh, 0BEh, 0E4h, 0D1h
db 042h, 03Dh, 0D4h, 030h, 0A3h, 03Ch, 0B6h, 026h
db 06Fh, 0BFh, 00Eh, 0DAh, 046h, 069h, 007h, 057h
db 027h, 0F2h, 01Dh, 09Bh, 0BCh, 094h, 043h, 003h
db 0F8h, 011h, 0C7h, 0F6h, 090h, 0EFh, 03Eh, 0E7h
db 006h, 0C3h, 0D5h, 02Fh, 0C8h, 066h, 01Eh, 0D7h
db 008h, 0E8h, 0EAh, 0DEh, 080h, 052h, 0EEh, 0F7h
db 084h, 0AAh, 072h, 0ACh, 035h, 04Dh, 06Ah, 02Ah
db 096h, 01Ah, 0D2h, 071h, 05Ah, 015h, 049h, 074h
db 04Bh, 09Fh, 0D0h, 05Eh, 004h, 018h, 0A4h, 0ECh
db 0C2h, 0E0h, 041h, 06Eh, 00Fh, 051h, 0CBh, 0CCh
db 024h, 091h, 0AFh, 050h, 0A1h, 0F4h, 070h, 039h
db 099h, 07Ch, 03Ah, 085h, 023h, 0B8h, 0B4h, 07Ah
db 0FCh, 002h, 036h, 05Bh, 025h, 055h, 097h, 031h
db 02Dh, 05Dh, 0FAh, 098h, 0E3h, 08Ah, 092h, 0AEh
db 005h, 0DFh, 029h, 010h, 067h, 06Ch, 0BAh, 0C9h
db 0D3h, 000h, 0E6h, 0CFh, 0E1h, 09Eh, 0A8h, 02Ch
db 063h, 016h, 001h, 03Fh, 058h, 0E2h, 089h, 0A9h
db 00Dh, 038h, 034h, 01Bh, 0ABh, 033h, 0FFh, 0B0h
db 0BBh, 048h, 00Ch, 05Fh, 0B9h, 0B1h, 0CDh, 02Eh
db 0C5h, 0F3h, 0DBh, 047h, 0E5h, 0A5h, 09Ch, 077h
db 00Ah, 0A6h, 020h, 068h, 0FEh, 07Fh, 0C1h, 0ADh
.data?
rc2keytable db RC2_KEY_SIZE dup(?)
.code
rc2_setkey proc ptrInkey:DWORD, ptrInkey_length:DWORD
mov esi,ptrInkey
mov edi,offset rc2keytable
mov ecx,ptrInkey_length
mov edx,ecx
rep movsb
mov ecx,RC2_KEY_SIZE
sub ecx,edx
mov ebx,offset rc2sbox
xor esi,esi
@_r1:
mov al,[rc2keytable+esi]
add al,[rc2keytable+esi+edx-1]
xlat
stosb
inc esi
loop @_r1
mov al,[rc2keytable]
xlat
mov [rc2keytable],al
ret
rc2_setkey endp
rc2_encrypt proc ptrIndata:DWORD, ptrOutdata:DWORD
pushad
xor ebx,ebx
xor ebp,ebp
mov esi,[esp+28h]
mov edi,[esp+2ch]
mov ax,[esi]
mov bx,[esi+2]
mov cx,[esi+4]
mov dx,[esi+6]
encR ax,bx,cx,dx,0
encR ax,bx,cx,dx,1
encR ax,bx,cx,dx,2
encR ax,bx,cx,dx,3
encR ax,bx,cx,dx,4
addSbox ax,bx,cx,dx
encR ax,bx,cx,dx,5
encR ax,bx,cx,dx,6
encR ax,bx,cx,dx,7
encR ax,bx,cx,dx,8
encR ax,bx,cx,dx,9
encR ax,bx,cx,dx,10
addSbox ax,bx,cx,dx
encR ax,bx,cx,dx,11
encR ax,bx,cx,dx,12
encR ax,bx,cx,dx,13
encR ax,bx,cx,dx,14
encR ax,bx,cx,dx,15
mov [edi],ax
mov [edi+2],bx
mov [edi+4],cx
mov [edi+6],dx
popad
ret
rc2_encrypt endp
rc2_decrypt proc ptrIndata:DWORD, ptrOutdata:DWORD
pushad
xor ebx,ebx
xor ebp,ebp
mov esi,[esp+28h]
mov edi,[esp+2ch]
mov ax,[esi]
mov bx,[esi+2]
mov cx,[esi+4]
mov dx,[esi+6]
decR ax,bx,cx,dx,15
decR ax,bx,cx,dx,14
decR ax,bx,cx,dx,13
decR ax,bx,cx,dx,12
decR ax,bx,cx,dx,11
subSbox ax,bx,cx,dx
decR ax,bx,cx,dx,10
decR ax,bx,cx,dx,9
decR ax,bx,cx,dx,8
decR ax,bx,cx,dx,7
decR ax,bx,cx,dx,6
decR ax,bx,cx,dx,5
subSbox ax,bx,cx,dx
decR ax,bx,cx,dx,4
decR ax,bx,cx,dx,3
decR ax,bx,cx,dx,2
decR ax,bx,cx,dx,1
decR ax,bx,cx,dx,0
mov [edi],ax
mov [edi+2],bx
mov [edi+4],cx
mov [edi+6],dx
popad
ret
rc2_decrypt endp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -