1、头文件
//
// RC4.h
//
#ifndef _RC4_H_
#define _RC4_H_
class CRC4
{
public:
CRC4(IN const CString &sKey);
void Encode(IN OUT BYTE *pData, IN LONG nLength);
private:
void _Init();
inline void _Swap(BYTE *pb1, BYTE *pb2);
private:
CString m_sKey;
BYTE m_bBuff0[256];
BYTE m_bBuff1[256];
};
#endif // !_RC4_H_
2、源文件
//
// RC4.cpp
//
#include "RC4.h"
CRC4::CRC4(const CString &sKey)
:m_sKey(sKey)
{
}
void CRC4::Encode(BYTE *pData, LONG nLength)
{
_Init();
LONG nPos = 0;
BYTE bTmp1 = 0, bTmp2 = 0;
BYTE bTmp3 = 0, bTmp4 = 0;
while (nPos++ < nLength)
{
bTmp1 = (bTmp1 + 1) % 256;
bTmp2 = (bTmp2 + m_bBuff0[bTmp1]) % 256;
_Swap(m_bBuff0 + bTmp1, m_bBuff0 + bTmp2);
bTmp3 = (m_bBuff0[bTmp1] + m_bBuff0[bTmp2]) % 256;
bTmp4 = m_bBuff0[bTmp3];
*pData ^= bTmp4;
pData++;
}
}
void CRC4::_Init()
{
CString sTmp(_T(""));
for (LONG nIndex = 0; nIndex<256; nIndex++)
{
m_bBuff0[nIndex] = (BYTE)nIndex;
sTmp = m_sKey.Right(m_sKey.GetLength() - nIndex%m_sKey.GetLength());
m_bBuff1[nIndex] = (BYTE)_ttol(sTmp);
}
LONG nTmp = 0;
for (LONG nIndex = 0; nIndex<256; nIndex++)
{
nTmp = (nTmp + m_bBuff0[nIndex] + m_bBuff1[nIndex]) % 256;
_Swap(m_bBuff0 + nIndex, m_bBuff0 + nTmp);
}
}
void CRC4::_Swap(BYTE *pb1, BYTE *pb2)
{
BYTE bTmp = *pb1;
*pb1 = *pb2;
*pb2 = bTmp;
}