我已经在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)
那么,为什么带有这两个函数的加密字符串不一样呢?
答案 0 :(得分:1)
这些片段并不相同。在PRGA阶段的开始,python代码将b
设置为0.C代码不会重新初始化相应的变量,并使用KSA阶段的剩余部分。其中一个片段一定是错的。我不知道RC4告诉哪一个。