Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import random
- class Cryptography(object):
- def __init__(self, key, kuz_table):
- self.keys = [(key >> (32 * i)) & 0xFFFFFFFF for i in range(8)]
- self.keys = self.keys[::-1]
- self.table = kuz_table
- def round(self, part, key):
- temp = (part + key) % (1 << 32)
- value = 0
- for i in range(8):
- value |= ((self.table[i][(temp >> (4 * i)) & 0b1111]) << (4 * i))
- return ((value << 11) | (value >> (32 - 11))) & 0xFFFFFFFF
- def encrypt(self, text):
- def _encrypt_round(left_part, right_part, round_key):
- return right_part, left_part ^ self.round(right_part, round_key)
- left_part = text >> 32
- right_part = text & 0xFFFFFFFF
- for i in range(24):
- left_part, right_part = _encrypt_round(left_part, right_part, self.keys[i % 8])
- for i in range(8):
- left_part, right_part = _encrypt_round(left_part, right_part, self.keys[7 - i])
- return (right_part << 32) | left_part
- def decrypt(self, crypted_msg):
- def _decrypt_round(left_part, right_part, round_key):
- return right_part, left_part ^ self.round(right_part, round_key)
- left_part = crypted_msg >> 32
- right_part = crypted_msg & 0xFFFFFFFF
- for i in range(8):
- left_part, right_part = _decrypt_round(left_part, right_part, self.keys[i])
- for i in range(24):
- left_part, right_part = _decrypt_round(left_part, right_part, self.keys[(7 - i) % 8])
- return (right_part << 32) | left_part
- kuz_table = [
- [12, 4, 6, 2, 10, 5, 11, 9, 14, 8, 13, 7, 0, 3, 15, 1],
- [6, 8, 2, 3, 9, 10, 5, 12, 1, 14, 4, 7, 11, 13, 0, 15],
- [11, 3, 5, 8, 2, 15, 10, 13, 14, 1, 7, 4, 12, 9, 6, 0],
- [12, 8, 2, 1, 13, 4, 15, 6, 7, 0, 10, 5, 3, 14, 9, 11],
- [7, 15, 5, 10, 8, 1, 6, 13, 0, 9, 3, 14, 11, 4, 2, 12],
- [5, 13, 15, 6, 9, 2, 12, 10, 11, 7, 8, 1, 4, 3, 14, 0],
- [8, 14, 2, 5, 6, 9, 1, 12, 15, 4, 11, 0, 13, 10, 3, 7],
- [1, 7, 14, 13, 0, 5, 8, 3, 4, 15, 10, 6, 9, 12, 11, 2]
- ]
- to_encrypt = open('text_ecb.txt', 'r')
- text = int(to_encrypt.read()[2:], 16)
- plain = text
- blocks = []
- while text:
- blocks.append(text & 0xFFFFFFFFFFFFFFFF)
- text = text >> 64
- print('Text: ' + str(hex(plain)))
- key = 0xffeeddccbbaa99887766554433221100f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff # random.randrange(2**255 + 1, 2**256)
- print('Key: ' + str(hex(key)))
- cypher = Cryptography(key, kuz_table)
- enc_blocks = []
- for block in blocks:
- enc = cypher.encrypt(block)
- enc_blocks.append(enc)
- encrypted_text = 0
- for block in enc_blocks[::-1]:
- encrypted_text = encrypted_text << 64
- encrypted_text = encrypted_text ^ block
- print('Encrypted text: ' + str(hex(encrypted_text)))
- aga = open('cypher.txt', 'w+')
- aga.write(str(hex(encrypted_text)))
- aga.close()
- to_decrypt = open('cypher.txt', 'r')
- cypher_text = int(to_decrypt.read()[2:], 16)
- blocks = []
- enc_blocks = []
- while cypher_text:
- enc_blocks.append(cypher_text & 0xFFFFFFFFFFFFFFFF)
- cypher_text = cypher_text >> 64
- for block in enc_blocks:
- enc = cypher.decrypt(block)
- blocks.append(enc)
- decrypted_text = 0
- for block in blocks[::-1]:
- decrypted_text = decrypted_text << 64
- decrypted_text = decrypted_text ^ block
- print('Decrypted text: ' + str(hex(decrypted_text)))
- print(plain == decrypted_text)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement