专注于技术 心无旁骛 - justforfan528

Linux技术| 网络编程coding | 网络安全Cyber Security | study |

 

导航

RC4加解密算法之源代码

 

/////////////////////////////////////////////////////////////////////////
//** RC4加密算法         
//** 用法: 1.定义一个RC4_KEY结构,2.用函数RC4Init初始化状态,3.用RC4Works加密
//使用说明:
//1.定义密钥变量RC4_KEY rc4key;
//2.初始化密钥  RC4Init(255字节以内的口令字符串,口令长度,&rc4key);
//3.加/解密     RC4Works(无符号字符型数据,数据长度,&rc4key);
///////////////////////////////////////////////////////////////////////////
#ifndef __RC4_H
#define __RC4_H

#ifdef __cplusplus
extern "C" {
#endif

typedef 
struct _RC4_KEY
{
 BYTE bySTab[
256];   //256字节的S表
 BYTE byIt,byJt;     //t时刻的两个指针
}
 RC4_KEY,*PRC4_KEY;

BOOL RC4Init(LPSTR, 
int, RC4_KEY *);
BOOL RC4Works (LPBYTE, 
int, RC4_KEY *);

static BYTE xyzzy_tmpc;

#define SWAP_BYTE(a,b) xyzzy_tmpc=a; a=b; b=xyzzy_tmpc

BOOL RC4Init(
char *pszKey, int nKeyLen, RC4_KEY *key)
{
    BYTE by1,by2;
    LPBYTE bySTab;
    
int  nCount;
 
if((strlen(pszKey)<1)||(nKeyLen<1)) return FALSE;
 nKeyLen
=(nKeyLen>256)?(256):nKeyLen; //口令最多只能256字节

    bySTab 
= &key->bySTab[0];
    
for (nCount=0; nCount<256; nCount++)  bySTab[nCount]=(BYTE)nCount;
    key
->byIt=0;
    key
->byJt=0;
    by1
=by2=0;
    
for (nCount=0; nCount<256; nCount++)
    
{
        by2 
= (BYTE)(pszKey[by1] + bySTab[nCount] + by2);
        SWAP_BYTE(bySTab[nCount], bySTab[by2]);
        by1 
= (BYTE)(by1+1)%nKeyLen;
    }

 
return TRUE;
}


BOOL RC4Works(LPBYTE pbyData, 
int nDataLen, RC4_KEY *key)
{
 
if((pbyData==NULL) ||(nDataLen<1)) return FALSE; 
 BYTE byIt,byJt;
 LPBYTE bySTab;
 
int nCount;

 byIt
=key->byIt;
 byJt
=key->byJt;

 bySTab 
= &key->bySTab[0];
 
for (nCount=0; nCount<nDataLen; nCount++)
 
{
  byIt
++;
  byJt 
+= bySTab[byIt];
  SWAP_BYTE(bySTab[byIt], bySTab[byJt]);
  pbyData[nCount] 
^= bySTab[(bySTab[byIt] + bySTab[byJt])&0xFF];
 }

 key
->byIt=byIt;
 key
->byJt=byJt;
 
return TRUE;
}


#ifdef __cplusplus
}

#endif

#endif

posted on 2007-10-11 10:08  游荡者  阅读(2290)  评论(0编辑  收藏  举报