与先前工作代码中的填充相关的CryptographicException

时间:2019-04-29 12:09:32

标签: c# encryption cryptography aes

我有一个存储加密文本数据的程序。每当添加新数据时,都会从文件中加载加密数据,然后解密,附加新的字符串数据,最后将数据重新加密并保存到磁盘。直到最近一直可以使用,但是现在解密加载的数据时得到CryptographicException: Padding is invalid and cannot be removed。这是我用来加密/解密数据的代码:

public static byte[] Encrypt(string text, byte[] key) {
    byte[] encrypted;
    byte[] IV;

    using (var aes = Aes.Create()) {
        aes.Key = key;
        aes.GenerateIV();
        IV = aes.IV;
        aes.Mode = CipherMode.CBC;
        var encryptor = aes.CreateEncryptor(aes.Key, aes.IV);

        using (var msEncrypt = new MemoryStream())
        using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) {
            using (var swEncrypt = new StreamWriter(csEncrypt)) {
                swEncrypt.Write(text);
            }
            encrypted = msEncrypt.ToArray();
        }
    }
    // return plaintext IV and encrypted text payload concatenated
    return IV.Concat(encrypted).ToArray();
} // Encrypt()

public static string Decrypt(byte[] bytes, byte[] key) {
    string plaintext = null;

    using (var aes = Aes.Create()) {
        aes.Key = key;

        // split iv and encryped cyphertext
        byte[] IV = new byte[aes.BlockSize / 8];
        byte[] cipherText = new byte[bytes.Length - IV.Length];
        Array.Copy(bytes, IV, IV.Length);
        Array.Copy(bytes, IV.Length, cipherText, 0, cipherText.Length);

        aes.IV = IV;
        aes.Mode = CipherMode.CBC;

        var decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
        using (var msDecrypt = new MemoryStream(cipherText))
        using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
        using (var srDecrypt = new StreamReader(csDecrypt)) {
            plaintext = srDecrypt.ReadToEnd(); 
            // !!! EXCEPTION HAPPENS HERE !!!
        }
    }

    return plaintext;
}

使用普通的byte[] / File.ReadAllBytes读写加密的File.WriteAllBytes数组。

我试图将代码更改为逐字节读取,直到发生异常为止,这使我得到的解密文本减去16个字节。但是,只有前三分之一包含有效文本,其余部分是几个乱码字节,然后是一个(同样乱码)16字节序列,一遍又一遍地重复。这使我怀疑在先前的保存操作期间发生了某种损坏。

任何有关恢复数据(如果可能)并指出加密/解密代码(如果有)中的问题/错误的帮助,将不胜感激。

0 个答案:

没有答案