2011-12-13 62 views

回答

1

我從來沒有聽說過.NET中的多線程CryptoStream,但是,我認爲這取決於你的加密模式。 如果加密模式是ECB,當然,您可以使用Parallel.For或ForEach手動輕鬆地對其進行多線程處理。使用CBC或任何其他帶反饋的加密模式,除非您使用多個初始化向量,否則不太可能使其平行。 對於ECB模式:

  • 拆分數據在多個字節數組(可以說你加密1280個字節與10個線程,該數據分割到包含0..127字節,字節128..255 10字節數組,每個數組必須包含整數個塊)。
  • 使用Parallel.For或ForEach循環所有10個字節的數組(例如,創建List < byte [] >實例並將其作爲參數提供給Parallel.ForEach)。
  • 使用SymmetricAlgorithm.CreateEncryptor/SymmetricAlgorithm.CreateDeptptor創建10個Rijndael加密器/解密器實例
  • 在單獨的線程上加密每個數據部分。
  • 再次將數據組合爲1000字節的數組。

所以,我的想法是不使用CryptoStream,而是你必須調用加密API並直接操作純文本字節。

+0

這是使用太多的內存。最好有兩個或更多的流,每個流都是文件的一部分。 – Krumelur

+0

@Krumelur是的,你沒有創建字節數組,你可以啓動多個流(例如,從不同文件位置開始以共享模式讀取文件)。對於ECB模式,加密文件的順序無關緊要,這就是ECB模式適用於並行化的原因。因此,創建10個ECB CryptoStream實例並將它們提供給Parallel.ForEach也是解決方案。但是,必須注意並禁用自動填充,否則CryptoStream將填充10個或更多線程中的每個線程,並在文件中寫入額外的塊。填充必須禁用。 – Vitaliy

+0

聽起來很有趣。你有沒有嘗試過,或者它是簡單的理論? (如果你知道它正在工作,我會盡早試用它,如果它是理論的話,我現在不得不推遲它) – Krumelur