speck_sim.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. block_size = 64
  2. word_size = block_size >> 1 # 32
  3. key_size = 128
  4. key = 0xe3cda8f459e1f0cf
  5. alpha_shift = 8
  6. beta_shift = 3
  7. mod_mask = (2 ** word_size) - 1
  8. def simpleSpeck(plaintext):
  9. right_key = key & mod_mask
  10. right_plain = plaintext & mod_mask
  11. left_plain = (plaintext >> word_size) & mod_mask
  12. # Run Encryption Steps For Appropriate Number of Rounds
  13. rs_x = ((left_plain << (word_size - alpha_shift)) + (right_plain >> alpha_shift)) & mod_mask
  14. add_sxy = (rs_x + right_plain) & mod_mask
  15. x = right_key ^ add_sxy
  16. return x
  17. def hw_model(key_guess, plaintext):
  18. right_key = key_guess & mod_mask
  19. right_plain = plaintext & mod_mask
  20. left_plain = (plaintext >> word_size) & mod_mask
  21. # Run Encryption Steps For Appropriate Number of Rounds
  22. rs_x = ((left_plain << (word_size - alpha_shift)) + (right_plain >> alpha_shift)) & mod_mask
  23. add_sxy = (rs_x + right_plain) & mod_mask
  24. x = right_key ^ add_sxy
  25. return x
  26. def encrypt_function(self, upper_word, lower_word):
  27. x = upper_word
  28. y = lower_word
  29. # Run Encryption Steps For Appropriate Number of Rounds
  30. for k in self.key_schedule:
  31. rs_x = ((x << (self.word_size - self.alpha_shift)) + (x >> self.alpha_shift)) & self.mod_mask
  32. add_sxy = (rs_x + y) & self.mod_mask
  33. x = k ^ add_sxy
  34. ls_y = ((y >> (self.word_size - self.beta_shift)) + (y << self.beta_shift)) & self.mod_mask
  35. y = x ^ ls_y
  36. return x,y