RC4加密算法

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章