def _format_packet_fd(cls, packet, prelen): key = encryption.decode_public_key(packet['public_key']) modulus = cls._split_lines("%x" % key.key.n, "modulus: 0x", prelen) token = ' '.join("%02x" % ord(c) for c in packet['challenge_token']) raw = cls._bytes(packet['public_key'], "raw: ", prelen) return {'challenge_token': token, 'public_key': ["exponent: 0x%x" % key.key.e] + modulus + raw}
import encryption as encrypt from nacl import encoding psw_bob = "This is Bob's psw" psw_alice = "This is Alice's psw" Bob_private_key2,Bob_public_key2 = encrypt.create_key(psw_bob) Alice_private_key2,Alice_public_key2 = encrypt.create_key(psw_alice) raw_private_key = encrypt.encode_key(Bob_private_key2) raw_public_key = encrypt.encode_key(Alice_public_key2) secert_key = encrypt.decode_private_key(raw_private_key) public_key = encrypt.decode_public_key(raw_public_key) msg = encrypt.sha_256("Hi Alice, I love you") print(raw_public_key) msg_sign = encrypt.sign(msg, secert_key) s=encoding.RawEncoder.encode(msg_sign) print (s) res,s = encrypt.verify(str(111),public_key) print(res) msg_send = "bob to alice"
def handle_read(self): """Read all available bytes, and process as many packets as possible. """ t = time() if self.last_report + 5 < t and self.stream.tot_bytes > 0: self.last_report = t logger.debug( "%s: total/wasted bytes is %d/%d (%f wasted)" % (self.side, self.stream.tot_bytes, self.stream.wasted_bytes, 100 * float(self.stream.wasted_bytes) / self.stream.tot_bytes)) self.stream.append(self.recv(4092)) if self.out_of_sync: data = self.stream.read(len(self.stream)) self.stream.packet_finished() if self.other_side: self.other_side.send(data) return try: packet = parse_packet(self.stream, self.msg_spec, self.side) while packet != None: rebuild = False if packet['msgtype'] == 0x02 and self.side == 'client': # Determine which protocol message definitions to use. proto_version = packet['proto_version'] logger.info('Client requests protocol version %d' % proto_version) if not proto_version in messages.protocol: logger.error("Unsupported protocol version %d" % proto_version) self.handle_close() return self.username = packet['username'] self.msg_spec, self.other_side.msg_spec = messages.protocol[ proto_version] self.cipher = encryption.encryption_for_version( proto_version) self.other_side.cipher = self.cipher elif packet['msgtype'] == 0xfd: self.rsa_key = encryption.decode_public_key( packet['public_key']) self.encoded_rsa_key = packet['public_key'] packet['public_key'] = encryption.encode_public_key( self.other_side.rsa_key) if 'challenge_token' in packet: self.challenge_token = packet['challenge_token'] self.other_side.challenge_token = self.challenge_token self.other_side.server_id = packet['server_id'] if check_auth: packet['server_id'] = encryption.generate_server_id() else: packet['server_id'] = "-" self.server_id = packet['server_id'] rebuild = True elif packet['msgtype'] == 0xfc and self.side == 'client': self.shared_secret = encryption.decrypt_shared_secret( packet['shared_secret'], self.rsa_key) if (len(self.shared_secret) > 16 and self.cipher == encryption.RC4): logger.error("Unsupported protocol version") self.handle_close() return packet['shared_secret'] = encryption.encrypt_shared_secret( self.other_side.shared_secret, self.other_side.rsa_key) if 'challenge_token' in packet: challenge_token = encryption.decrypt_shared_secret( packet['challenge_token'], self.rsa_key) if challenge_token != self.challenge_token: self.kick("Invalid client reply") return packet[ 'challenge_token'] = encryption.encrypt_shared_secret( self.other_side.challenge_token, self.other_side.rsa_key) if auth: logger.info("Authenticating on server") auth.join_server(self.server_id, self.other_side.shared_secret, self.other_side.rsa_key) if check_auth: logger.info("Checking authenticity") if not Authenticator.check_player( self.username, self.other_side.server_id, self.shared_secret, self.rsa_key): self.kick("Unable to verify username") return rebuild = True elif packet['msgtype'] == 0xfc and self.side == 'server': logger.debug("Starting encryption") self.start_cipher() forward = True if self.plugin_mgr: forwarding = self.plugin_mgr.filter(packet, self.side) if forwarding and packet.modified: rebuild = True if rebuild: packet['raw_bytes'] = self.msg_spec[ packet['msgtype']].emit(packet) if forwarding and self.other_side is not None: self.other_side.send(packet['raw_bytes']) if packet['msgtype'] == 0xfc and self.side == 'server': self.other_side.start_cipher() # Since we know we're at a message boundary, we can inject # any messages in the queue. msgbytes = self.plugin_mgr.next_injected_msg_from(self.side) while self.other_side and msgbytes is not None: self.other_side.send(msgbytes) msgbytes = self.plugin_mgr.next_injected_msg_from( self.side) # Attempt to parse the next packet. packet = parse_packet(self.stream, self.msg_spec, self.side) except PartialPacketException: pass # Not all data for the current packet is available. except Exception: logger.error( "MinecraftProxy for %s caught exception, out of sync" % self.side) logger.error(traceback.format_exc()) logger.debug("Current stream buffer: %s" % repr(self.stream.buf)) self.out_of_sync = True self.stream.reset()
def handle_read(self): """Read all available bytes, and process as many packets as possible. """ t = time() if self.last_report + 5 < t and self.stream.tot_bytes > 0: self.last_report = t logger.debug("%s: total/wasted bytes is %d/%d (%f wasted)" % ( self.side, self.stream.tot_bytes, self.stream.wasted_bytes, 100 * float(self.stream.wasted_bytes) / self.stream.tot_bytes)) self.stream.append(self.recv(4092)) if self.out_of_sync: data = self.stream.read(len(self.stream)) self.stream.packet_finished() if self.other_side: self.other_side.send(data) return try: packet = parse_packet(self.stream, self.msg_spec, self.side) while packet != None: rebuild = False if packet['msgtype'] == 0x02 and self.side == 'client': # Determine which protocol message definitions to use. proto_version = packet['proto_version'] logger.info('Client requests protocol version %d' % proto_version) if not proto_version in messages.protocol: logger.error("Unsupported protocol version %d" % proto_version) self.handle_close() return self.msg_spec, self.other_side.msg_spec = messages.protocol[proto_version] self.cipher = encryption.encryption_for_version(proto_version) self.other_side.cipher = self.cipher elif packet['msgtype'] == 0xfd: self.rsa_key = encryption.decode_public_key( packet['public_key'] ) self.encoded_rsa_key = packet['public_key'] packet['public_key'] = encryption.encode_public_key( self.other_side.rsa_key ) if 'check_bytes' in packet: self.check_bytes = packet['check_bytes'] self.other_side.server_id = packet['server_id'] packet['server_id'] = "-" rebuild = True elif packet['msgtype'] == 0xfc and self.side == 'client': self.shared_secret = encryption.decrypt_shared_secret( packet['shared_secret'], self.rsa_key ) if (len(self.shared_secret) > 16 and self.cipher == encryption.RC4): logger.error("Unsupported protocol version") self.handle_close() return packet['shared_secret'] = encryption.encrypt_shared_secret( self.other_side.shared_secret, self.other_side.rsa_key ) if 'check_bytes' in packet: packet['check_bytes'] = encryption.encrypt_shared_secret( self.other_side.check_bytes, self.other_side.rsa_key ) if auth: logger.info("Authenticating on server") auth.join_server(self.server_id, self.other_side.shared_secret, self.other_side.rsa_key) rebuild = True elif packet['msgtype'] == 0xfc and self.side == 'server': logger.debug("Starting encryption") self.start_cipher() forward = True if self.plugin_mgr: forwarding = self.plugin_mgr.filter(packet, self.side) if forwarding and packet.modified: rebuild = True if rebuild: packet['raw_bytes'] = self.msg_spec[packet['msgtype']].emit(packet) if forwarding and self.other_side: self.other_side.send(packet['raw_bytes']) if packet['msgtype'] == 0xfc and self.side == 'server': self.other_side.start_cipher() # Since we know we're at a message boundary, we can inject # any messages in the queue. msgbytes = self.plugin_mgr.next_injected_msg_from(self.side) while self.other_side and msgbytes is not None: self.other_side.send(msgbytes) msgbytes = self.plugin_mgr.next_injected_msg_from(self.side) # Attempt to parse the next packet. packet = parse_packet(self.stream,self.msg_spec, self.side) except PartialPacketException: pass # Not all data for the current packet is available. except Exception: logger.error("MinecraftProxy for %s caught exception, out of sync" % self.side) logger.error(traceback.format_exc()) logger.debug("Current stream buffer: %s" % repr(self.stream.buf)) self.out_of_sync = True self.stream.reset()