secure.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #!/usr/bin/python
  2. # -*- coding=utf-8 -*-
  3. # @Create Time: 2024-02-22 14:41:39
  4. # @Last Modified time: 2024-02-22 17:07:53
  5. from Crypto.Cipher import AES
  6. from binascii import b2a_hex, a2b_hex
  7. class AES_Util(object):
  8. """docstring for AES_Util"""
  9. def __init__(self, mode, key, iv=None):
  10. super(AES_Util, self).__init__()
  11. self.set_key(key)
  12. if mode == "CBC":
  13. self.mode = AES.MODE_CBC
  14. self.set_iv(iv)
  15. else:
  16. self.mode = AES.MODE_ECB
  17. def set_key(self, key):
  18. self.key = key.encode("utf-8")
  19. def set_iv(self, iv):
  20. if isinstance(iv, bytes):
  21. self.iv = iv
  22. # 如果text不足16位的倍数就用空格补足为16位
  23. def add_to_16(self, text):
  24. if len(text.encode('utf-8')) % 16:
  25. add = 16 - (len(text.encode('utf-8')) % 16)
  26. else:
  27. add = 0
  28. text = text + ('\0' * add)
  29. return text.encode('utf-8')
  30. # 加密函数
  31. def encrypt(self, text):
  32. text = self.add_to_16(text)
  33. if self.mode == AES.MODE_CBC:
  34. cryptos = AES.new(self.key, self.mode, self.iv)
  35. else:
  36. cryptos = AES.new(self.key, self.mode)
  37. cipher_text = cryptos.encrypt(text)
  38. # 因为AES加密后的字符串不一定是ascii字符集的,输出保存可能存在问题,所以这里转为16进制字符串
  39. return b2a_hex(cipher_text)
  40. # 解密后,去掉补足的空格用strip() 去掉
  41. def decrypt(self, text):
  42. if self.mode == AES.MODE_CBC:
  43. cryptos = AES.new(self.key, self.mode, self.iv)
  44. else:
  45. cryptos = AES.new(self.key, self.mode)
  46. plain_text = cryptos.decrypt(a2b_hex(text))
  47. return bytes.decode(plain_text).rstrip('\0')
  48. if __name__ == '__main__':
  49. aes = AES_Util("CBC", key='9999999999999999', iv=b'qqqqqqqqqqqqqqqq')
  50. e = aes.encrypt("hello world") # 加密
  51. print(e)
  52. d = aes.decrypt(e) # 解密
  53. print(d)