encrypt.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import sys
  2. from struct import pack, unpack
  3. if len(sys.argv) < 3:
  4. print ('encrypt.py <src file> <dst file>')
  5. print ('Example:')
  6. print ('python3 ./encrypt.py ./Firmware.bin ./EncryptedFirmware.bin')
  7. exit()
  8. srcFile = sys.argv[1]
  9. dstFile = sys.argv[2]
  10. XTEA_KEY = [0xA56BABCD, 0x0000FFFF, 0xABCDEF12, 0x13572468]
  11. def xtea_encrypt(block, key):
  12. v0, v1 = unpack("<2I", block) # LITTLE-ENDIAN
  13. k = key # tuple из 4 uint32
  14. delta = 0x9E3779B9
  15. sum = 0
  16. for _ in range(32):
  17. v0 = (v0 + (
  18. (((v1 << 4) & 0xFFFFFFFF) ^ (v1 >> 5)) + v1
  19. ^ (sum + k[sum & 3])
  20. )) & 0xFFFFFFFF
  21. sum = (sum + delta) & 0xFFFFFFFF
  22. v1 = (v1 + (
  23. (((v0 << 4) & 0xFFFFFFFF) ^ (v0 >> 5)) + v0
  24. ^ (sum + k[(sum >> 11) & 3])
  25. )) & 0xFFFFFFFF
  26. return pack("<2I", v0, v1)
  27. def xtea_decrypt(block, key):
  28. v0, v1 = unpack("<2I", block) # LITTLE-ENDIAN как в STM32
  29. delta = 0x9E3779B9
  30. sum = (delta * 32) & 0xFFFFFFFF
  31. for _ in range(32):
  32. v1 = (v1 - (
  33. (((v0 << 4) & 0xFFFFFFFF) ^ (v0 >> 5)) + v0
  34. ^ (sum + key[(sum >> 11) & 3])
  35. )) & 0xFFFFFFFF
  36. sum = (sum - delta) & 0xFFFFFFFF
  37. v0 = (v0 - (
  38. (((v1 << 4) & 0xFFFFFFFF) ^ (v1 >> 5)) + v1
  39. ^ (sum + key[sum & 3])
  40. )) & 0xFFFFFFFF
  41. return pack("<2I", v0, v1)
  42. dst = open(dstFile, "wb")
  43. with open(srcFile, "rb") as f:
  44. while True:
  45. chunk = f.read(16)
  46. if not chunk:
  47. break
  48. if len(chunk) < 16:
  49. chunk = chunk.ljust(16, b'\xFF')
  50. enc = b""
  51. for i in range(0, len(chunk), 8):
  52. enc += xtea_encrypt(chunk[i:i+8], XTEA_KEY)
  53. dst.write(enc)