2014-10-07 60 views
0

我有一个河豚类,我发现我相信在星球源代码。我正在加密正在发送到我的服务器的字符串。然后尝试解密数据中的字符串,我不断收到错误。我不确定发生了什么事或者我做错了什么。它可以在文本框中很好地进行加密和解密,但由于某些原因,它不适用于winsock。也许有人可以帮我弄清楚这一点。如何将Blowfish加密添加到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 & “聊天”,strUserEncrypted)

回答

2

你的服务器代码不关注它正在接收数据的结构。并非所有数据都已加密。加密数据前面有Chr(&H1) & "ENTER",后面跟着"CHAT"。服务器当前正在读取在该时刻恰好在套接字缓冲区中可用的原始数据,然后按原样解密整个事物。它需要直到它已经收到Chr(&H1) & "ENTER",然后阅读,直到它收到"CHAT",然后最终它只能解密它们之间的数据。

+0

它应该接收第一个数据包中的所有数据,因为这是发送的第一个数据包,它完全在一个数据包中?你是说即使这么小的数据包到达不同的数据包吗? – FrostByte 2014-10-07 23:55:04

+0

没关系我明白你在说什么我试图把整个数据包解析为一个加密数据包,只有一部分被加密。这就是我错误的地方,我希望所有的都被加密。我甚至没有注意到我在那里做了什么。感谢您指出了这一点。我将其余所有内容添加到加密中,并首先尝试。 – FrostByte 2014-10-07 23:58:46

+0

正如我所说的,“服务器当前正在读取恰好在那个时刻发生在套接字缓冲区**中的任何原始数据**”。所以是的,客户的信息可能会被分成多次读取。你必须说明这一点。 – 2014-10-08 00:52:31