Crypto包工具

  1. import Crypto.Cipher.AES
  2. import Crypto.Random
  3. import base64
  4. import binascii
  5. import hashlib
  6. class Cipher_AES:
  7. cipher = getattr(Crypto.Cipher, "AES")
  8. pad = {
  9. "default": lambda x, y: x + (y - len(x) % y) * " ".encode("utf-8"),
  10. "PKCS5Padding": lambda x, y: x + (y - len(x) % y) * chr(y - len(x) % y).encode("utf-8")
  11. }
  12. unpad = {
  13. "default": lambda x: x.rstrip(),
  14. "PKCS5Padding": lambda x: x[:-ord(x[-1])]
  15. }
  16. encode = {"base64": base64.encodebytes, "hex": binascii.b2a_hex}
  17. decode = {"base64": base64.b64decode, "hex": binascii.a2b_hex}
  18. def __init__(self,
  19. key=None,
  20. iv=None,
  21. cipher_method=None,
  22. pad_method="default",
  23. code_method=None):
  24. self.__key = key if key else "abcdefgh12345678" # 密钥(长度必须为16、24、32)
  25. self.__iv = iv if iv else Crypto.Random.new().read(Cipher_AES.cipher.block_size) # 向量(长度与密钥一致,ECB模式不需要)
  26. self.__cipher_method = cipher_method.upper() if cipher_method \
  27. and isinstance(cipher_method,
  28. str) else "MODE_ECB" # 加密方式,["MODE_ECB"|"MODE_CBC"|"MODE_CFB"]等
  29. self.__pad_method = pad_method # 填充方式,解决 Java 问题选用"PKCS5Padding"
  30. self.__code_method = code_method # 编码方式,目前只有"base64"、"hex"两种
  31. if self.__cipher_method == "MODE_CBC":
  32. self.__cipher = Cipher_AES.cipher.new(self.__key.encode("utf-8"), Cipher_AES.cipher.MODE_CBC,
  33. self.__iv.encode("utf-8"))
  34. else:
  35. self.__cipher = Cipher_AES.cipher.new(self.__key.encode("utf-8"), Cipher_AES.cipher.MODE_ECB)
  36. def __getitem__(self, item):
  37. def get3value(item):
  38. return item.start, item.stop, item.step
  39. type_, method, _ = get3value(item)
  40. dict_ = getattr(Cipher_AES, type_)
  41. return dict_[method] if method in dict_ else dict_["default"]
  42. def encrypt(self, text):
  43. cipher_text = b"".join([
  44. self.__cipher.encrypt(i)
  45. for i in self.text_verify(text.encode("utf-8"))
  46. ])
  47. encode_func = Cipher_AES.encode.get(self.__code_method)
  48. if encode_func:
  49. cipher_text = encode_func(cipher_text)
  50. return cipher_text.decode("utf-8").rstrip()
  51. def decrypt(self, cipher_text):
  52. cipher_text = cipher_text.encode("utf-8")
  53. decode_func = Cipher_AES.decode.get(self.__code_method)
  54. if decode_func:
  55. cipher_text = decode_func(cipher_text)
  56. return self.pad_or_unpad(
  57. "unpad",
  58. self.__cipher.decrypt(cipher_text).decode("utf-8"))
  59. def text_verify(self, text):
  60. while len(text) > len(self.__key):
  61. text_slice = text[:len(self.__key)]
  62. text = text[len(self.__key):]
  63. yield text_slice
  64. else:
  65. if len(text) == len(self.__key):
  66. yield text
  67. else:
  68. yield self.pad_or_unpad("pad", text)
  69. def pad_or_unpad(self, type_, contents):
  70. lambda_func = self[type_:self.__pad_method] # lambda x: x[:-ord(x[-1])]
  71. return lambda_func(contents, len(
  72. self.__key)) if type_ == "pad" else lambda_func(contents)
  73. key = "B@#deCC%ejk569^5"
  74. iv = key[::-1]
  75. # cipher_method = "AES"
  76. pad_method = "PKCS5Padding"
  77. code_method = "base64"
  78. cipher_text = "B+dAVKs9xMqVPKwC+KAD3g=="
  79. text = Cipher_AES(key, None, None, pad_method,
  80. code_method).decrypt(cipher_text)
  81. print(text)

cryptography包工具

  1. from cryptography.hazmat.primitives.asymmetric import rsa, padding
  2. from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
  3. from cryptography.hazmat.backends import default_backend
  4. from cryptography.hazmat.primitives import serialization, hashes
  5. from cryptography.hazmat.primitives.serialization import Encoding, PrivateFormat, NoEncryption, PublicFormat
  6. import base64
  7. def aes_ecb_encrypt(data, key, iv):
  8. """
  9. use AES CBC to encrypt message, using key and init vector, padding: ZeroPadding
  10. :param data: 待加密的数据
  11. :param key:
  12. :param iv:
  13. :return:
  14. """
  15. data = data.encode() # bytes
  16. key = key.encode()
  17. # iv = iv.encode()
  18. backend = default_backend()
  19. cipher = Cipher(algorithms.AES(key), modes.ECB(), backend=backend)
  20. encryptor = cipher.encryptor()
  21. padder = lambda s: s + (16 - len(s) % 16) * chr(0)
  22. padded_data = padder(data.decode()).encode("utf-8")
  23. enc_content = encryptor.update(padded_data) + encryptor.finalize()
  24. enc_data = base64.b64encode(enc_content).decode('utf8')
  25. enc_result = base64.b64encode(enc_data.encode()).decode('utf8')
  26. return enc_result
  27. def aes_ecb_decrypt(data, key):
  28. data = base64.b64decode(data)
  29. backend = default_backend()
  30. cipher = Cipher(algorithms.AES(key), modes.ECB(), backend)
  31. decryptor = cipher.decryptor()
  32. enc_content = decryptor.update(data) + decryptor.finalize()
  33. enc_content = enc_content.decode("utf-8")
  34. return enc_content[:-ord(enc_content[-1])]
  35. # def pkcs5_padding(data):
  36. # if not isinstance(data, bytes):
  37. # data = data.encode()
  38. #
  39. # padder = padding.PKCS7(algorithms.AES.block_size).padder()
  40. #
  41. # padded_data = padder.update(data) + padder.finalize()
  42. #
  43. # return padded_data