2016-09-06 489 views
1

AES256-GCM可以在旅途中被實現爲https://gist.github.com/cannium/c167a19030f2a3c6adbb5a5174bea3ff如何在golang中使用AES256-GCM加密文件?

然而,接口cipher.AEADSeal方法有簽名:

Seal(dst, nonce, plaintext, additionalData []byte) []byte 

因此對於非常大的文件,必須讀取所有文件內容到內存中,這是不能接受的。

一種可能的方式是落實科學SealOpenReader/Writer接口,但不應該由那些分組密碼來解決AEAD的「模式」?所以我想知道這是否是golang密碼庫的設計錯誤,或者我錯過了GCM的一些重要內容?

回答

1

AEADs不應該用於一次加密大量數據。該API旨在阻止這一點。

在單個操作中加密大量數據意味着:a)所有數據都必須保存在內存中,或者b)API必須以流方式運行,方法是返回未經驗證的明文。

返回未經身份驗證的數據是危險的,它是not hard找到因特網上的人建議諸如gpg -d your_archive.tgz.gpg | tar xz之類的事情,因爲gpg命令還提供了流式接口。

對於像AES-GCM這樣的結構,當然,如果應用程序不處理 驗證它, 可以隨意操作明文。即使應用程序謹慎 不建議將純文本「發佈」爲用戶界面,直到建立真實性 ,流式設計將暴露更多程序攻擊面。

通過標準化大密文和流API,下一個 協議更有可能使用它們而不會意識到問題並因此問題依然存在。

優選地,明文輸入將被分成合理大的部分(比如16KiB)並分開加密。塊只需要足夠大,以致額外的驗證器的開銷可以忽略不計,即 。通過這樣的設計,可以逐步處理大量消息,而不必處理未經驗證的明文,並且可以更安全地使用AEAD API。 (且不說更大的消息可以 因爲AES-GCM加工爲一體,具有64GiB限制爲單個 明文。)

需要一些想法,以確保組塊處於正確 順序,即通過計數nonces,第一個塊應該是第一個,即通過在零處開始亂碼,並且最後一個塊應該是 最後,即通過附加具有特殊 附加數據的空白終止塊。但這並不難。例如,請參閱miniLock中使用的組塊。

即使有這樣的設計,攻擊者仍然可以導致消息被可檢測地截斷。如果你想瞄準更高的目標,可以使用全有或全無轉換,儘管這需要兩個輸入的 通過,並不總是可行的。

+0

謝謝!作爲一個建議,我認爲這個解釋可以添加到golang文檔中。 –

0

這不是設計上的錯誤。這只是API在這方面不完整。

GCM是一種流式操作模式,因此可以在不停止流的情況下按需處理加密和解密操作。看起來你不能在以前的MAC狀態下重複使用相同的AEAD實例,所以你不能直接使用這個API進行GCM加密。

您可以在crypto.NewCTR和您自己的GHASH實現上實現自己的GCM。