2012-08-12 28 views
0

我正在通過網絡接收數據包。但是其中一些數據包有動態長度,所以第二個字節有一個2字節長的包含長度的WORD。所以我先收到包號,然後根據長度收到全部。在沒有加密的情況下,一切都還好。如果我使用twofish或blowfish加密,它會是相同的嗎?我的意思是'A'被加密爲'B',但'AA'會被加密爲'BB'?我可以提取一個字節並將它從TF/BF加密的數據包中解密出來嗎?河豚和twofish是逐字節加密的嗎?

+0

猜他們爲什麼被稱爲「分組密碼」 – PlasmaHH 2012-08-12 19:49:35

回答

1

我的意思是'A'被加密爲'B',但'AA'會被加密爲'BB'嗎?

明智的加密算法永遠不會這樣做,否則加密的信息可能很容易被頻率分析破壞。 (順便說一下,這被稱爲substitution cipher)。這當然是對於blowfishtwofish

即使您想提取中間的一個字節,也必須先解密整個數據包。


*:除非使用弱ECB mode,這不僅降低了在64位/ 128位的塊兩個加密算法進替換密碼)。

+0

Downvoter,關心評論? – kennytm 2012-08-12 19:23:18

1

通常,答案是填充加密的數據。但是,不要只是加上0來填充,直到達到塊的長度。填充可能會泄漏太多信息。

至於提取一個字節,取決於所使用的密碼模式 - 密碼之間如何改變塊 - 你不應該能夠做到這一點。您需要解密所有想要閱讀的字節字節。一般的做法是加密是「透明的」 - 也就是說,你進行網絡編程,然後將SSL放在它上面,以便SSL處理加密所有內容,處理可變長度等,並且你只需要處理普通的舊數據。

至於在你的設計中拋出SSL是否是一個好主意,我不知道,但你可以使用這個概念。

1

Twofish在其基本級編碼16字節塊。因此,您可以擁有的最小一塊Twofish加密數據長度爲16個字節。如果你的數據包含了這個長度,那麼你可以解密它,然後在最後一個塊中丟掉任何額外的字節。所以要加密'A',你需要將它填充(以某種方式 - 有各種方式 - 所有的零顯然不是最好的方式)到16個字節,然後加密你的一個字節的數據和15個不需要的字節。你得到一個16字節的加密塊。解密時,您可以丟棄額外的字節。

我建議半小時閱讀這些Wikipedia文章:

http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation

http://en.wikipedia.org/wiki/Padding_%28cryptography%29

他們兩人一直對我很有幫助。