擅长:python、mysql、java
<p>我快速扫描了一下密码。所有消息都是在加密后发送的,因此您发送的总数据是16的倍数,加上命令的1。到目前为止,还不错。在</p>
<p>在解密方面,去掉命令,这将再次给您留下一条16的倍数的消息。但是,在调用<code>decrypt_my_message</code>之前,您正在调用<code>msg.strip()</code>。对<code>strip</code>的调用有可能通过删除开头或结尾的字节而破坏加密数据。在</p>
<p>我将进一步检查代码,如果发现其他问题,则编辑此答案。在</p>
<hr/>
<p>编辑:</p>
<p>您使用空格字符作为填充,我想您是想使用<code>strip</code>调用删除填充。您应该将<code>decrypt_my_message(msg.strip())</code>更改为<code>decrypt_my_message(msg).strip()</code>。在</p>
<hr/>
<p>您使用的是TCP来发送数据,因此从长远来看,您的协议肯定会给您带来麻烦。我总是用这种自定义协议发送消息中有效负载的长度,这样接收端就可以确定它是否正确地接收到消息块。例如,可以使用:<code>CMD|LEN(2)|PAYLOAD(LEN)</code>作为数据帧。这意味着,一个字节用于命令,另外两个字节告诉服务器需要多少字节,以及实际消息的<code>LEN</code>字节。这样,您的<code>recv</code>调用可以循环,直到它读取正确的数量。更重要的是,当它们被连续发送时,它不会试图读取下一个数据包。在</p>
<p>或者,如果你的数据包足够小,你可以使用UDP。它打开了另一个蠕虫病毒,但是您知道<code>recv</code>只接收一个UDP包。在</p>