首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误RijndaelManaged,“填充无效,无法删除”

错误RijndaelManaged,“填充无效,无法删除”
EN

Stack Overflow用户
提问于 2014-05-01 10:44:13
回答 4查看 30.8K关注 0票数 11

我有来自CryptoStream的错误

填充无效,无法移除。

代码

代码语言:javascript
复制
public MemoryStream EncrypteBytes(Stream inputStream, string passPhrase, string saltValue)
{
    RijndaelManaged RijndaelCipher = new RijndaelManaged();
    RijndaelCipher.Padding = PaddingMode.PKCS7;
    RijndaelCipher.Mode = CipherMode.CBC;
    byte[] salt = Encoding.ASCII.GetBytes(saltValue);
    PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, salt, "SHA1", 2);

    ICryptoTransform Encryptor = RijndaelCipher.CreateEncryptor(password.GetBytes(32), password.GetBytes(16));
    MemoryStream memoryStream = new MemoryStream();
    CryptoStream cryptoStream = new CryptoStream(memoryStream, Encryptor, CryptoStreamMode.Write);
    var buffer = new byte[1024];
    var read = inputStream.Read(buffer, 0, buffer.Length);
    while (read > 0)
    {
        cryptoStream.Write(buffer, 0, read);
        read = inputStream.Read(buffer, 0, buffer.Length);
    }

    cryptoStream.FlushFinalBlock();
    memoryStream.Position = 0;
    return memoryStream;
}

// Example usage: DecryptBytes(encryptedBytes, "SensitivePhrase", "SodiumChloride");
public byte[] DecrypteBytes(MemoryStream memoryStream, string passPhrase, string saltValue)
{
    RijndaelManaged RijndaelCipher = new RijndaelManaged();
    RijndaelCipher.Padding = PaddingMode.PKCS7;

    RijndaelCipher.Mode = CipherMode.CBC;
    byte[] salt = Encoding.ASCII.GetBytes(saltValue);
    PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, salt, "SHA1", 2);

    ICryptoTransform Decryptor = RijndaelCipher.CreateDecryptor(password.GetBytes(32), password.GetBytes(16));


    CryptoStream cryptoStream = new CryptoStream(memoryStream, Decryptor, CryptoStreamMode.Read);
    byte[] plainBytes = new byte[memoryStream.Length];

    int DecryptedCount = cryptoStream.Read(plainBytes, 0, plainBytes.Length);

    return plainBytes;
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-06-19 19:28:13

使用PaddingMode.Zeros修复问题,代码如下:

代码语言:javascript
复制
   public byte[] EncryptFile(Stream input, string password, string salt)
            {

                // Essentially, if you want to use RijndaelManaged as AES you need to make sure that:
                // 1.The block size is set to 128 bits
                // 2.You are not using CFB mode, or if you are the feedback size is also 128 bits

                var algorithm = new RijndaelManaged { KeySize = 256, BlockSize = 128 };
                var key = new Rfc2898DeriveBytes(password, Encoding.ASCII.GetBytes(salt));

                algorithm.Key = key.GetBytes(algorithm.KeySize / 8);
                algorithm.IV = key.GetBytes(algorithm.BlockSize / 8);
                algorithm.Padding = PaddingMode.Zeros;

                using (Stream cryptoStream = new MemoryStream())
                using (var encryptedStream = new CryptoStream(cryptoStream, algorithm.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    CopyStream(input, encryptedStream);

                    return ReadToEnd(cryptoStream);
                }
            }

            public byte[] DecryptFile(Stream input, Stream output, string password, string salt)
            {
                // Essentially, if you want to use RijndaelManaged as AES you need to make sure that:
                // 1.The block size is set to 128 bits
                // 2.You are not using CFB mode, or if you are the feedback size is also 128 bits
                var algorithm = new RijndaelManaged { KeySize = 256, BlockSize = 128 };
                var key = new Rfc2898DeriveBytes(password, Encoding.ASCII.GetBytes(salt));

                algorithm.Key = key.GetBytes(algorithm.KeySize / 8);
                algorithm.IV = key.GetBytes(algorithm.BlockSize / 8);
                algorithm.Padding = PaddingMode.Zeros;

                try
                {
                    using (var decryptedStream = new CryptoStream(output, algorithm.CreateDecryptor(), CryptoStreamMode.Write))
                    {
                        CopyStream(input, decryptedStream);
                        return ReadToEnd(output);
                    }
                }
                catch (CryptographicException ex)
                {
                    throw new InvalidDataException("Please supply a correct password");
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }

我跳起来帮你。

票数 18
EN

Stack Overflow用户

发布于 2014-05-01 10:54:07

请检查您的密码短语-在EncrypteBytes和DecrypteBytes两种方法中都应该是相同的。如果两者不相同,则会生成错误。

票数 11
EN

Stack Overflow用户

发布于 2017-09-25 10:20:30

我的问题是,我将加密后的输出以字节为单位,并将其转换为字符串。返回到字节数组的字符串(用于解密)并不相同。我在使用UTF8Encoding,然后我尝试了ASCIIEnconding。两样都没用。

转换:从ComromBase64String/ToBase64String可以很好地工作,消除了填充问题,并对数据进行了实际解密。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23406135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档