1

我的一个库中有一个带有静态方法的静态加密/解密类。代码有点大,所以我把它贴在这里: http: //pastebin.com/zRZtNmjU

直到它开始在调用中执行的某些代码的执行堆栈中使用之前,我对这段代码没有任何问题Parallel.ForEach()。我尝试在一些 MemoryStream 和 CryptoStream 变量上添加一些使用,lock但这似乎没有帮助。我这样做是因为我相当肯定这个问题是由从多个线程访问这个静态类和方法引起的。

我不断得到的例外是:“填充无效,无法删除。”

当执行到达decryptedTextStream.FlushFinalBlock();名为 Decrypt 的代码中的最后一个方法(第 250 行)时,会发生此异常。

我的问题是 - 我无法弄清楚代码有什么问题,我想知道唯一的问题是类和方法是静态的吗?几个月来,我一直在使用此代码而没有出现任何问题,并且最近才开始在其他一些 TPL 代码中使用它时遇到问题。我应该将这个类重构为基于实例的,还是不能解决我遇到的异常?

4

1 回答 1

2

您的代码根本不是线程安全的......会发生什么?目前,您有一个 iCryptoTransform 被创建一次(静态构造函数),因此每个加密/解密调用都将使用该对象......

有两个问题:

  1. 如果 2 个或更多线程尝试并行加密/解密怎么办?您的系统有一个在所有调用中共享的内部状态,这是不好的,因为在具有 IV 的操作模式下,每个加密块都依赖于之前的块......这对安全性有好处......但如果块被加密则非常糟糕before 不属于当前的块流,因为另一个胎面管道同时通过同一实例...

  2. 你不在乎你的 iCryptoTransform 是否可重用......在你的情况下,它是,但通常,你需要检查 CanReuseTransform 成员或为每个操作创建一个新成员

建议:

让您的 ICryptoTransform 存在于 Encrypt()/Decrypt() 方法中...不要使用静态变量...

于 2013-04-01T08:21:43.010 回答