Skip to content

Instantly share code, notes, and snippets.

@syndrill
Forked from shuax/xxtea.py
Last active December 8, 2019 21:55
Show Gist options
  • Save syndrill/c7e3371507e39aa070a46381e11353b6 to your computer and use it in GitHub Desktop.
Save syndrill/c7e3371507e39aa070a46381e11353b6 to your computer and use it in GitHub Desktop.

Revisions

  1. Zero Load revised this gist Nov 5, 2017. No changes.
  2. Zero Load revised this gist Nov 5, 2017. 1 changed file with 22 additions and 3 deletions.
    25 changes: 22 additions & 3 deletions xxtea.py
    Original file line number Diff line number Diff line change
    @@ -1,3 +1,6 @@
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-

    import struct

    _DELTA = 0x9E3779B9
    @@ -19,7 +22,7 @@ def _str2long(s, w):
    if w: v.append(n)
    return v

    def encrypt(str, key):
    def do_xxtea_encrypt(str, key):
    if str == '': return str
    v = _str2long(str, True)
    k = _str2long(key.ljust(16, "\0"), False)
    @@ -41,7 +44,7 @@ def encrypt(str, key):
    q -= 1
    return _long2str(v, False)

    def decrypt(str, key):
    def do_xxtea_decrypt(str, key):
    if str == b'': return str
    v = _str2long(str, False)
    k = _str2long(key.ljust(16, b"\0"), False)
    @@ -60,4 +63,20 @@ def decrypt(str, key):
    v[0] = (v[0] - ((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[0 & 3 ^ e] ^ z))) & 0xffffffff
    y = v[0]
    sum = (sum - _DELTA) & 0xffffffff
    return _long2str(v, True)
    return _long2str(v, True)

    def fix_key_length(key):
    key = key + ('\x00' * (16 - len(key)))
    return key

    def decrypt(str, key):
    if len(key) < 16:
    res = do_xxtea_decrypt(str, fix_key_length(key))
    else:
    res = do_xxtea_decrypt(str, key)

    def encrypt(str, key):
    if len(key) < 16:
    res = do_xxtea_encrypt(str, fix_key_length(key))
    else:
    res = do_xxtea_encrypt(str, key)
  3. @shuax shuax created this gist May 18, 2017.
    63 changes: 63 additions & 0 deletions xxtea.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,63 @@
    import struct

    _DELTA = 0x9E3779B9

    def _long2str(v, w):
    n = (len(v) - 1) << 2
    if w:
    m = v[-1]
    if (m < n - 3) or (m > n): return ''
    n = m
    s = struct.pack('<%iL' % len(v), *v)
    return s[0:n] if w else s

    def _str2long(s, w):
    n = len(s)
    m = (4 - (n & 3) & 3) + n
    s = s.ljust(m, b"\0")
    v = list(struct.unpack('<%iL' % (m >> 2), s))
    if w: v.append(n)
    return v

    def encrypt(str, key):
    if str == '': return str
    v = _str2long(str, True)
    k = _str2long(key.ljust(16, "\0"), False)
    n = len(v) - 1
    z = v[n]
    y = v[0]
    sum = 0
    q = 6 + 52 // (n + 1)
    while q > 0:
    sum = (sum + _DELTA) & 0xffffffff
    e = sum >> 2 & 3
    for p in xrange(n):
    y = v[p + 1]
    v[p] = (v[p] + ((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z))) & 0xffffffff
    z = v[p]
    y = v[0]
    v[n] = (v[n] + ((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[n & 3 ^ e] ^ z))) & 0xffffffff
    z = v[n]
    q -= 1
    return _long2str(v, False)

    def decrypt(str, key):
    if str == b'': return str
    v = _str2long(str, False)
    k = _str2long(key.ljust(16, b"\0"), False)
    n = len(v) - 1
    z = v[n]
    y = v[0]
    q = 6 + 52 // (n + 1)
    sum = (q * _DELTA) & 0xffffffff
    while (sum != 0):
    e = sum >> 2 & 3
    for p in range(n, 0, -1):
    z = v[p - 1]
    v[p] = (v[p] - ((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z))) & 0xffffffff
    y = v[p]
    z = v[n]
    v[0] = (v[0] - ((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[0 & 3 ^ e] ^ z))) & 0xffffffff
    y = v[0]
    sum = (sum - _DELTA) & 0xffffffff
    return _long2str(v, True)