⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rc2.inc

📁 RC加密算法.用汇编语言写的.希望对大家有帮助.
💻 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 + -