Advertisement
Guest User

Untitled

a guest
Feb 24th, 2020
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.39 KB | None | 0 0
  1. import random
  2.  
  3.  
  4. class Cryptography(object):
  5. def __init__(self, key, kuz_table):
  6. self.keys = [(key >> (32 * i)) & 0xFFFFFFFF for i in range(8)]
  7. self.keys = self.keys[::-1]
  8. self.table = kuz_table
  9.  
  10. def round(self, part, key):
  11. temp = (part + key) % (1 << 32)
  12. value = 0
  13. for i in range(8):
  14. value |= ((self.table[i][(temp >> (4 * i)) & 0b1111]) << (4 * i))
  15. return ((value << 11) | (value >> (32 - 11))) & 0xFFFFFFFF
  16.  
  17. def encrypt(self, text):
  18. def _encrypt_round(left_part, right_part, round_key):
  19. return right_part, left_part ^ self.round(right_part, round_key)
  20.  
  21. left_part = text >> 32
  22. right_part = text & 0xFFFFFFFF
  23.  
  24. for i in range(24):
  25. left_part, right_part = _encrypt_round(left_part, right_part, self.keys[i % 8])
  26.  
  27. for i in range(8):
  28. left_part, right_part = _encrypt_round(left_part, right_part, self.keys[7 - i])
  29.  
  30. return (right_part << 32) | left_part
  31.  
  32. def decrypt(self, crypted_msg):
  33. def _decrypt_round(left_part, right_part, round_key):
  34. return right_part, left_part ^ self.round(right_part, round_key)
  35.  
  36. left_part = crypted_msg >> 32
  37. right_part = crypted_msg & 0xFFFFFFFF
  38. for i in range(8):
  39. left_part, right_part = _decrypt_round(left_part, right_part, self.keys[i])
  40.  
  41. for i in range(24):
  42. left_part, right_part = _decrypt_round(left_part, right_part, self.keys[(7 - i) % 8])
  43.  
  44. return (right_part << 32) | left_part
  45.  
  46.  
  47. kuz_table = [
  48. [12, 4, 6, 2, 10, 5, 11, 9, 14, 8, 13, 7, 0, 3, 15, 1],
  49. [6, 8, 2, 3, 9, 10, 5, 12, 1, 14, 4, 7, 11, 13, 0, 15],
  50. [11, 3, 5, 8, 2, 15, 10, 13, 14, 1, 7, 4, 12, 9, 6, 0],
  51. [12, 8, 2, 1, 13, 4, 15, 6, 7, 0, 10, 5, 3, 14, 9, 11],
  52. [7, 15, 5, 10, 8, 1, 6, 13, 0, 9, 3, 14, 11, 4, 2, 12],
  53. [5, 13, 15, 6, 9, 2, 12, 10, 11, 7, 8, 1, 4, 3, 14, 0],
  54. [8, 14, 2, 5, 6, 9, 1, 12, 15, 4, 11, 0, 13, 10, 3, 7],
  55. [1, 7, 14, 13, 0, 5, 8, 3, 4, 15, 10, 6, 9, 12, 11, 2]
  56. ]
  57. to_encrypt = open('text_ecb.txt', 'r')
  58. text = int(to_encrypt.read()[2:], 16)
  59.  
  60. plain = text
  61.  
  62. blocks = []
  63. while text:
  64. blocks.append(text & 0xFFFFFFFFFFFFFFFF)
  65. text = text >> 64
  66.  
  67. print('Text: ' + str(hex(plain)))
  68.  
  69. key = 0xffeeddccbbaa99887766554433221100f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff # random.randrange(2**255 + 1, 2**256)
  70. print('Key: ' + str(hex(key)))
  71.  
  72. cypher = Cryptography(key, kuz_table)
  73.  
  74. enc_blocks = []
  75.  
  76. for block in blocks:
  77. enc = cypher.encrypt(block)
  78. enc_blocks.append(enc)
  79.  
  80. encrypted_text = 0
  81. for block in enc_blocks[::-1]:
  82. encrypted_text = encrypted_text << 64
  83. encrypted_text = encrypted_text ^ block
  84.  
  85.  
  86. print('Encrypted text: ' + str(hex(encrypted_text)))
  87. aga = open('cypher.txt', 'w+')
  88. aga.write(str(hex(encrypted_text)))
  89. aga.close()
  90.  
  91. to_decrypt = open('cypher.txt', 'r')
  92. cypher_text = int(to_decrypt.read()[2:], 16)
  93.  
  94. blocks = []
  95. enc_blocks = []
  96.  
  97. while cypher_text:
  98. enc_blocks.append(cypher_text & 0xFFFFFFFFFFFFFFFF)
  99. cypher_text = cypher_text >> 64
  100.  
  101.  
  102. for block in enc_blocks:
  103. enc = cypher.decrypt(block)
  104. blocks.append(enc)
  105.  
  106. decrypted_text = 0
  107. for block in blocks[::-1]:
  108. decrypted_text = decrypted_text << 64
  109. decrypted_text = decrypted_text ^ block
  110.  
  111. print('Decrypted text: ' + str(hex(decrypted_text)))
  112.  
  113. print(plain == decrypted_text)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement