我们正在使用具有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网站上正常工作,但是现在抛出错误。
答案 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个字节。