2012-09-06 61 views
1

我正在實施基於Web的文件存儲服務(C#)。當存儲在服務器上時,這些文件將被加密,但挑戰在於如何實現解密功能。隨機訪問加密文件

文件大小可以從幾KB到幾GB不等。數據傳輸是以塊的形式完成的,以便用戶從說50000,75000等數據下載數據。這對未加密的文件工作正常,但如果使用加密,則必須在從偏移量讀取每個塊之前解密整個文件。

所以,我在看如何解決這個問題。迄今爲止,我的研究表明可以使用ECB和CBC。 ECB是最基本的(也是最不安全的),每個模塊都是單獨加密的。歐洲央行的工作方式幾乎與我所尋找的一樣,但安全問題是一個問題。 CBC是相似的,但是在解密當前塊之前需要解密先前的塊。只要文件是從頭到尾讀取的,並且在解密服務器時保留數據,但在一天結束時它並不比在傳輸之前解密整個文件服務器端好得多。

有沒有人知道我應該考慮的其他選擇?在這一點上我沒有任何代碼,因爲我仍然只做理論研究。

+0

您是否只需要隨機讀取訪問和順序寫入訪問(即文件一次寫入)? – CodesInChaos

+0

你需要完整性檢查嗎?我強烈推薦使用MAC。當沒有認證時,你可以做很多事情。 「 – CodesInChaos

+0

」CBC是相似的,但在解密當前塊之前需要解密先前的塊。「錯誤。擁有前一個塊的密文就足夠了。你不需要明文。在維基百科上查看CBC。他們有一些不錯的圖表。 – CodesInChaos

回答

1

請勿使用ECB(Electronic Code Book)。明文中的任何模式都將在密文中顯示爲模式。 CBC(密碼塊鏈接)具有隨機讀取訪問權限(調用代碼知道密鑰,IV是前一個塊的結果),但是寫入塊需要重寫所有後續塊。

更好的模式是Counter (CTR)。實際上,每個塊使用相同的密鑰,並且每個塊的IV是該塊從定義的開始和初始IV的偏移的總和。例如,塊n的IV是IV + n。 CTR模式在NIST SP800-38a的第15頁中詳細描述。關鍵和IV推導的指導可在NIST SP800-108中找到。

還有一些其他類似的模式,如(Galois Counter Mode) GCM

+0

我可能會將文件分成幾個千字節的塊,並使用隱式IV對GCM進行加密。 – CodesInChaos

+0

@akton:是的,我知道歐洲央行的弱點,肯定會檢查你的其他建議,並回復你! – Andreas

+0

@CodesInChaos:從你寫的東西我收集你建議我手動將文件分成塊,並用隱式IV加密每一個。這工作,但是很痛苦緩慢。我也相信我可以使用任何「固定大小」的加密算法來實現這一點。我希望GCM塊密碼加密可以讓我一次加密整個文件,並且知道每個加密塊的大小,然後就可以計算偏移量,讀取塊並單獨解密。到目前爲止,我還沒有找到這種方法的任何代碼示例。 – Andreas