101 lines
3.2 KiB
Python
101 lines
3.2 KiB
Python
import base64
|
|
import os
|
|
import traceback
|
|
|
|
from Crypto import Random
|
|
from Crypto.Cipher import AES
|
|
|
|
from . import logger
|
|
|
|
BS = 16
|
|
pad = lambda s: s + (BS - len(s.encode('utf-8')) % BS) * chr(BS - len(s.encode('utf-8')) % BS)
|
|
#unpad = lambda s : s[0:-s[-1]]
|
|
unpad = lambda s : s[:-ord(s[len(s)-1:])]
|
|
key = b'140b41b22a29beb4061bda66b6747e14'
|
|
|
|
class SupportAES(object):
|
|
@classmethod
|
|
def encrypt(cls, raw, mykey=None):
|
|
try:
|
|
Random.atfork()
|
|
except Exception as exception:
|
|
logger.error('Exception:%s', exception)
|
|
logger.error(traceback.format_exc())
|
|
|
|
raw = pad(raw)
|
|
if type(raw) == type(''):
|
|
raw = raw.encode()
|
|
if mykey is not None and type(mykey) == type(''):
|
|
mykey = mykey.encode()
|
|
iv = Random.new().read( AES.block_size )
|
|
cipher = AES.new(key if mykey is None else mykey, AES.MODE_CBC, iv )
|
|
try:
|
|
tmp = cipher.encrypt( raw )
|
|
except Exception as exception:
|
|
logger.error('Exception:%s', exception)
|
|
logger.error(traceback.format_exc())
|
|
tmp = cipher.encrypt( raw.encode() )
|
|
ret = base64.b64encode( iv + tmp )
|
|
ret = ret.decode()
|
|
return ret
|
|
|
|
@classmethod
|
|
def decrypt(cls, enc, mykey=None):
|
|
enc = base64.b64decode(enc)
|
|
iv = enc[:16]
|
|
if len(iv) != 16:
|
|
iv = os.urandom(16)
|
|
if mykey is not None and type(mykey) == type(''):
|
|
mykey = mykey.encode()
|
|
cipher = AES.new(key if mykey is None else mykey, AES.MODE_CBC, iv )
|
|
return unpad(cipher.decrypt( enc[16:] )).decode()
|
|
|
|
@classmethod
|
|
def md5(cls, text):
|
|
import hashlib
|
|
enc = hashlib.md5()
|
|
enc.update(text.encode())
|
|
return enc.hexdigest()
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
def encrypt_(cls, raw, mykey=None, iv=None):
|
|
try:
|
|
Random.atfork()
|
|
except Exception as exception:
|
|
logger.error('Exception:%s', exception)
|
|
logger.error(traceback.format_exc())
|
|
raw = pad(raw)
|
|
if type(raw) == type(''):
|
|
raw = raw.encode()
|
|
if mykey is not None and type(mykey) == type(''):
|
|
mykey = mykey.encode()
|
|
if iv == None:
|
|
iv = Random.new().read( AES.block_size )
|
|
elif iv is not None and type(iv) == type(''):
|
|
iv = iv.encode()
|
|
cipher = AES.new(key if mykey is None else mykey, AES.MODE_CBC, iv )
|
|
try:
|
|
tmp = cipher.encrypt( raw )
|
|
except Exception as exception:
|
|
logger.error('Exception:%s', exception)
|
|
logger.error(traceback.format_exc())
|
|
tmp = cipher.encrypt( raw.encode() )
|
|
ret = base64.b64encode( tmp )
|
|
ret = ret.decode()
|
|
return ret
|
|
|
|
@classmethod
|
|
def decrypt_(cls, enc, mykey=None, iv=None):
|
|
enc = base64.b64decode(enc)
|
|
if iv == None:
|
|
iv = os.urandom(16)
|
|
elif iv is not None and type(iv) == type(''):
|
|
iv = iv.encode()
|
|
if mykey is not None and type(mykey) == type(''):
|
|
mykey = mykey.encode()
|
|
cipher = AES.new(key if mykey is None else mykey, AES.MODE_CBC, iv )
|
|
return unpad(cipher.decrypt( enc )).decode()
|