CodeTyper

Backup

Jun 1st, 2023
247
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.12 KB | None | 0 0
  1. from Crypto.Cipher import PKCS1_OAEP
  2. from Crypto.PublicKey import RSA
  3.  
  4. from Crypto.Hash import SHA256, SHA512, SHA1
  5. from Crypto.Signature import PKCS1_PSS
  6. import binascii
  7. import secrets
  8.  
  9.  
  10. def encrypt_long_message(message, key):
  11. # Set the chunk size to encrypt in bytes
  12. chunk_size_bytes = 190
  13.  
  14. # Encrypt the message using the provided RSA key
  15. cipher = PKCS1_OAEP.new(key)
  16.  
  17. # Break up the message into smaller chunks and encrypt each chunk separately
  18. offset = 0
  19. chunks = []
  20. while offset < len(message):
  21. chunk = message[offset:offset + chunk_size_bytes]
  22. if len(chunk) % chunk_size_bytes != 0:
  23. chunk += b' ' * (chunk_size_bytes - len(chunk) % chunk_size_bytes)
  24. chunks.append(cipher.encrypt(chunk))
  25. offset += chunk_size_bytes
  26.  
  27. # Concatenate the encrypted chunks together and return the result
  28. return b''.join(chunks)
  29.  
  30.  
  31. def decrypt_long_message(encrypted_message, key):
  32. # Set the chunk size to decrypt in bytes
  33. chunk_size_bytes = 256
  34.  
  35. # Decrypt the message using the provided RSA key
  36. cipher = PKCS1_OAEP.new(key)
  37.  
  38. # Break up the message into smaller chunks and decrypt each chunk separately
  39. offset = 0
  40. decrypted_chunks = []
  41. while offset < len(encrypted_message):
  42. chunk = encrypted_message[offset:offset + chunk_size_bytes]
  43. decrypted_chunks.append(cipher.decrypt(chunk))
  44. offset += chunk_size_bytes
  45.  
  46. # Concatenate the decrypted chunks together and return the result
  47. decrypted_message = b''.join(decrypted_chunks)
  48.  
  49. # Remove any padding that may have been added
  50. decrypted_message = decrypted_message.strip()
  51.  
  52. return decrypted_message
  53.  
  54.  
  55. class Client:
  56. def __init__(self):
  57. self.rsa_length_bits = 2048
  58. self.hash_func = SHA512
  59.  
  60. # Enc and sign
  61. self.client_rsa_enc_key = RSA.generate(2048)
  62. self.client_rsa_sign_key = RSA.generate(2048)
  63.  
  64. self.signature = None
  65. self.client_private_key = None
  66.  
  67. self.num_rand_bytes = 32
  68. self.private_num_rand_bytes = 48
  69. self.premaster_secret = ''
  70. self.master_secret = ''
  71.  
  72. self.client_write_mac_key = ''
  73. self.server_write_mac_key = ''
  74. self.client_write_key = ''
  75. self.server_write_key = ''
  76.  
  77. self.block = ''
  78. self.client_public_random = secrets.token_bytes(self.num_rand_bytes)
  79. self.client_private_random = secrets.token_bytes(self.private_num_rand_bytes)
  80.  
  81. #sha512(message).digest()
  82. def generate_keys_client_side(self):
  83. client_rsa_enc_key = self.client_rsa_enc_key.e, self.client_rsa_enc_key.n
  84. client_rsa_sign_key = self.client_rsa_sign_key.e, self.client_rsa_sign_key.n
  85.  
  86. print("Client RSA Public Enc Key = ", client_rsa_enc_key) # Public key, n
  87. print("Client RSA Public Sign Key = ", client_rsa_sign_key) # Public key, n
  88.  
  89. def generate_public_random_32_bytes(self):
  90. # Generate 32 random bytes on both sides (client_public_random, server_public_random)
  91. print("Client Public 32 random bytes = ", self.client_public_random)
  92.  
  93. def generate_private_random_48_bytes(self):
  94. print("Client Private 48 random bytes = ", self.client_private_random)
  95.  
  96. def sign_and_send(self, server_rsa_enc_key):
  97. client_private_random_hash = SHA512.new(self.client_private_random)
  98. client_signature_scheme = PKCS1_PSS.new(self.client_rsa_sign_key)
  99. client_signature = client_signature_scheme.sign(client_private_random_hash)
  100.  
  101. encrypted_signature_chunk = encrypt_long_message(client_signature, server_rsa_enc_key)
  102. return encrypted_signature_chunk
  103.  
  104. def receive_signature_from_client_and_verify(self, server_rsa_enc_key, encrypted_signature_chunk):
  105. decrypted_signature = decrypt_long_message(encrypted_signature_chunk, server_rsa_enc_key)
  106. verifier = PKCS1_PSS.new(self.client_rsa_sign_key.publickey())
  107.  
  108. client_private_random_hash = SHA512.new(self.client_private_random)
  109. try:
  110. verifier.verify(client_private_random_hash, decrypted_signature)
  111. print("The signature is authentic.")
  112. except:
  113. print("The signature is not authentic.")
  114.  
  115.  
  116.  
  117. def combine_private_randoms(self, client_private_random, server_private_random):
  118. self.premaster_secret = client_private_random + server_private_random
  119. print("Pre master secret = ", self.premaster_secret)
  120.  
  121. def generate_master_secret(self, client_public_random, server_public_random):
  122. self.concat_public_random = client_public_random + server_public_random
  123. self.concat_public_random = self.concat_public_random.encode()
  124.  
  125. self.master_secret = prf(hashlib.sha256, self.premaster_secret.encode(), b'master secret', self.concat_public_random, b'seed', self.private_num_rand_bytes)
  126.  
  127. print("Master secret = ", self.master_secret)
  128.  
  129. def generate_with_prf(self):
  130. total_bytes = 32 + 32 + 2 + 2
  131.  
  132. #drop the message
  133. self.block = prf(self.hash_func, self.master_secret, b'key expansion', self.concat_public_random, b'seed', total_bytes)
  134. #prf(hashlib.sha256, self.master_secret, b'master secret', self.concat_public_random, b'seed', self.private_num_rand_bytes)
  135.  
  136. self.client_write_mac_key = self.block[0:33]
  137. self.server_write_mac_key = self.block[32:63]
  138. self.client_write_key = self.block[64:65]
  139. self.server_write_key = self.block[66:67]
  140.  
  141. print("Block = ", self.block)
  142. print("client_write_mac_key = " + str(self.client_write_mac_key))
  143. print("server_write_mac_key = " + str(self.server_write_mac_key))
  144. print("client_write_key = " + str(self.client_write_key))
  145. print("server_write_key = " + str(self.server_write_key))
  146.  
  147.  
  148. def send_message_from_server(self, message):
  149. # 13
  150. encrypted = encrypt(message, self.client_write_key)
  151. authenticated = hmac(encrypted, self.server_write_mac_key)
  152.  
  153. print("Encrypted = ", encrypted)
  154. print("Authenticated = ", authenticated)
  155.  
  156. def decrypt_message(self, message, authentication_code):
  157. decrypted = decrypt(message, self.client_write_key)
  158.  
  159. authenticated = hmac(decrypted, self.server_write_mac_key)
  160. # Check
  161. if authentication_code == authenticated:
  162. print("JΓ³!")
  163.  
  164. return None
  165.  
  166. def verify_authentication_code(self, message):
  167. # 13
  168.  
  169. return None
  170.  
  171.  
  172. def send_message(self, private_key):
  173. signed_client_private_random = sign_message(private_key, self.hash_func, message)
  174. send = rsa_oaep_encode(self.rsa_length_bits, b'', signed_client_private_random) #Place It here
  175.  
  176. print("Send = ", str(send));
  177.  
  178. def receive_message(self, encoded_message):
  179. decoded_message = rsa_oaep_decode(256, b'', encoded_message)
  180. return message
Advertisement
Add Comment
Please, Sign In to add comment