首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 安全技术 > 服务器安全 >

哪位高手了解RC5加密算法啊帮小弟我看看哪出有关问题了

2012-03-01 
谁了解RC5加密算法啊帮我看看哪出问题了我加密后,解密出来的不是原文。C/C++ codevoid CRC5Base::InitialKe

谁了解RC5加密算法啊帮我看看哪出问题了
我加密后,解密出来的不是原文。

C/C++ code
void CRC5Base::InitialKeyAndRounds(unsigned char *key, int iKeyLength, int iRounds){    m_rc5Key.iKeyLong = iKeyLength;        this->iRounds = iRounds;    int T = 2 * iRounds + 2;    int i , j, c, t;    c = iKeyLength / 4;    RC5_WORD *S = new RC5_WORD[T];    S[0] = P32;    for (i = 1; i < T; i++)    {        S[i] = S[i-1] + Q32;    }    m_rc5Key.KeyExpanded = S;    RC5_WORD *L = new RC5_WORD[c];    for (i = 0;i< c; i++)    {        L[i] = 0;    }    for (i = 0; i < iKeyLength; i++)    {        t = (key[i] & 0xFF) << (8 * (i % 4));        L[i/4] = L[i/4] + t;    }    i = 0;    j = 0;    RC5_WORD X = 0;    RC5_WORD Y = 0;    int k = (T > c) ? 3 * T : 3 * c;            while ( k --)    {                X = m_rc5Key.KeyExpanded[i] = ROTL(m_rc5Key.KeyExpanded[i] + X + Y, 3);                i = (i + 1) % T;                Y = L[j] = ROTL(L[j] + X + Y, X + Y);        j = (j + 1) % c;    }    delete L;}RC5_WORD CRC5Base::ROTL(RC5_WORD s, RC5_WORD x){    RC5_WORD Temp = 0;    Temp = (s << x ) | (s >> (32 - x ));            return Temp;}    RC5_WORD CRC5Base::ROTR(RC5_WORD s, RC5_WORD x){    RC5_WORD Temp = 0;    Temp = (s >> x ) | (s << (32 - x));    return Temp;}void CRC5Base::Encrypt(unsigned char *data){    RC5_WORD *S = m_rc5Key.KeyExpanded;    RC5_WORD A, B;    A  =  data[0] & 0xFF;    A += (data[1] & 0xFF) << 8;    A += (data[2] & 0xFF) << 16;    A += (data[3] & 0xFF) << 24;    B  = data[4] & 0xFF;    B += (data[5] & 0xFF) << 8;    B += (data[6] & 0xFF) << 16;    B += (data[7] & 0xFF) << 24;    A = A + S[0];    B = B + S[1];    for (int i = 1; i <= iRounds; i++)    {        A = ROTL(A ^ B, B) + S[2 * i];        B = ROTL(B ^ A, A) + S[2 * i + 1];    }    data[0] = (A >> 0) & 0xFF;    data[1] = (A >> 8) & 0xFF;    data[2] = (A >> 16) & 0xFF;    data[3] = (A >> 24) & 0xFF;    data[4] = (B >> 0) & 0xFF;    data[5] = (B >> 8) & 0xFF;    data[6] = (B >> 16) & 0xFF;    data[7] = (B >> 24) & 0xFF;}void CRC5Base::Decrypt(unsigned char *data){    RC5_WORD *S = m_rc5Key.KeyExpanded;    RC5_WORD A, B;    A  =  data[0] & 0xFF;    A += (data[1] & 0xFF) << 8;    A += (data[2] & 0xFF) << 16;    A += (data[3] & 0xFF) << 24;    B  =  data[4] & 0xFF;    B += (data[5] & 0xFF) << 8;    B += (data[6] & 0xFF) << 16;    B += (data[7] & 0xFF) << 24;    for (int i = iRounds; i > 0; i--)    {        B = (ROTR(B - S[2 * iRounds + 1], A)) ^ A;        A = (ROTR(A - S[2 * iRounds], B)) ^ B;    }    B = B - S[1];    A = A - S[0];        data[0] = (A >> 0)  & 0xFF;    data[1] = (A >> 8)  & 0xFF;    data[2] = (A >> 16) & 0xFF;    data[3] = (A >> 24) & 0xFF;    data[4] = (B >> 0)  & 0xFF;    data[5] = (B >> 8)  & 0xFF;    data[6] = (B >> 16) & 0xFF;    data[7] = (B >> 24) & 0xFF;}


[解决办法]
void CRC5Base::Decrypt(unsigned char *data)
中的
C/C++ code
    for (int i = iRounds; i > 0; i--)    {        B = (ROTR(B - S[2 * iRounds + 1], A)) ^ A;        A = (ROTR(A - S[2 * iRounds], B)) ^ B;    } 

热点排行