2011-02-02 73 views
1

我有一个很奇怪的情况。 基本上我有使用由创建的解密的代码:解密时偶尔坏数据错误

Dim des3 As New TripleDESCryptoServiceProvider 
des3.Mode = CipherMode.CBC 
Return des3.CreateDecryptor(_encKey, _initVec) 

的_encKey和_initVec是硬编码的。 我用它通过调用:

Dim res() As Byte = decrypt(Convert.FromBase64String(_data)) 
m_transformDec.TransformFinalBlock(res, 0, res.Length) 

这里_data是包含加密值的字符串。 m_transformDec是之前创建的Decryptor。

通常这个工作。偶尔,我得到一个“不良数据”错误。我打印出_data的值,并且它始终是相同的。

该代码是多线程的,我怀疑这是两个问题的原因,它很难重现。解密程序是在类的创建过程中创建的,并且解密是在Shared函数中完成的,但是我没有看到任何不是线程安全的。

任何想法?

回答

1
  1. 你不应该承担任何并发呼叫安全的,除非你有理由相信它。在文档中,您有模板文本,实例成员不能保证线程安全,因此在使用时应该防御性地锁定des3对象。
  2. 你不应该对初始化向量进行硬编码;它应该在加密数据时被随机选择,然后以加密的数据以某种方式存储(许多人选择将其加到数据的开头,然后将其删除并用于解密;不过,使用任何您喜欢的存储方案) 。使用相同的IV会破坏IV的目的,这使得明文攻击更加困难。