Created
May 18, 2017 12:53
-
-
Save shuax/d6b88ff07100530e1521f0150004cf9e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
同样遇到这样的问题 TypeError: The fill character must be a unicode character, not bytes
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
s = s.ljust(m, b"\0")
TypeError: The fill character cannot be converted to Unicode
运行后提示这样的错误,(⊙o⊙)…