【发布时间】:2023-04-07 20:08:01
【问题描述】:
我是加密/解密的新手。我正在尝试解密一个加密的输入字符串,输出为 44 个字符。
这是我目前所拥有的,但是当它尝试执行“TransformFinalBlock”函数时,我不断收到“错误数据”。
public static String Decrypt(String input)
{
try{
byte[] inputArray = Convert.FromBase64String(input);
TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider();
tripleDES.KeySize = 128;
tripleDES.Key = UTF8Encoding.UTF8.GetBytes("0123456789ABCDEF");
tripleDES.IV = UTF8Encoding.UTF8.GetBytes("ABCDEFGH");
tripleDES.Mode = CipherMode.ECB;
tripleDES.Padding = PaddingMode.PKCS7;
ICryptoTransform transform = tripleDES.CreateDecryptor();
byte[] resultArray = transform.TransformFinalBlock(inputArray, 0, inputArray.Length);
tripleDES.Clear();
return UTF8Encoding.UTF8.GetString(resultArray);
}
catch(Exception except){
Debug.WriteLine(except + "\n\n" + except.StackTrace);
return null;
}
}
【问题讨论】:
-
无效的key、IV和data都会触发这个异常。由于对称解密本身永远不会失败,它只能在加密块内的数据上失败(加密数据当然应该是 N*blocksize)。唯一验证的数据是填充。所以它会失败。首先验证密钥和 IV 是否正确。
-
我得到了 KeySize - 128、Key - "0123456789ABCDEF"、IV - "ABCDEFGH" 和输入字符串。输入字符串是 ABvAsOKcGXqc5uQ4O5Z53isJaH31Pa8+PeddljE4mSU=,据说是 TripleDES 加密和 Base64 编码。我应该解密它并输出解密的字符串。这是我得到的所有信息,我对密码学知之甚少。
-
无效模式也可能触发此异常:)
-
建议:彻底摆脱 try/catch。如果有异常,则让它传播而不是返回
null。很有可能,来电者的来电者会尝试做类似null.Length的事情,并想知道你为什么对他这样做。
标签: c# encryption encoding cryptography