“消息必须是16的倍数”加密音频通过网络与Python

2024-03-29 14:51:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Python通过网络发送加密音频。这个应用程序暂时工作,然后中断说它必须是16的倍数。在

不知道我做错了什么。或者在代码中查找以解决这个问题。在

如果您能提供任何帮助,我将不胜感激

如果有人有兴趣看一看我做的谷歌代码项目,我相信我现在已经开始工作了

http://code.google.com/p/mii-chat/


Tags: 项目代码网络com应用程序httpgooglechat
2条回答

我快速扫描了一下密码。所有消息都是在加密后发送的,因此您发送的总数据是16的倍数,加上命令的1。到目前为止,还不错。在

在解密方面,去掉命令,这将再次给您留下一条16的倍数的消息。但是,在调用decrypt_my_message之前,您正在调用msg.strip()。对strip的调用有可能通过删除开头或结尾的字节而破坏加密数据。在

我将进一步检查代码,如果发现其他问题,则编辑此答案。在


编辑:

您使用空格字符作为填充,我想您是想使用strip调用删除填充。您应该将decrypt_my_message(msg.strip())更改为decrypt_my_message(msg).strip()。在


您使用的是TCP来发送数据,因此从长远来看,您的协议肯定会给您带来麻烦。我总是用这种自定义协议发送消息中有效负载的长度,这样接收端就可以确定它是否正确地接收到消息块。例如,可以使用:CMD|LEN(2)|PAYLOAD(LEN)作为数据帧。这意味着,一个字节用于命令,另外两个字节告诉服务器需要多少字节,以及实际消息的LEN字节。这样,您的recv调用可以循环,直到它读取正确的数量。更重要的是,当它们被连续发送时,它不会试图读取下一个数据包。在

或者,如果你的数据包足够小,你可以使用UDP。它打开了另一个蠕虫病毒,但是您知道recv只接收一个UDP包。在

msg = conn.recv(2024)
if msg:                
    cmd, msg = ord(msg[0]),msg[1:]
    if cmd == CMD_MSG:
        listb1.insert(END, decrypt_my_message(msg.strip()) + "\n")

上面的代码片段读取2024字节的数据(不是16的倍数),然后(如果“if”语句为真)调用decrypt_my_message信息条()作为论据。然后decrypt_my_消息会抱怨给它的字符串长度不是16的倍数。)我猜这就是问题所在。在回溯中查看是否这是导致异常的行)。在

您需要使用长度为n*16的字符串来调用decrypt_my_message。在

您可能需要重新考虑读取流的逻辑,或者在中间设置一些缓冲区,以将muy_消息解密为n*16的块。在

相关问题 更多 >