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
//** 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