rc4加密算法

rc4算法,详情可以看下这个文档 流密码与RC4算法
  /**
 *  rc4加密算法 
 *  加密原理:
 *      先了解一下流密码的结构:
 *      密钥输入到一个伪随机数(比特)发生器中,输出一串8比特的随机数,称为密钥流;密钥流通过与同一时刻的明文进行异或运算产生密文; 
 *      1 , 通过密钥调度算法KSA初始化状态矢量S(S就是一个随机数发生器,称为S-box)  
 *      2 , 再通过伪随机数生成算法PRGA得到密钥流keystream
 *      3 , 密钥流keystream 与明文进行xor运算得到密文)
 *          解密用 密钥流与密文xor 
 *  Wiki:  http://en.wikipedia.org/wiki/RC4
 */
 #include 
 static void swapNoTemp(unsigned char* x, unsigned char* y)
 {
 	*x = *x ^ *y ; 
 	*y = *x ^ *y ; 
 	*x = *x ^ *y ; 
 }
 
 static void printText(unsigned char* Text, int length)
 {
 	int i ; 
 	for(i=0;i

再附上一个汇编代码:(不是我写的,在看雪学院http://www.pediy.com/sourcecode/cryptography.htm上看到的)
comment		*

Algorithm		: RC4 ( Stream Cipher )

Usage		: invoke	rc4_setkey,addr ptrInkey,addr ptrInkey_length
		  invoke	rc4_crypt,addr ptrIndata,addr ptrIndata_length	( Encrypt & Decrypt )
		  
Coded by x3chun	(2003.11.22)
		(x3chun@korea.com  or  x3chun@hanyang.ac.kr) ( http://x3chun.wo.to )
		
comment		*

rc4_setkey	proto	:DWORD, :DWORD
rc4_crypt	proto	:DWORD, :DWORD

.data?

rc4keytable	db	256	dup(?)

.code

rc4_setkey	proc	ptrInkey:DWORD, ptrInkey_length:DWORD

		xor	ebx,ebx		
@_r1:
		mov	[rc4keytable+ebx],bl
		inc	ebx
		cmp	ebx,256
		jnz	@_r1
		
		mov	esi,ptrInkey
		xor	eax,eax
		xor	ebx,ebx		
		xor	ecx,ecx		
		xor	edi,edi		
@_r3:
		mov	al,[rc4keytable+ecx]
		add	bl,byte ptr [esi+edi]
		add	bl,al		
		mov	dl,[rc4keytable+ebx]
		mov	[rc4keytable+ecx],dl
		mov	[rc4keytable+ebx],al
		inc	edi
		cmp	edi,ptrInkey_length
		jl	@_r2
		xor	edi,edi
@_r2:
		inc	ecx
		cmp	ecx,256
		jnz	@_r3	
		ret
		
rc4_setkey	endp

rc4_crypt	proc	ptrIndata:DWORD, ptrIndata_length:DWORD

		xor	eax,eax
		xor	ebx,ebx
		xor	edi,edi
		xor	edx,edx
		mov	esi,ptrIndata
@_r1:	
		mov	cl,[rc4keytable+1+eax]	
		add	dl,cl
		mov	bl,[rc4keytable+edx]	
		mov	[rc4keytable+edx],cl
		add	bl,cl
		mov	bl,[rc4keytable+ebx]
		xor	[esi+edi],bl
		inc	eax
		inc	edi	
		cmp	ptrIndata_length,edi
		jnz	@_r1	
		ret
		
rc4_crypt	endp


原文地址:https://www.cnblogs.com/trying/p/2863723.html