Update app_secure_client.py and lib_secure_server.py - fully functional
This commit is contained in:
parent
309eb3f439
commit
32d5945805
@ -16,8 +16,10 @@ import struct
|
|||||||
import hashlib
|
import hashlib
|
||||||
from Crypto import Random
|
from Crypto import Random
|
||||||
from Crypto.PublicKey import RSA
|
from Crypto.PublicKey import RSA
|
||||||
|
from Crypto.Cipher import AES
|
||||||
|
|
||||||
HDRLEN = 2
|
HDRLEN = 2
|
||||||
|
PASSWORD = 'adminadmin'
|
||||||
|
|
||||||
class Message:
|
class Message:
|
||||||
def __init__(self, sock, addr):
|
def __init__(self, sock, addr):
|
||||||
@ -27,6 +29,7 @@ class Message:
|
|||||||
self.sessionkey = None
|
self.sessionkey = None
|
||||||
self.serverkey = None
|
self.serverkey = None
|
||||||
self.addr = addr
|
self.addr = addr
|
||||||
|
self.handshake = False
|
||||||
|
|
||||||
def _json_encode(self,obj, encoding):
|
def _json_encode(self,obj, encoding):
|
||||||
return json.dumps(obj, ensure_ascii=False).encode(encoding)
|
return json.dumps(obj, ensure_ascii=False).encode(encoding)
|
||||||
@ -40,15 +43,24 @@ class Message:
|
|||||||
return obj
|
return obj
|
||||||
|
|
||||||
def _create_message(self, *, content_bytes, content_type, content_encoding):
|
def _create_message(self, *, content_bytes, content_type, content_encoding):
|
||||||
|
if self.handshake:
|
||||||
|
# encrypt content_bytes
|
||||||
|
key = self.sessionkey + self.sessionkey[::-1]
|
||||||
|
iv = Random.new().read(AES.block_size)
|
||||||
|
cipher = AES.new(key, AES.MODE_CFB, iv)
|
||||||
|
data = iv + cipher.encrypt(content_bytes)
|
||||||
|
else:
|
||||||
|
data = content_bytes
|
||||||
|
|
||||||
jsonheader = {
|
jsonheader = {
|
||||||
"byteorder": sys.byteorder,
|
"byteorder": sys.byteorder,
|
||||||
"content-type": content_type,
|
"content-type": content_type,
|
||||||
"content-encoding": content_encoding,
|
"content-encoding": content_encoding,
|
||||||
"content-length": len(content_bytes),
|
"content-length": len(data),
|
||||||
}
|
}
|
||||||
jsonheader_bytes = self._json_encode(jsonheader, "utf-8")
|
jsonheader_bytes = self._json_encode(jsonheader, "utf-8")
|
||||||
message_hdr = struct.pack(">H", len(jsonheader_bytes))
|
message_hdr = struct.pack(">H", len(jsonheader_bytes))
|
||||||
message = message_hdr + jsonheader_bytes + content_bytes
|
message = message_hdr + jsonheader_bytes + data
|
||||||
return message
|
return message
|
||||||
|
|
||||||
def send_request(self, request):
|
def send_request(self, request):
|
||||||
@ -93,6 +105,12 @@ class Message:
|
|||||||
content_len = jsonheader["content-length"]
|
content_len = jsonheader["content-length"]
|
||||||
self.read_to_buffer(content_len)
|
self.read_to_buffer(content_len)
|
||||||
data = self._recv_buffer[:content_len]
|
data = self._recv_buffer[:content_len]
|
||||||
|
# decrypt data
|
||||||
|
iv = bytes(data[:16])
|
||||||
|
encrypted = bytes(data[16:])
|
||||||
|
key = self.sessionkey + self.sessionkey[::-1]
|
||||||
|
cipher = AES.new(key, AES.MODE_CFB, iv)
|
||||||
|
data = cipher.decrypt(encrypted)
|
||||||
self._recv_buffer = self._recv_buffer[content_len:]
|
self._recv_buffer = self._recv_buffer[content_len:]
|
||||||
if jsonheader["content-type"] == "text/json":
|
if jsonheader["content-type"] == "text/json":
|
||||||
encoding = jsonheader["content-encoding"]
|
encoding = jsonheader["content-encoding"]
|
||||||
@ -168,6 +186,7 @@ class Message:
|
|||||||
data = self.serverkey.encrypt(passhash + sesshash, None)[0]
|
data = self.serverkey.encrypt(passhash + sesshash, None)[0]
|
||||||
print(f'Sending passphrase + hash + sessionkey hash...')
|
print(f'Sending passphrase + hash + sessionkey hash...')
|
||||||
self._send_handshake(data)
|
self._send_handshake(data)
|
||||||
|
self.handshake = True
|
||||||
|
|
||||||
|
|
||||||
def create_request(action, value):
|
def create_request(action, value):
|
||||||
@ -205,7 +224,7 @@ def main():
|
|||||||
message._send_handshake(data)
|
message._send_handshake(data)
|
||||||
# receiving server secrets - public key and session key
|
# receiving server secrets - public key and session key
|
||||||
message._recv_handshake()
|
message._recv_handshake()
|
||||||
message.send_passphrase('adminadmin')
|
message.send_passphrase(PASSWORD)
|
||||||
print('Handshake completed. Sever would close the sock if password wrong')
|
print('Handshake completed. Sever would close the sock if password wrong')
|
||||||
|
|
||||||
action, value = sys.argv[3], sys.argv[4]
|
action, value = sys.argv[3], sys.argv[4]
|
||||||
|
@ -14,6 +14,7 @@ import struct
|
|||||||
import hashlib
|
import hashlib
|
||||||
from Crypto import Random
|
from Crypto import Random
|
||||||
from Crypto.PublicKey import RSA
|
from Crypto.PublicKey import RSA
|
||||||
|
from Crypto.Cipher import AES
|
||||||
|
|
||||||
|
|
||||||
request_search = {
|
request_search = {
|
||||||
@ -113,6 +114,13 @@ class Message:
|
|||||||
message = message_hdr + jsonheader_bytes + content_bytes
|
message = message_hdr + jsonheader_bytes + content_bytes
|
||||||
return message
|
return message
|
||||||
|
|
||||||
|
def encrypt_data(self, data):
|
||||||
|
key = self.sessionkey + self.sessionkey[::-1]
|
||||||
|
iv = Random.new().read(AES.block_size)
|
||||||
|
cipher = AES.new(key, AES.MODE_CFB, iv)
|
||||||
|
msg = iv + cipher.encrypt(data)
|
||||||
|
return msg
|
||||||
|
|
||||||
def _create_response_json_content(self):
|
def _create_response_json_content(self):
|
||||||
action = self.request.get("action")
|
action = self.request.get("action")
|
||||||
if action == "search":
|
if action == "search":
|
||||||
@ -122,17 +130,20 @@ class Message:
|
|||||||
else:
|
else:
|
||||||
content = {"result": f'Error: invalid action "{action}".'}
|
content = {"result": f'Error: invalid action "{action}".'}
|
||||||
content_encoding = "utf-8"
|
content_encoding = "utf-8"
|
||||||
|
# encrypt content_bytes
|
||||||
|
data = self.encrypt_data(self._json_encode(content, content_encoding))
|
||||||
|
|
||||||
response = {
|
response = {
|
||||||
"content_bytes": self._json_encode(content, content_encoding),
|
"content_bytes": data,
|
||||||
"content_type": "text/json",
|
"content_type": "text/json",
|
||||||
"content_encoding": content_encoding,
|
"content_encoding": content_encoding,
|
||||||
}
|
}
|
||||||
return response
|
return response
|
||||||
|
|
||||||
def _create_response_binary_content(self):
|
def _create_response_binary_content(self):
|
||||||
|
msg = self.encrypt_data(b"First 10 bytes of request: " + self.request[:10])
|
||||||
response = {
|
response = {
|
||||||
"content_bytes": b"First 10 bytes of request: "
|
"content_bytes": msg,
|
||||||
+ self.request[:10],
|
|
||||||
"content_type": "binary/custom-server-binary-type",
|
"content_type": "binary/custom-server-binary-type",
|
||||||
"content_encoding": "binary",
|
"content_encoding": "binary",
|
||||||
}
|
}
|
||||||
@ -270,7 +281,12 @@ class Message:
|
|||||||
self._reset_header()
|
self._reset_header()
|
||||||
self._set_selector_events_mask("r")
|
self._set_selector_events_mask("r")
|
||||||
else:
|
else:
|
||||||
print(f"Receiving request (unencrypted yet)")
|
print(f"Receiving request (encrypted)")
|
||||||
|
iv = data[:16]
|
||||||
|
encrypted = data[16:]
|
||||||
|
key = self.sessionkey + self.sessionkey[::-1]
|
||||||
|
cipher = AES.new(key, AES.MODE_CFB, iv)
|
||||||
|
data = cipher.decrypt(encrypted)
|
||||||
if self.jsonheader["content-type"] == "text/json":
|
if self.jsonheader["content-type"] == "text/json":
|
||||||
encoding = self.jsonheader["content-encoding"]
|
encoding = self.jsonheader["content-encoding"]
|
||||||
self.request = self._json_decode(data, encoding)
|
self.request = self._json_decode(data, encoding)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user