RC4加密算法

来源:互联网 发布:快到期已备案域名购买 编辑:程序博客网 时间:2024/05/17 09:14

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;}



0 0