stackoverflow 上面有人问 TEA 加解密的 Python 实现算法。问题中的那段代码计算出的结果为什么与 C 语言不一样呢?因为直接对 Python 里面的数字左移的时候,如果结果超出了 32 位,Python 并不会像 C 语言那样把超出 32 位的部分截取,而是从 int 成为了一个 long 数据。比如,0xFFFFFFFF << 8 在 C 语言中的结果是 0xFFFFFF00,而 Python 的结果是 0xFFFFFFFF00。
所以,在 Python 中要实现 C 语言中的结果,只需要把结果限定在 32 位(或其他需要的位数)即可。比较方便的方法是使用 ctypes 中的数据类型 c_uint32、c_int32 等。完整的加密代码如下:
def encipher(v, k):
y = c_int32(v[0])
z = c_int32(v[1])
sum = c_int32(0)
delta = 0x61c88647
n = 16
w = [0, 0]
while n > 0:
y.value += z.value << 4 ^ z.value >> 5 + sum.value ^ z.value + k[sum.value & 3]
sum.value -= delta
z.value += y.value << 4 ^ y.value >> 5 + sum.value ^ y.value + k[sum.value >> 11 & 3]
n -= 1
w[0]=y.value
w[1]=z.value
return w