Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.90 KB | None | 0 0
  1. import pyDes
  2. import random
  3.  
  4. # Compute the Hamming weight of a byte
  5. def hw(b):
  6.     w = 0
  7.     for i in range(8):
  8.         w += (b >> i) & 1
  9.     return w
  10.  
  11. # Sets the key parity bit of a DES key byte
  12. def set_parity(b):
  13.     if hw(b) % 2 == 0:
  14.         return b ^ 0x01
  15.     return b
  16.  
  17. def get_key(n):
  18.     b1 = set_parity((n >> 14) % 256)
  19.     b2 = set_parity((n >> 6) % 256)
  20.     b3 = set_parity((n % 64) << 2)
  21.  
  22.     ret = bytearray([b1, b2, b3, 0, 0, 0, 0, 0])
  23.     return bytes(ret)
  24.  
  25. def des_enc(data, key):
  26.     return pyDes.des(key).encrypt(data)
  27.  
  28. def des_dec(data, key):
  29.     return pyDes.des(key).decrypt(data)
  30.  
  31. def hack_double_des(plaintext, ciphertext):
  32.     key_dict_e = {}
  33.     key_dict_d = {}
  34.    
  35.     key_deck = range(pow(2, 20))
  36.     random.shuffle(key_deck)
  37.    
  38.     for i, j in enumerate(key_deck):
  39.         k = get_key(j)
  40.  
  41.         if i % 1024 == 0:
  42.             print("%d/1024" % (i // 1024))
  43.  
  44.         c = des_enc(plaintext, k)
  45.         if c in key_dict_d.keys():
  46.             return k, key_dict_d[c]
  47.         else:
  48.             key_dict_e[c] = k
  49.  
  50.         m = des_dec(ciphertext, k)
  51.         if m in key_dict_e.keys():
  52.             return key_dict_e[m], k
  53.         else:
  54.             key_dict_d[m] = k
  55.  
  56.     # This should never happen
  57.     return b'lol', b'noob'
  58.  
  59. k1 = get_key(1234)
  60. k2 = get_key(5432)
  61.  
  62. plaintext = b'ABCDEFGH'
  63. middle = des_enc(plaintext, k1)
  64. ciphertext = des_enc(middle, k2)
  65.  
  66. print("k1: %r" % k1)
  67. print("k2: %r" % k2)
  68.  
  69. print("Plaintext:\t%r" % plaintext)
  70. print("Ciphertext:\t%r" % ciphertext)
  71.  
  72. keys = hack_double_des(plaintext, ciphertext)
  73.  
  74. print("Guess 1: %r" % keys[0])
  75. print("Guess 2: %r" % keys[1])
  76.  
  77. print("TEST:")
  78. res1 = des_enc(plaintext, keys[0])
  79. res2 = des_dec(ciphertext, keys[1])
  80. print("enc(p):\t\t%r" % res1)
  81. print("dec(c):\t\t%r" % res2)
  82. print("Expected:\t%r" % middle)
  83.  
  84. if res1 == res2 and keys[0] == k1 and keys[1] == k2:
  85.     print("SUCCESS")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement