2014-03-05 27 views
1

我正在使用PHP編寫一個應用程序,用戶可以使用幾種可能的算法多次加密他的文本。起初我認爲這很簡單,但後來我想到了發生的問題,當數據填充到塊大小,加密和解密。多重加密/解密造成的數據混亂

起初我以爲我可以刪除每個解密過程後的空字節以獲得填充前的原始數據。現在如果數據本身有幾個空字節,那麼在解密過程之後刪除空字節將刪除部分原始數據,並最終丟失數據,也可能是錯誤的解密(最後一點取決於塊大小以下解密算法)。雖然幾次加密過程之後的數據或數據包含幾個空字節的可能性幾乎爲零,但我正在尋找解決上述問題的解決方案。

如果我不想從數據中去掉空字節,我也會根據所使用算法的塊大小而得到一些惱人的結果。爲了說明我編寫了一個python程序,它有三種加密算法,一種是2字節的塊大小,另一種是塊大小爲3,最後一種塊大小爲4,所以你可以將它們與128-, 192位和256位算法。我開始使用一些隨機字節並對它們進行多次加密,然後在每次解密過程之後解密它們而不刪除空字節。該PROGRAMM印刷字節十六進制格式每一個加密/解密處理後,這裏是從我這裏得到一些意見的輸出:

48 61 6c 6c 6f      //thats our data at the start 
da b4 28 fe 9e 4a     //now the 3-byte algorithm was run -> padded to 6 bytes 
5e 62 04 72 1a d8 d2 a4    //used the 4-byte algorithm -> padded to 8 bytes 
cc a1 43 e0 f5 e7 40 eb 81   //3-byte algorithm used again -> padded to 9 bytes 
48 61 7a 07 71 1e 3f 0f 05 8d 98 a4 //at last used the 4-byte algorithm -> padded to 12 bytes 
cc a1 43 e0 f5 e7 40 eb 81 00 00 00 //first encryption done, notice the three null-bytes and the similarity to line 4 
5e 62 04 72 1a d8 d2 a4 00 92 0f 2a //secound encryption done, not removed null-bytes "decrypted", but the rest goes well, as seen in line 3 
da b4 28 fe 9e 4a 00 00 84 1a 8d 03 //third encryption done, same as above, decryption of null-bytes results in chaos, but original data still the same 
48 61 6c 6c 6f 00 92 0f ae 88 98 be //last encryption, we got original data with some near random bytes 

你可以看到第一個解密過程順利,謝勝利,一個太,除了得到「解密」的3個填充字節。所以,在每個加密過程之後,我們接近我們的原始數據,但我們繼續解密這些填充字節。 (注意:如果有人懷疑我的加密/解密函數,我測試了他們幾次,他們每次都工作,如果需要或懷疑我也可以發佈源代碼)

把所有這些都歸結爲一個簡單的問題,當我解密數據時,我怎麼知道哪些空字節是原始數據的一部分,哪些是由加密算法添加的? 你有什麼想法我可以做到這一點?

+0

塊大小爲2個字節的密碼聽起來非常脆弱。我猜這不是「生產」代碼? – ntoskrnl

+0

我剛剛用它來描述我的問題,結果將與塊大小爲16,24或32字節的結果相同,但是我的示例輸出將會更大 – Sirac

+1

在這種情況下,請參閱[這個問題](http://security.stackexchange。com/questions/18087/is-multiple-encryption-a-good-idea)和[本博文](http://blog.cryptographyengineering.com/2012/02/multiple-encryption.html)。 – ntoskrnl

回答

1

您可以使用填充模式(例如PKCS#7)來填充填充字節本身,而不是填充數據。這允許在解密時確定填充字節的數量,以便可以移除它們而僅留下原始明文。

本質上,填充字節全部=填充字節的數量。例如。如果需要3個填充字節,那麼填充將是3個字節的0x03

總是填充至少一個字節,這意味着,如果明文已經是塊大小的倍數,則必須加入只由填充的附加塊。這確保了可以區分是塊大小的確切倍數的明文和已經已經結束的n字節的n以及已經用n字節填充的明文。

+0

謝謝,這個問題給了我一個不眠之夜,不知何故,我想不出一個容易解決的問題 – Sirac