Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from random import randrange
- from Crypto.Cipher import AES
- from Crypto.Util.Padding import pad, unpad
- from base64 import b64encode, b64decode
- def generate_key():
- return randrange(1e15, 1e16 - 2)
- def generate_shared(private_key, public_key):
- return str(private_key * public_key)[-16:]
- def encrypt_message(message, key):
- message = str(message).encode()
- key = str(key).encode()
- cipher = AES.new(key, AES.MODE_CBC)
- ciphertext_bytes = cipher.encrypt(pad(message, AES.block_size))
- return b64encode(cipher.iv).decode('utf-8'), b64encode(ciphertext_bytes).decode('utf-8')
- def decrypt_message(key, iv, ciphertext):
- key = str(key).encode()
- iv = b64decode(iv)
- ciphertext = b64decode(ciphertext)
- cipher = AES.new(key, AES.MODE_CBC, iv)
- return unpad(cipher.decrypt(ciphertext), AES.block_size).decode()
- if __name__ == '__main__': # Testing the theory
- public = 1234567890101112
- client = randrange(1e15, 1e16)
- server = randrange(1e15, 1e16)
- print('Public key: {:d}\nClient key: {:d}\nServer key: {:d}\n'.format(public, client, server))
- pub_cli = int(str(public * client)[-16:]) # push_zero(public * client, 15)
- pub_ser = int(str(public * server)[-16:]) # push_zero(public * server, 15)
- print('Last 16 digits of public * client: {:d}\nLast 16 digits of public * server: {:d}\n'.format(pub_cli, pub_ser))
- shared_key_cli = int(str(pub_ser * client)[-16:]) # push_zero(pub_ser * client, 15)
- shared_key_ser = int(str(pub_cli * server)[-16:]) # push_zero(pub_cli * server, 15)
- print('Last 16 digits of pub_ser * client: {:d}\nLast 16 digits of pub_cli * server: {:d} (This is the shared key)'
- '\nshared_key_cli == shared_key_ser = {}'.format(shared_key_cli, shared_key_ser,
- shared_key_cli == shared_key_ser))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement