Advertisement
Guest User

Untitled

a guest
Feb 28th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.44 KB | None | 0 0
  1. from z3 import *
  2.  
  3. import binascii, struct
  4.  
  5. def decrypt(data0, data1):
  6. # inverted key schedule for decryption
  7. key0 = 0x0a728e203850a80e
  8. key1 = 0x1b8e2679ccaef6b4
  9.  
  10. for round in xrange(31, -1, -1):
  11. key0 ^= key1
  12. key0 = ((key0 << 61) | (key0 >> 3)) & 0xffffffffffffffff
  13.  
  14. key1 ^= round
  15. key1 = (key1 - key0) & 0xffffffffffffffff
  16. key1 = ((key1 << 8) | (key1 >> 56)) & 0xffffffffffffffff
  17.  
  18. data1 ^= data0
  19. data1 = ((data1 << 61) | (data1 >> 3)) & 0xffffffffffffffff
  20.  
  21. data0 ^= key0
  22. data0 = (data0 - data1) & 0xffffffffffffffff
  23. data0 = ((data0 << 8) | (data0 >> 56)) & 0xffffffffffffffff
  24.  
  25. return data0, data1
  26.  
  27. mask = binascii.a2b_hex("DF90BC7057EF965AEECF0955CE80200D4FE10E0746A4C62FF0EC55532B785764")
  28.  
  29. mixer = struct.unpack("<QQQQQQQQQQQQQQQQ", binascii.a2b_hex("8013000000000000FA25000000000000AA0C000000000000E200000000000000E404000000000000DA56000000000000611A0000000000003F1200000000000009270000000000000301000000000000070E000000000000C000000000000000352000000000000031150000000000002000000000000000C70D000000000000"))
  30. target = struct.unpack("<QQQQQQQQQQQQQQQQ", binascii.a2b_hex("6AC26F1400000000046B7610000000006CCEE52A00000000E4FCF52D000000009A013424000000009DE9671F000000007FAA4840000000004CC7264C000000004E96B2160000000002589013000000005F9BCF33000000000F98D52C0000000064C1FC1D00000000A39DA914000000006216102C00000000DBDEA92B00000000"))
  31.  
  32. s = Solver()
  33.  
  34. mat = []
  35. for i in xrange(16):
  36. t = BitVec("bv%02d" % i, 64)
  37. s.add(t >= 0)
  38. s.add(t <= 0xffff)
  39. mat.append(t)
  40.  
  41. for col in xrange(4):
  42. for row in xrange(4):
  43. s.add( \
  44. mat[ 0+col] * mixer[0+row*4] + \
  45. mat[ 4+col] * mixer[1+row*4] + \
  46. mat[ 8+col] * mixer[2+row*4] + \
  47. mat[12+col] * mixer[3+row*4] == target[col+row*4])
  48.  
  49. s.check()
  50. m = s.model()
  51.  
  52. result = [int(str(m[mat[i]])) for i in xrange(16)]
  53.  
  54. data0 = 0
  55. data1 = 0
  56. for i in xrange(4):
  57. data0 = (data0 << 16) | result[i]
  58. data1 = (data1 << 16) | result[4+i]
  59.  
  60. plain0, plain1 = decrypt(data0, data1)
  61.  
  62. data0 = 0
  63. data1 = 0
  64. for i in xrange(4):
  65. data0 = (data0 << 16) | result[8+i]
  66. data1 = (data1 << 16) | result[12+i]
  67.  
  68. plain2, plain3 = decrypt(data0, data1)
  69.  
  70. masked = struct.pack(">QQQQ", plain0, plain1, plain2, plain3)
  71.  
  72. s = ""
  73. for i in xrange(0, 32, 2):
  74. res = struct.unpack("<H", mask[i:i+2])[0] ^ struct.unpack(">H", masked[i:i+2])[0]
  75. s += chr(res)
  76.  
  77. print repr(s)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement