使用asp.net核心中的TripleDesImplementation,指定的初始化向量(IV)与该算法的块大小不匹配

时间:2018-10-05 15:05:46

标签: .net core cryptographicexception

我们正在使用具有TripleDesImplementation算法加密的Asp.Net内核。

解密代码如下:

public static string Encrypt(string p_szStrValue)
{
    string vszEncryptedString = string.Empty;
    if (!p_szStrValue.Trim().Equals(string.Empty))
    {
        TripleDESCryptoServiceProvider cryptoProvider = new TripleDESCryptoServiceProvider();
        MemoryStream ms = new MemoryStream();
        CryptoStream cs = new CryptoStream(ms, cryptoProvider.CreateEncryptor(KEY_192, IV_192), CryptoStreamMode.Write);
        StreamWriter sw = new StreamWriter(cs);
        sw.Write(p_szStrValue);
        sw.Flush();
        cs.FlushFinalBlock();
        ms.Flush();
        vszEncryptedString = Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);
    }
    return vszEncryptedString;
}

public static string Decrypt(string p_szStrValue)
{
    string vszDecryptedString = string.Empty;
    if (!p_szStrValue.Trim().Equals(string.Empty))
    {
        try
        {
            TripleDESCryptoServiceProvider cryptoProvider = new TripleDESCryptoServiceProvider();
            byte[] v_Buffer = Convert.FromBase64String(p_szStrValue);
            MemoryStream ms = new MemoryStream(v_Buffer);
            CryptoStream cs = new CryptoStream(ms, cryptoProvider.CreateDecryptor(KEY_192, IV_192), CryptoStreamMode.Read);
            StreamReader sr = new StreamReader(cs);
            vszDecryptedString = sr.ReadToEnd();
        }
        catch (Exception e)
        {
            return e.Message;
        }
    }
    return vszDecryptedString;
}

但是在解密时,它会引发如下错误:

  

指定的初始化向量(IV)与该算法的块大小不匹配。
  参数名称:rgbIV

它在正常的Asp.Net网站上正常工作,但是现在抛出错误。

1 个答案:

答案 0 :(得分:0)

可能为时已晚,.Net Core不会像.Net Framework那样自动对初始化向量进行截断。这就是您年龄越来越大的原因。您可以使用IV中的前8个字节进行解密,它应该可以正常工作并正确解密现有的加密信息。

  

要点是初始化向量   TripleDESCryptoServiceProvider(IV属性或rbgIV   CreateEncryptor和CreateDecryptor方法上的参数)接受一个   字节数组。在.NET Core中,IV的字节数组必须等于a   算法的有效块大小。对于3DES,它是64位(8字节)。

     

在.NET Framework中,它只会默默使用前8个字节,即使   如果您给它9或20。

     

从.NET Framework迁移到.NET Core时,   错误地传入8个以上的字节开始获取异常。   解决方法是在迁移到   仅传入前8个字节。

有关GitHub问题https://github.com/dotnet/docs/issues/8184

的更多信息