专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 信息/网络安全

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

发布时间:2011-07-03 07:10:06 文章来源:www.iduyao.cn 采编人员:星星草
谁了解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;
    }
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: