def decode(e, sub_key):
if isinstance(e, basestring):
e = bytes(e.encode("ascii"))
try:
padding = (3 - len(e) % 3) * b"="
e = base64.urlsafe_b64decode(e + padding)
except (TypeError, AttributeError, binascii.Error):
raise EncryptedIDDecodeError()
for key in getattr(settings, "SECRET_KEYS", [settings.SECRET_KEY]):
iv = hashlib.sha256((key + sub_key).encode('ascii')).digest()[:16]
cypher = AES.new(key[:32], AES.MODE_CBC, iv)
try:
msg = cypher.decrypt(e)
except ValueError:
raise EncryptedIDDecodeError()
try:
crc, the_id = struct.unpack(b"<IQxxxx", msg)
except struct.error:
raise EncryptedIDDecodeError()
try:
if crc != binascii.crc32(bytes(the_id)) & 0xffffffff:
continue
except (MemoryError, OverflowError):
raise EncryptedIDDecodeError()
return the_id
raise EncryptedIDDecodeError("Failed to decrypt, CRC never matched.")
评论列表
文章目录