2014-10-07 53 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