1

我有 16 字节的 des 加密数据,我想解密问题是我的例程只解密前 8 个字节,对于第 9 个字节,它抛出异常 Bad Data 我的数据没有填充恰好 16 字节的数据这是我的代码

    public byte[] Decrypt(byte[] data)
    {
        List<byte> resData = new List<byte>();
        try
        {
            DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();


            byte[] bytes = StringToByteArray(_key);
            MemoryStream memoryStream = new MemoryStream(data);
            CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateDecryptor(bytes, new byte[8]), CryptoStreamMode.Read);
            cryptoProvider.Padding = PaddingMode.None;
            cryptoProvider.Mode = CipherMode.ECB;
            BinaryReader reader = new BinaryReader(cryptoStream);
            for (int i = 0; i < data.Length; i++)
            {
                resData.Add(reader.ReadByte());
            }


        }
        catch { }
        return resData.ToArray();
    }
4

1 回答 1

4
  1. 您需要cryptoProvider在创建加密器之前设置属性

  2. 无需跳过所有这些流箍,只需调用TransformFinalBlock

  3. 你的加密非常。DES 的密钥空间非常小,可以通过暴力破解。

您的代码的改进版本可能如下所示:

byte[] bytes = StringToByteArray(_key);

using(DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider())
{
    cryptoProvider.Padding = PaddingMode.None;
    cryptoProvider.Mode = CipherMode.ECB;

    using(var crypter =  cryptoProvider.CreateDecryptor(bytes, new byte[8]))
    {
        return crypter.TransformFinalBlock(bytes, 0, bytes.Length);
    }
}
于 2013-10-28T09:03:38.803 回答