• xxtea.py
#!/usr/bin/python
# -*- coding:utf-8 -*-

import struct

def btea(v, n, k): #xxtea加密算法
    MX = lambda: ((z>>5)^(y<<2)) + ((y>>3)^(z<<4))^(sum^y) + (k[(p & 3)^e]^z)
    u32 = lambda x: x & 0xffffffff

    y = v[0]
    sum = 0
    DELTA = 0x9e3779b9
    if n > 1: 
        z = v[n-1]
        q = 6 + 52 / n
        while q > 0:
            q -= 1
            sum = u32(sum + DELTA)
            e = u32(sum >> 2) & 3
            p = 0
            while p < n - 1:
                y = v[p+1]
                z = v[p] = u32(v[p] + MX())
                p += 1
            y = v[0]
            z = v[n-1] = u32(v[n-1] + MX())
        return True
    elif n < -1:
        n = -n
        q = 6 + 52 / n
        sum = u32(q * DELTA)
        while sum != 0:
            e = u32(sum >> 2) & 3
            p = n - 1
            while p > 0:
                z = v[p-1]
                y = v[p] = u32(v[p] - MX())
                p -= 1
            z = v[n-1]
            y = v[0] = u32(v[0] - MX())
            sum = u32(sum - DELTA)
        return True
    return False

if __name__ == '__main__': #简单试验
    print "key", "1234567890123456"
    key = struct.unpack("=iiii", "1234567890123456")
    v = [110, 111, 112, 113]
    print v
    btea(v, 4, key)
    print v
    btea(v, -4, key)
    print v
  • 测试
admin$ python xxtea.py
key 1234567890123456
[110, 111, 112, 113]
[2210921364, 249748794, 3317857568, 1737089717]
[110, 111, 112, 113]
admin$
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐