Advertisement
Guest User

Untitled

a guest
Dec 10th, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.08 KB | None | 0 0
  1. import socket
  2. import threading
  3. import sys
  4. import hashlib
  5. import os
  6. import OpenSSL
  7. import Encryptor
  8. import time
  9. from OpenSSL import SSL
  10. from OpenSSL import crypto
  11. from Crypto import Random
  12. from Crypto.Cipher import AES
  13. from diffiehellman.diffiehellman import DiffieHellman
  14. from OpenCA import createCSR
  15.  
  16. BUFSIZE=32768
  17.  
  18. class Client:
  19. sock= socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  20. mujAES=None
  21. cli=None
  22. cislo=0
  23. def __init__(self,adress):
  24.  
  25. self.sock.connect((adress, 9876))
  26. print("Připojen k serveru na adrese" + adress)
  27. #zjisti zda už u sebe má certifikát nebo alespoň certreq, pokud ano pošle ho serveru, pokud ne vytvoří a pošle žádost
  28. if os.path.isfile('User.private.pem') == False or os.path.isfile('client1.cert.pem') == False:
  29. createCSR('User','heslo',{'CN':'USER_FQDN'})
  30. self.poslatCertReq()
  31. print("Certifikát nenalezen, žádám o nový.")
  32.  
  33. else:
  34. print("Certifikát nalezen, odesílám autoritě.")
  35. self.cert=OpenSSL.crypto.load_certificate(crypto.FILETYPE_PEM,open('client1.cert.pem').read())
  36. self.poslatCert()
  37.  
  38. #diffie hellman generace veřejných klíčů
  39. self.cli=DiffieHellman()
  40. self.cli.generate_public_key()
  41.  
  42. self.vyzadatKlic()
  43.  
  44. iThread=threading.Thread(target=self.sendMessage)
  45. iThread.daemon=True
  46. iThread.start()
  47. self.run()
  48.  
  49.  
  50. def run(self):
  51.  
  52. while True:
  53. data=self.sock.recv(BUFSIZE)
  54. #zde se resi typy zprav
  55. if not data:
  56. #ukonceni komunikace
  57. break
  58.  
  59. elif data[0:1]==b"\x11":
  60. #kdyz prijde ridici znak x11-posleme na vyzadani klic
  61. self.nastavitKlic(data[1:])
  62. self.poslatKlic()
  63. self.cislo=1
  64.  
  65. elif data[0:1]==b"\x12":
  66. #kdyz prijde ridici znak x12 tak si nastavime klic ktery nasleduje po tomto bytu
  67. self.nastavitKlic(data[1:])
  68. self.cislo=2
  69.  
  70. #elif data[0:1]==b"\x13":
  71. #nastaveni klice v pripade ze byl vyzadan
  72. # self.nastavitKlic(data[1:])
  73.  
  74. elif data[0:1]==b"\x21":
  75. #kdyz prijde ridici znak x21 - prisel hotovy certifikat, nastavime ho
  76. print("Certifikát přijat.")
  77. with open('client1.cert.pem','wb') as cert:
  78. cert.write(data[1:])
  79. self.nastavitCert(data[1:])
  80.  
  81. elif data[0:1]==b"\x22":
  82. #ridici znak x22 - server nas pozadal o novou zadost o certifikat
  83. createCSR('User','heslo',{'CN':'USER_FQDN'})
  84. self.poslatCertReq()
  85.  
  86. elif data[0:1]==b"\x98":
  87. #nezasifrovana komunikace - nemelo by nastat
  88. print(data.decode())
  89.  
  90. elif data[0:1]==b"\x99":
  91. #sifrovana komunikace
  92. data=self.mujAES.decrypt(data[1:])
  93. try:
  94. print("Klient "+str(self.cislo)+":"+data.decode())
  95. except:
  96. continue
  97.  
  98. def nastavitCert(self,data):
  99. #funkce která uloží certifikát a vypíše ho
  100. self.cert=OpenSSL.crypto.load_certificate(crypto.FILETYPE_PEM,data)
  101. print("Certifikát uložen.")
  102. cert=OpenSSL.crypto.load_certificate(crypto.FILETYPE_PEM,open('client1.cert.pem').read())
  103. print(OpenSSL.crypto.dump_certificate(crypto.FILETYPE_TEXT,cert).decode())
  104.  
  105. def poslatCert(self):
  106. #funkce která posílá existující certifikát serveru pro ověření
  107. print("Posílám certifikát")
  108. text=OpenSSL.crypto.dump_certificate(crypto.FILETYPE_PEM,self.cert)
  109. self.sock.send(b'\x23'+text)
  110.  
  111. def poslatCertReq(self):
  112. #posle certifikat na podepsani¨
  113. with open('User.CSR.pem') as cert:
  114. certificate = OpenSSL.crypto.load_certificate_request(crypto.FILETYPE_PEM, cert.read())
  115. certext = OpenSSL.crypto.dump_certificate_request(crypto.FILETYPE_PEM, certificate)
  116. print("Žádost" + str(certext))
  117. self.sock.send(b'\x25'+certext)
  118. print('Žádost odeslána.')
  119.  
  120. def poslatKlic(self):
  121. #posle ridici znak nasledovany klicem
  122. self.sock.send(b'\x12'+str(self.cli.public_key).encode())
  123. print("Posílám veřejný klíč.")
  124.  
  125. def nastavitKlic(self,data):
  126. #nastavuje klic na zaklade dat ktere dostane
  127. self.cli.generate_shared_secret(int(data.decode()),echo_return_key=True)
  128. superklic=str(self.cli.shared_secret)
  129. klic=hashlib.sha256(superklic.encode()).hexdigest()[:32]
  130. print("Tajný klíč vytvořen.")
  131. #self.cislo=1
  132. print("Klíč pro AES:" +klic)
  133. self.mujAES=Encryptor.Encryptor(klic)
  134. #self.sock.send(b'\x13'+str(self.cli.public_key).encode())
  135.  
  136. # def jinenastaveniklice(self,data):
  137. # #nastavuje klic v případě že jsme ho vyžádali
  138. # self.cli.generate_shared_secret(int(data.decode()),echo_return_key=True)
  139. # superklic=str(self.cli.shared_secret)
  140. # klic=hashlib.sha256(superklic.encode()).hexdigest()[:32]
  141. # print("Tajný klíč vytvořen.")
  142. # self.cislo=2
  143. # print("Klíč pro AES:" + klic)
  144. #self.mujAES=Encryptor.Encryptor(klic)
  145.  
  146. def vyzadatKlic(self):
  147. #nemam klic ale chci, poslu ridici znak
  148. print("Žádám o veřejný klíč pro DH.")
  149. self.sock.send(b'\x11'+str(self.cli.public_key).encode())
  150.  
  151. def sendMessage(self):
  152. #hlavni chatova smycka
  153.  
  154. while True:
  155. msg=str(input(""))
  156.  
  157. if self.mujAES is not None:
  158. msg=self.mujAES.encrypt(msg.encode())
  159. self.sock.send(b'\x99' + msg)
  160. else:
  161. msg=msg.encode()
  162. self.sock.send(b'\x98'+msg)
  163.  
  164.  
  165. adresa='127.0.0.1'
  166. client=Client(adresa)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement