C# Rijndael加密|填充无效,无法删除

C# Rijndael加密|填充无效,无法删除,c#,encryption,C#,Encryption,我对密码学一无所知,我不太清楚我在这里做错了什么 public static byte[] EncryptData(byte[] data, string keystr) { if (keystr.Length > 32) keystr = keystr.Substring(0, 32); else while (keystr.Length != 32) keystr += "0"; byte[] iv =

我对密码学一无所知,我不太清楚我在这里做错了什么

public static byte[] EncryptData(byte[] data, string keystr)
{
    if (keystr.Length > 32)
        keystr = keystr.Substring(0, 32);
    else
        while (keystr.Length != 32)
            keystr += "0";

    byte[] iv = Encoding.UTF8.GetBytes(SALT);
    byte[] key = Encoding.UTF8.GetBytes(keystr);

    using (MemoryStream memoryStream = new MemoryStream())
    {
        using (RijndaelManaged rijndaelManaged = new RijndaelManaged { Key = key, IV = iv, Padding = PaddingMode.PKCS7, Mode = CipherMode.CBC })
        {
            using (CryptoStream cryptoStream = new CryptoStream(memoryStream, rijndaelManaged.CreateEncryptor(key, iv), CryptoStreamMode.Write))
            {
                cryptoStream.Write(data, 0, data.Length);
            }
        }
        return memoryStream.ToArray();
    }
}

public static byte[] DecryptData(byte[] data, string keystr)
{
    if (keystr.Length > 32)
        keystr = keystr.Substring(0, 32);
    else
        while (keystr.Length != 32)
            keystr += "0";

    byte[] iv = Encoding.UTF8.GetBytes(SALT);
    byte[] key = Encoding.UTF8.GetBytes(keystr.ToUpper());

    using (MemoryStream memoryStream = new MemoryStream())
    {
        using (RijndaelManaged rijndaelManaged = new RijndaelManaged { Key = key, IV = iv, Padding = PaddingMode.PKCS7, Mode = CipherMode.CBC })
        {
            using (CryptoStream cryptoStream = new CryptoStream(memoryStream, rijndaelManaged.CreateDecryptor(key, iv), CryptoStreamMode.Write))
            {
                cryptoStream.Write(data, 0, data.Length);
            }
        }
        return memoryStream.ToArray();
    }
}
正如你所看到的,我正在传递一个字节数组和一个密码。我确保密码始终为32个字符

Im获取的
填充无效,无法删除。
当我解密数据时


键和salt总是相同的。

键可以以相同的方式传递给这两种方法,但出于某种原因,在丢弃更多的熵(对于较长的字符串)或填充键(对于较短的字符串)后,出于某种原因,您可以这样做:

keystr.ToUpper()
但仅限于解密方面。所以使用的钥匙是不同的


我强烈建议您不要打电话给
ToUpper
。其他建议可能是没有固定的salt/IV,并允许IV和键也作为字节数组传递,而不是
字符串
。加密自然会处理字节数组,而将这样的包装方法放在适当的位置,实际上会鼓励较弱的加密,这可能是个坏主意。

Ahh非常感谢,我以前的加密类中出现了愚蠢的复制粘贴错误。