2017-07-29 155 views
0

我需要在下載它時解密AES加密文件。可以保存AES解密過程並在以後恢復嗎?

這意味着,每次我收到256字節的數據,我都可以馬上解密。

問題是,用戶可能會暫停下載過程,並在稍後恢復。 然後,需要創建一個新的CCCryptorRef實例來繼續解密。但解密的數據是錯誤的。

是否有任何方法可以完美地保存CCCryptorRef實例,以便以後使用它?

順便說一句,我使用iOS框架API。 我正在使用CCCryptorCreateWithMode(),CCCryptorUpdate(),CCCryptorFinal()正常的AES過程。

+1

您確實應該使用TLS/HTTPS來代替。 –

回答

2

如果您知道使用密碼的操作模式,通常您可以創建新的密碼上下文(或任何名稱,例如Cryptor)。

例如,對於CBC模式,您可以存儲剛剛加密的密文的最後一個密碼塊(16個字節)。然後,您可以將其用作下一個密碼環境的IV。在另一方面,如果你想使用CTR模式,那麼你需要存儲的最後的計數器值,並開始與計數器+ 1

你永遠不要需要存儲/恢復密碼上下文的方式解密;這就是爲什麼這個功能在API中不存在的原因。您可以在需要的狀態下創建一個新的。


有關操作模式的更多信息here


如果您使用CBC:請注意,您在密文碎片末尾的無壓縮情況下會遇到麻煩。你只想在解密最後一個片段時執行unpadding,而當你這樣做時,你應該知道填充oracle的攻擊。


如果可用,使用TLS保護傳輸中的文件內容應該是首選。

+0

這正是我想要的,謝謝!我正在使用AES(CBC)來加密/解密文件。由於這些文件的大小通常從100kb到500mb不等,您認爲合理的塊大小是多少? – SomeHowWhite

+1

AES **的塊大小**固定爲16個字節(128位)。數據量的大小,下載在時間的選擇是你的,但它需要當然16的倍數(你可以把它稱爲「文件片段的大小」,從AES塊大小區分開來) 。不要忘記在IV前綴,CBC *做*需要隨機IV。有了CBC,你應該加倍小心不要實施填充oracle。 –

相關問題