如何将 Blowfish 加密添加到 Winsock 数据?
Posted
技术标签:
【中文标题】如何将 Blowfish 加密添加到 Winsock 数据?【英文标题】:How can I add Blowfish encryption to Winsock data? 【发布时间】:2014-10-07 22:38:40 【问题描述】:我相信我在行星源代码中找到了一个河豚类。我正在加密一个正在发送到我的服务器的字符串。然后尝试从数据到达中解密字符串,我不断收到错误消息。我不确定发生了什么或我做错了什么。它可以很好地在文本框中进行加密和解密,但由于某种原因,它不能通过 winsock 工作。也许有人可以帮我解决这个问题。
这是我在客户端连接事件中的代码。
Dim crypt As clsBlowFish
Set crypt = New clsBlowFish
Dim strPrivate As String
Dim strUser As String, strUserEncrypted As String
strPrivate = "aDq&s3kUsvVKNm-dRCF2-XJC%5j&%hL5*S5=bu%ZFLsc2D2"
Call crypt.BlowFish(strPrivate)
Call crypt.StringEncrypt(txtUsername.Text, strUserEncrypted)
sOCk.SendData Chr(&H1) & "ENTER" & strUserEncrypted & "CHAT"
在服务器端,我的数据到达中有这个
Dim crypt As clsBlowFish
Set crypt = New clsBlowFish
Dim strPrivate As String
Dim strEncrypted as string, strDecrypted as string
strPrivate = "aDq&s3kUsvVKNm-dRCF2-XJC%5j&%hL5*S5=bu%ZFLsc2D2"
sOCk.GetData strData, vbString
strEncrypted = strData
Call crypt.BlowFish(strPrivate)
Call crypt.StringDecrypt(strEncrypted, strDecrypted)
一旦客户端连接并且服务器获取数据,它就会给我一个错误提示
运行时错误'-2147218101(80040d4b)':
要解密的字符串的大小应能被 8 整除
正在发送的数据似乎工作正常。我在发送之前在消息框中显示了加密文本,它显示好像它已加密,然后我嗅探数据包,因为它正在发送并且它也被加密,所以问题出在服务器端。
我已经使用文本框使用相同的代码来加密和解密,它运行良好,但通过 winsock 发送似乎不起作用。也许我没有正确接收数据?
编辑: 谢谢雷米勒博
我通过像这样加密所有文本来修复它。
调用 crypt.StringEncrypt(Chr(&H1) & "ENTER" & txtUsername.Text & "CHAT", strUserEncrypted)
【问题讨论】:
【参考方案1】:您的服务器代码没有注意它接收到的数据的结构。并非所有数据都经过加密。加密数据前面是Chr(&H1) & "ENTER"
,后面是"CHAT"
。服务器当前正在读取恰好在那个时刻在套接字缓冲区中可用的任何原始数据,然后按原样解密整个事情。它需要读取直到收到Chr(&H1) & "ENTER"
,然后读取直到收到"CHAT"
,最后它只能解密它们之间的数据。
【讨论】:
它应该在第一个数据包中接收所有内容,因为这是发送的第一个数据包并且它完全在一个数据包中?你是说即使是这么小的数据包也是分开的数据包到达的? 没关系我明白你在说什么我试图将整个数据包解析为一个加密数据包,而其中只有一部分是加密的。那就是我出错的地方,我希望所有这些都被加密。我什至没有注意到我在那里做了什么。感谢您指出了这一点。我将所有其余部分添加到加密中,并且第一次尝试成功。 正如我所说,“服务器当前正在读取 在那一刻 恰好在套接字缓冲区中可用的任何原始数据”。所以是的,客户端的消息可能会在多个读取中拆分。你必须考虑到这一点。以上是关于如何将 Blowfish 加密添加到 Winsock 数据?的主要内容,如果未能解决你的问题,请参考以下文章