我正在通過網絡接收數據包。但是其中一些數據包有動態長度,所以第二個字節有一個2字節長的包含長度的WORD。所以我先收到包號,然後根據長度收到全部。在沒有加密的情況下,一切都還好。如果我使用twofish或blowfish加密,它會是相同的嗎?我的意思是'A'被加密爲'B',但'AA'會被加密爲'BB'?我可以提取一個字節並將它從TF/BF加密的數據包中解密出來嗎?河豚和twofish是逐字節加密的嗎?
回答
我的意思是'A'被加密爲'B',但'AA'會被加密爲'BB'嗎?
明智的加密算法永遠不會這樣做,否則加密的信息可能很容易被頻率分析破壞。 (順便說一下,這被稱爲substitution cipher)。這當然是對於blowfish和twofish。
即使您想提取中間的一個字節,也必須先解密整個數據包。
*:除非使用弱ECB mode,這不僅降低了在64位/ 128位的塊兩個加密算法進替換密碼)。
Downvoter,關心評論? – kennytm 2012-08-12 19:23:18
通常,答案是填充加密的數據。但是,不要只是加上0來填充,直到達到塊的長度。填充可能會泄漏太多信息。
至於提取一個字節,取決於所使用的密碼模式 - 密碼之間如何改變塊 - 你不應該能夠做到這一點。您需要解密所有想要閱讀的字節字節。一般的做法是加密是「透明的」 - 也就是說,你進行網絡編程,然後將SSL放在它上面,以便SSL處理加密所有內容,處理可變長度等,並且你只需要處理普通的舊數據。
至於在你的設計中拋出SSL是否是一個好主意,我不知道,但你可以使用這個概念。
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
他們兩人一直對我很有幫助。
- 1. C#河豚加密/解密
- 2. 河豚加密問題
- 3. Twofish加密
- 4. BouncyCastle的河豚加密問題
- 5. 河豚加密示例代碼
- 6. 紅寶石河豚加密url
- 7. Javascript實現河豚ECB加密
- 8. 用Java解密openssl河豚
- 9. 河豚解密 - NCFB模式
- 10. Silverstripe Twofish密碼加密?
- 11. OpenFire:沒有河豚加密的SHA-1密碼
- 12. C#BouncyCastle的河豚CTR解密
- 13. 允許用戶輸入河豚加密密鑰
- 14. 是AES_256強於河豚
- 15. 文件解密,用vim河豚
- 16. 河豚解密通過javax.crypto中
- 17. 是否有用於Twofish加密/解密的ActionScript庫
- 18. 使用閃光燈下的河豚加密數據
- 19. Twofish密鑰擴展
- 20. Twofish文件解密
- 21. Twofish密碼密鑰生成
- 22. 解密河豚,歐洲央行與加密的NodeJS VS PHP的mcrypt的
- 23. 將河豚加密算法從php轉換爲python
- 24. 河豚和地穴成功的例子?
- 25. 如何在C#中逐步創建河豚算法?
- 26. PHP存儲密碼與河豚和鹽胡椒粉
- 27. Android Twofish文件加密教程?
- 28. AES加密和解密空加字節
- 29. 解密紅寶石河豚加密的字符串,只返回1/2字符串
- 30. 加密和解密的字節數組
猜他們爲什麼被稱爲「分組密碼」 – PlasmaHH 2012-08-12 19:49:35