在解密过程中获得坏数据异常(使用.net加密)

本文关键字:使用 net 加密 异常 数据 过程中 解密 | 更新日期: 2023-09-27 17:50:34

我使用来自类TripleDESCryptoServiceProvider的对称TripleDES加密。Net 2.0)来加密文件的内容。数据被完美地加密,但在解密过程中会抛出CryptographyException: Bad data


我使用键从当前日期时间和IV从。net类随机生成的值。然后我将相同的密钥和IV传递给解密方法,但由于某种原因它失败了。
下面是我的代码:

static void Main(string[] args){
    string fileName = "input.exe";
    string newFileName = fileName + "crypted.exe";
    byte[] iv;
    var fileToEncrypt = File.ReadAllBytes(fileName);
    var encryptionKey = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(DateTime.Now.ToString("ddMMyyHmmss")));
    File.WriteAllBytes(newFileName, EncryptTripleDES(fileToEncrypt, encryptionKey, out iv));
    File.WriteAllBytes(fileName + "decrypted.exe", DecryptTripleDES(File.ReadAllBytes(newFileName), encryptionKey,iv));
}
public static byte[] EncryptTripleDES(byte[] dataToEncrypt, byte[] key, out byte[] iv){
    byte[] result;
    var tdes = new TripleDESCryptoServiceProvider { Key = key, KeySize = 128, Mode = CipherMode.CBC, Padding = PaddingMode.PKCS7 };
    iv = tdes.IV;
    using(ICryptoTransform cTransform = tdes.CreateEncryptor()){
        result = cTransform.TransformFinalBlock(dataToEncrypt, 0, dataToEncrypt.Length);
        tdes.Clear();
    }
    return result;
}
public static byte[] DecryptTripleDES(byte[] dataToDecrypt, byte[] key, byte[] iv){
    byte[] result;
    var tdes = new TripleDESCryptoServiceProvider { Key = key, KeySize = 128, Mode = CipherMode.CBC,IV = iv,Padding = PaddingMode.PKCS7 };
    using (ICryptoTransform cTransform = tdes.CreateDecryptor()){
        result = cTransform.TransformFinalBlock(dataToDecrypt, 0, dataToDecrypt.Length);
        tdes.Clear();
    }
    return result;
}



更新:
1. 我已经检查了传递的IV值是有效的,并且与加密中使用的值相同。
2. 将填充更改为零或无不会引发异常,但随后数据无法正确解密。结果和原来不一样

在解密过程中获得坏数据异常(使用.net加密)

问题在于您使用初始化器构造TripleDESCryptoServiceProvider的方式。在初始化器中首先设置Key,然后设置KeySize,这导致Key被重置为一个新的(随机生成的)密钥,因此,您使用不同的密钥进行加密和解密(这两个密钥都不是您生成的key)。

你可以通过重新排序初始化器来解决这个问题,这样KeySize首先被设置,或者可以将Key的设置完全移到初始化器之外,以避免任何歧义:

public static byte[] EncryptTripleDES(byte[] dataToEncrypt, byte[] key, out byte[] iv){
    byte[] result;
    var tdes = new TripleDESCryptoServiceProvider { KeySize = 128, Mode = CipherMode.CBC, Padding = PaddingMode.PKCS7 };
    // Key explicitly set here, not in the initializer:
    tdes.Key = key;
    iv = tdes.IV;
    using(ICryptoTransform cTransform = tdes.CreateEncryptor()){
        result = cTransform.TransformFinalBlock(dataToEncrypt, 0, dataToEncrypt.Length);
        tdes.Clear();
    }
    return result;
}
public static byte[] DecryptTripleDES(byte[] dataToDecrypt, byte[] key, byte[] iv){
    byte[] result;
    var tdes = new TripleDESCryptoServiceProvider { KeySize = 128, Mode = CipherMode.CBC,IV = iv,Padding = PaddingMode.PKCS7 };
    // Key explicitly set here, not in the initializer:
    tdes.Key = key;
    using (ICryptoTransform cTransform = tdes.CreateDecryptor()){
        result = cTransform.TransformFinalBlock(dataToDecrypt, 0, dataToDecrypt.Length);
        tdes.Clear();
    }
    return result;
}