xxtea加密算法-忘记是从哪里看到的了

  • 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$
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
XXTEA是一种简单有效的加密算法,下面是C#的实现: ``` using System; namespace XXTEA { class XXTEA { private static uint DELTA = 0x9E3779B9; private static int MX = 16; private static uint[] ToUIntArray(byte[] data, bool includeLength) { int length = data.Length; int n = (((length & 3) == 0) ? (length >> 2) : ((length >> 2) + 1)); uint[] result; if (includeLength) { result = new uint[n + 1]; result[n] = (uint)length; } else { result = new uint[n]; } for (int i = 0; i < length; i++) { result[i >> 2] |= (uint)(data[i] << ((i & 3) << 3)); } return result; } private static byte[] ToByteArray(uint[] data, bool includeLength) { int n = data.Length << 2; if (includeLength) { int m = (int)data[data.Length - 1]; n -= 4; if ((m < n - 3) || (m > n)) { return null; } n = m; } byte[] result = new byte[n]; for (int i = 0; i < n; i++) { result[i] = (byte)(data[i >> 2] >> ((i & 3) << 3)); } return result; } private static uint[] Encrypt(uint[] data, uint[] key) { uint[] result = new uint[data.Length]; uint sum = 0; uint y = data[0]; uint z = data[data.Length - 1]; uint a, b, c, d, e, f, k; for (int i = 0; i < MX; i++) { sum += DELTA; a = key[i % 4]; b = key[(i + 1) % 4]; c = key[(i + 2) % 4]; d = key[(i + 3) % 4]; e = y >> 5 ^ z << 2; f = z >> 3 ^ y << 4; k = sum ^ z ^ e; y += k ^ a ^ (z << 1 | z >> 31) ; z += k ^ b ^ (y << 4 | y >> 28) ; } result[0] = y; result[data.Length - 1] = z; for (int i = 1; i < data.Length - 1; i++) { sum += DELTA; a = key[i % 4]; b = key[(i + 1) % 4]; c = key[(i + 2) % 4]; d = key[(i + 3) % 4]; e = result[i - 1] >> 5 ^ result[i + 1] << 2; f = result[i + 1] >> 3 ^ result[i - 1] << 4; k = sum ^ result[i - 1] ^ e; result[i] = result[i] + (k ^ b ^ (result[i - 1] << 1 | result[i - 1] >> 31)) ; result[i] = result[i] + (k ^ c ^ (result[i + 1] << 4 | result[i + 1] >> 28)) ; } return result; } private static uint[] Decrypt(uint[] data, uint[] key) { uint[] result = new uint[data.Length]; uint sum = (uint)(DELTA * MX); uint y = data[0]; uint z = data[data.Length - 1]; uint a, b, c, d, e, f, k; for (int i = 0; i < MX; i++) { k = sum ^ z ^ (y << 1 | y >> 31) ; z -= k ^ b ^ (y << 4 | y >> 28) ; y -= k ^ a ^ (z << 1 | z >> 31) ; sum -= DELTA; a = key[i % 4]; b = key[(i + 1) % 4]; c = key[(i + 2) % 4]; d = key[(i + 3) % 4]; e = z >> 5 ^ y << 2; f = y >> 3 ^ z << 4; } result[0] = y; result[data.Length - 1] = z; for (int i = 1; i < data.Length - 1; i++) { sum -= DELTA; a = key[i % 4]; b = key[(i + 1) % 4]; c = key[(i + 2) % 4]; d = key[(i + 3) % 4]; e = result[i - 1] >> 5 ^ result[i + 1] << 2; f = result[i + 1] >> 3 ^ result[i - 1] << 4; k = sum ^ result[i - 1] ^ e; result[i] = result[i] - (k ^ c ^ (result[i + 1] << 4 | result[i + 1] >> 28)) ; result[i] = result[i] - (k ^ b ^ (result[i - 1] << 1 | result[i - 1] >> 31)) ; } return result; } public static byte[] Encrypt(byte[] data, byte[] key) { if ((data == null) || (data.Length == 0)) { return data; } uint[] v = ToUIntArray(data, true); uint[] k = ToUIntArray(key, false); if (k.Length < 4) { uint[] keyTemp = new uint[4]; k.CopyTo(keyTemp, 0); k = keyTemp; } return ToByteArray(Encrypt(v, k), false); } public static byte[] Decrypt(byte[] data, byte[] key) { if ((data == null) || (data.Length == 0)) { return data; } uint[] v = ToUIntArray(data, false); uint[] k = ToUIntArray(key, false); if (k.Length < 4) { uint[] keyTemp = new uint[4]; k.CopyTo(keyTemp, 0); k = keyTemp; } return ToByteArray(Decrypt(v, k), true); } } } ``` 这里提供了两个方法,一个是加密方法Encrypt,一个是解密方法Decrypt。它们都需要两个参数,一个是要加密或解密的数据,另一个是加密或解密所需要的密钥。注意,加密和解密所使用的密钥必须一致。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值