c语言编写的rc4代码,可移植性强。windows操作系统有一些用于加解密的api,但使用起来比较繁琐,且移植性差。故自己写了一个rc4加解密算法的代码。
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//////////////////////////////////////////////////////////////////////////
//** RC4加密算法
//** 用法: 1.定义一个RC4_KEY结构,2.用函数RC4Init初始化状态,3.用RC4Works加密
//使用说明:
//1.定义密钥变量RC4_KEY rc4key;
//2.初始化密钥 RC4Init(255字节以内的口令字符串,口令长度,&rc4key);
//3.加/解密 RC4Works(无符号字符型数据,数据长度,&rc4key);
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**////////////////////////////////////////////////////////////////////////////
#ifndef __RC4_H
#define __RC4_H
![](/Images/OutliningIndicators/None.gif)
#ifdef __cplusplus
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
extern "C"
{
#endif
![](/Images/OutliningIndicators/InBlock.gif)
typedef struct _RC4_KEY
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
{
BYTE bySTab[256]; //256字节的S表
BYTE byIt,byJt; //t时刻的两个指针
} RC4_KEY,*PRC4_KEY;
![](/Images/OutliningIndicators/InBlock.gif)
BOOL RC4Init(LPSTR, int, RC4_KEY *);
BOOL RC4Works (LPBYTE, int, RC4_KEY *);
![](/Images/OutliningIndicators/InBlock.gif)
static BYTE xyzzy_tmpc;
![](/Images/OutliningIndicators/InBlock.gif)
#define SWAP_BYTE(a,b) xyzzy_tmpc=a; a=b; b=xyzzy_tmpc
![](/Images/OutliningIndicators/InBlock.gif)
BOOL RC4Init(char *pszKey, int nKeyLen, RC4_KEY *key)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
{
BYTE by1,by2;
LPBYTE bySTab;
int nCount;
if((strlen(pszKey)<1)||(nKeyLen<1)) return FALSE;
nKeyLen=(nKeyLen>256)?(256):nKeyLen; //口令最多只能256字节
![](/Images/OutliningIndicators/InBlock.gif)
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++)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
by2 = (BYTE)(pszKey[by1] + bySTab[nCount] + by2);
SWAP_BYTE(bySTab[nCount], bySTab[by2]);
by1 = (BYTE)(by1+1)%nKeyLen;
}
return TRUE;
}
![](/Images/OutliningIndicators/InBlock.gif)
BOOL RC4Works(LPBYTE pbyData, int nDataLen, RC4_KEY *key)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
{
if((pbyData==NULL) ||(nDataLen<1)) return FALSE;
BYTE byIt,byJt;
LPBYTE bySTab;
int nCount;
![](/Images/OutliningIndicators/InBlock.gif)
byIt=key->byIt;
byJt=key->byJt;
![](/Images/OutliningIndicators/InBlock.gif)
bySTab = &key->bySTab[0];
for (nCount=0; nCount<nDataLen; nCount++)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
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;
}
![](/Images/OutliningIndicators/InBlock.gif)
#ifdef __cplusplus
}
#endif
![](/Images/OutliningIndicators/None.gif)
#endif
![](/Images/OutliningIndicators/None.gif)