2012-03-26 218 views
1

我正在寫一個加密和解密文件的應用程序。我正在使用CipherInputStream和CipherOutputStream進行使用AES256位密碼的加密/解密過程。AES256加密/解密速度

我的問題是,如果我採取字節數組並寫入文件進行加密,它比使用解密創建字節數組的文件花費的時間少了2倍。這很奇怪,因爲據我所知AES加密和解密是對稱的過程,他們應該花費相同的時間來完成。

任何想法?

+1

瞭解如何分析您的代碼。正如你所說,AES加密和解密速度是相同的,所以差別必須在其他地方。 – 2012-03-26 11:40:26

+0

所以這裏有更多的細節。如果我將文件讀入字節數組,然後在內存中解密或加密它需要相同的時間。但是使用CipherInputStream/CipherOutputStream會使處理時間顯着不同。 – 2012-03-26 13:00:41

回答

5

在Stackoverflow上有很多貼子抱怨Android上的I/O操作很慢。通常這個問題對於執行第二次寫入操作來說是不好的塊大小。

智能手機中使用的閃存以幾千字節的大塊組織,因此爲了獲得最佳寫入速度,您應該只寫入4KB或其中的多個塊。

像AES這樣的密碼在8字節的塊上工作,這可能導致大量的性能消耗。

我建議通過緩衝區大小爲4或16 KB的BufferedOutputStream發送CipherOutputStream的輸出。這應該會顯着加快這一進程。

此外,您必須考慮寫入閃存始終比讀取速度慢。

+0

是的,這是奇怪的事情。因爲我的加密寫入過程比讀取解密過程快得多。 – 2012-03-26 15:24:36

+2

這可能是因爲CipherInputStream使用內部緩衝,並且當您使用FileOutputStream直接寫入字節時,字節是* not * buffered。從文件讀取或寫入文件時,始終建議創建緩衝區。這假設您在解密後再次將文件寫入磁盤。 – 2012-03-26 15:36:36

2

不確定你的代碼是什麼樣的。

我修復了一個類似的慢解密問題。我的原始代碼引用了最流行的Android加密/解密示例。它使用CipherOutputStream進行加密,並使用CipherInputStream進行解密。我發現解密大約比加密慢4倍。最終我發現問題是CipherInputStream。它比CipherOutputStream慢得多。解決方法是將CipherOutputStream用於加密和解密,並將密碼從加密轉換爲解密。之後,解密速度與加密一樣快。

如果你不想輸出解密到一個文件,他們可能是其他方式來實現。也許根本不使用密碼流。只需解密緩衝區。我還沒有嘗試過。

+0

你能分享你的代碼嗎? – 2016-10-25 07:51:28