C和Python中的RC4不会给出相同的结果

时间:2015-03-11 22:25:20

标签: python c

我已经在C中使用RC4很长一段时间了(我在互联网上找到的简单功能),最近,我想在python中进行字符串加密并将其移动到C程序,所以我找到了相同的功能在python中,但它没有给出与C函数相同的结果 这里有两个功能:

C:

LPBYTE RC4(LPBYTE lpBuf, LPBYTE lpKey, DWORD dwBufLen, DWORD dwKeyLen){
    INT a, b = 0, s[256];
    BYTE swap;
    DWORD dwCount;
    for(a = 0; a < 256; a++){
        s[a] = a;
    }
    for(a = 0; a < 256; a++){
        b = (b + s[a] + lpKey[a % dwKeyLen]) % 256;
        swap = s[a];
        s[a] = s[b];
        s[b] = swap;
    }

    a = b = 0

    for(dwCount = 0; dwCount < dwBufLen; dwCount++){
        a = (a + 1) % 256;
        b = (b + s[a]) % 256;
        swap = s[a];
        s[a] = s[b];
        s[b] = swap;
        lpBuf[dwCount] ^= s[(s[a] + s[b]) % 256];
    }
    return lpBuf;
}

Python:

def rc4(data , key):
    S = list(range(256))
    b = 0
    out = []

    #KSA Phase
    for a in range(256):
        b = (b + S[a] + ord( key[a % len(key)] )) % 256
        S[a] , S[b] = S[b] , S[a]

    #PRGA Phase
    a = b = 0
    for dwCount in data:
        a = ( a + 1 ) % 256
        b = ( b + S[a] ) % 256
        S[a] , S[b] = S[b] , S[a]
        out.append(chr(ord(dwCount) ^ S[(S[a] + S[b]) % 256]))

    return ''.join(out)

那么,为什么带有这两个函数的加密字符串不一样呢?

1 个答案:

答案 0 :(得分:1)

这些片段并不相同。在PRGA阶段的开始,python代码将b设置为0.C代码不会重新初始化相应的变量,并使用KSA阶段的剩余部分。其中一个片段一定是错的。我不知道RC4告诉哪一个。