aestool.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #-*-coding:utf-8 -*-
  2. from cryptography.hazmat.primitives import padding
  3. from cryptography.hazmat.primitives.ciphers import algorithms
  4. from Crypto.Cipher import AES
  5. from binascii import b2a_hex, a2b_hex
  6. from urllib import urlencode
  7. from collections import OrderedDict
  8. import base64
  9. import json
  10. class AESCBCCrypt(object):
  11. def __init__(self, key='c1a5fd9f724143e8'):
  12. self.key = key.encode('utf-8')
  13. self.mode = AES.MODE_CBC
  14. self.iv = b'81dc198a449eb47f'
  15. # block_size 128位
  16. # 加密函数,如果text不足16位就用空格补足为16位,
  17. # 如果大于16但是不是16的倍数,那就补足为16的倍数。
  18. def encrypt(self, text):
  19. cryptor = AES.new(self.key, self.mode, self.iv)
  20. text = text.encode('utf-8')
  21. # 这里密钥key 长度必须为16(AES-128),24(AES-192),或者32 (AES-256)Bytes 长度
  22. # 目前AES-128 足够目前使用
  23. text=self.pkcs7_padding(text)
  24. self.ciphertext = cryptor.encrypt(text)
  25. # 因为AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题
  26. # 所以这里统一把加密后的字符串转化为16进制字符串
  27. return b2a_hex(self.ciphertext).decode().upper()
  28. #return base64.b64encode(self.ciphertext)
  29. @staticmethod
  30. def pkcs7_padding(data):
  31. if not isinstance(data, bytes):
  32. data = data.encode()
  33. padder = padding.PKCS7(algorithms.AES.block_size).padder()
  34. padded_data = padder.update(data) + padder.finalize()
  35. return padded_data
  36. @staticmethod
  37. def pkcs7_unpadding(padded_data):
  38. unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder()
  39. data = unpadder.update(padded_data)
  40. try:
  41. uppadded_data = data + unpadder.finalize()
  42. except ValueError:
  43. raise Exception('无效的加密信息!')
  44. else:
  45. return uppadded_data
  46. # 解密后,去掉补足的空格用strip() 去掉
  47. def decrypt(self, text):
  48. # 偏移量'iv'
  49. cryptor = AES.new(self.key, self.mode, self.iv)
  50. plain_text = cryptor.decrypt(a2b_hex(text))
  51. # return plain_text.rstrip('\0')
  52. return bytes.decode(plain_text).rstrip("\x01").\
  53. rstrip("\x02").rstrip("\x03").rstrip("\x04").rstrip("\x05").\
  54. rstrip("\x06").rstrip("\x07").rstrip("\x08").rstrip("\x09").\
  55. rstrip("\x0a").rstrip("\x0b").rstrip("\x0c").rstrip("\x0d").\
  56. rstrip("\x0e").rstrip("\x0f").rstrip("\x10")
  57. def dict_json(self, d):
  58. '''python字典转json字符串, 去掉一些空格'''
  59. j = json.dumps(d).replace('": ', '":').replace(', "', ',"').replace(", {", ",{")
  60. return j
  61. aescbc = AESCBCCrypt()
  62. print aescbc.encrypt("root")