【问题标题】:Decrypt TripleDES "Bad Data"解密 TripleDES “坏数据”
【发布时间】: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


【解决方案1】:

如果您使用 IV,那么您应该使用 CipherMode.CBC。 ECB 不使用任何 IV。

另外,你的数据根本没有填充,它正好包含 32 个字节。要测试解密,通常先尝试不进行填充。通过这种方式,您可以通过查看生成的明文来确定使用了哪种填充。

这里的纯数据太老套了,我就不打印了。

【讨论】:

  • 我将 CipherMode 更改为 CBC 并删除了填充,但它仍然在 TransformFinalBlock 中引发错误。
  • 我尝试了一些在互联网上找到的其他方法,但它们都做同样的事情。我无权访问用于加密它的代码,我不确定我必须对密钥和 IV 使用哪种编码方法。我将如何解决这个问题/您何时使用每个?
  • 没关系,我明白了:)。没有意识到你说要实际将填充设置为无大声笑。顺便说一句,你是对的。纯文本非常老套。感谢您的帮助!
【解决方案2】:

我有一个非常相似的问题,我通过将 PaddingMode 更改为 None

来解决它

我的 CipherModeECB(电子密码本)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    相关资源
    最近更新 更多