crypto.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import base64
  2. import json
  3. import logging
  4. from cryptography.hazmat.primitives.serialization import load_pem_private_key
  5. from cryptography.hazmat.primitives.asymmetric import padding as asym_padding
  6. from Crypto.Cipher import AES
  7. from Crypto.Util.Padding import unpad
  8. logger = logging.getLogger(__name__)
  9. RSA_PRIVATE_KEY_B64 = (
  10. "MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY7Nt+"
  11. "PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKNPuH3owID"
  12. "AQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gAkM0HqoTt2UZw"
  13. "A5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWowcSxQAgiCstxGUoOq"
  14. "lW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99EcvDQIgIdhDTIqD2jfYjPTY"
  15. "8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthhYhovyloRYsM+IS9h/0BzlEAu"
  16. "O0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3UP8iWi1Qw0Y="
  17. )
  18. _private_key = None
  19. def _get_private_key():
  20. global _private_key
  21. if _private_key is None:
  22. pem = f"-----BEGIN PRIVATE KEY-----\n{RSA_PRIVATE_KEY_B64}\n-----END PRIVATE KEY-----"
  23. _private_key = load_pem_private_key(pem.encode(), password=None)
  24. return _private_key
  25. def decrypt_rsa(encrypted_b64: str) -> bytes:
  26. pk = _get_private_key()
  27. encrypted = base64.b64decode(encrypted_b64)
  28. return pk.decrypt(encrypted, asym_padding.PKCS1v15())
  29. def decrypt_aes_ecb(encrypted_b64: str, key: bytes) -> str:
  30. encrypted = base64.b64decode(encrypted_b64)
  31. cipher = AES.new(key, AES.MODE_ECB)
  32. decrypted = unpad(cipher.decrypt(encrypted), AES.block_size)
  33. return decrypted.decode("utf-8")
  34. def try_decrypt_request(encrypt_key_header: str, body: str) -> dict:
  35. aes_key_b64 = decrypt_rsa(encrypt_key_header)
  36. aes_key = base64.b64decode(aes_key_b64)
  37. decrypted_json = decrypt_aes_ecb(body, aes_key)
  38. return json.loads(decrypted_json)