TripleDES TransformFinalBlock偶尔会提供“错误数据”。 '错误

时间:2016-12-19 19:48:33

标签: c# android ios asp.net-web-api2 tripledes

我有以下代码:

public static string PerformEncryption(string text, string uniqueKey, bool encrypt = false)
{
   byte[] textBytes = encrypt ? Encoding.UTF8.GetBytes(text) :  Convert.FromBase64String(text);
   byte[] resultArray;
   var staticKey = Convert.FromBase64String(ConfigReader.SecretKey);
   using (TripleDESCryptoServiceProvider tDes = new TripleDESCryptoServiceProvider())
   {
       tDes.Mode = CipherMode.ECB;
       tDes.Padding = PaddingMode.PKCS7;
       tDes.Key = GenerateTripleDesKey(uniqueKey, staticKey);     
       CTransform = encrypt ? tDes.CreateEncryptor() : tDes.CreateDecryptor();
       resultArray = CTransform.TransformFinalBlock(textBytes, 0, textBytes.Length);
       tDes.Clear();
   }
   if (encrypt)
       return Convert.ToBase64String(resultArray, 0, resultArray.Length);

   return Encoding.UTF8.GetString(resultArray); 
}



private static byte[] GenerateTripleDesKey(string uniqueKey, byte[] staticKey)
{
   byte[] keyArray;
   using (SHA512CryptoServiceProvider hash = new SHA512CryptoServiceProvider())
      keyArray = hash.ComputeHash(Encoding.UTF8.GetBytes(string.Format("{0}{1}", uniqueKey, staticKey)));

   byte[] trimmedBytes = new byte[24];
   Buffer.BlockCopy(keyArray, 0, trimmedBytes, 0, 24);
   return trimmedBytes;
}

PerformEncryption用作辅助方法来执行字符串的加密/解密。还为这两种操作提供了密钥。

它用于Android和Android中的移动应用所使用的Web API应用程序。 iOS设备。

Android上的大部分用户都发生了错误数据错误,iOS上出现此错误的情况要小得多。我在类似移动设备上进行的任何测试都不会产生问题。

我只能重现错误的方法是在加密后修改单元测试中的字符串值。

Web API使用Async / Await,所以我不确定这是否与它有关?

上面的代码中我遗漏了什么,我遗漏了或者是不好的做法?

我无权访问发送到服务器的原始请求,因此我无法确定加密值是否在请求中附加了来自Android / iOS的狡猾字符的内容?

我的其他想法是:
如果这会导致iOS和Android环境出现问题,我应该从使用UTF8 getbytes()切换到ASCII等效帮助程序类

我是否应该完全像AES一样使用diff算法。

1 个答案:

答案 0 :(得分:0)

  1. 3DES不应该用于新代码,而是使用AES。

  2. 不要使用ECB模式,这是不安全的,请参阅ECB mode,向下滚动到企鹅。而是使用带有随机IV的CBC模式,只需将加密数据加上IV用于解密。

  3. PBKDF2比简单哈希甚至盐渍哈希更安全。主要区别在于迭代以便花费更多时间来计算密钥,PBKDF2常见100,000次迭代。

  4. UTF-8比ASCII更受欢迎。