首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rijndael加密/填充无效,无法删除

Rijndael加密/填充无效,无法删除
EN

Stack Overflow用户
提问于 2014-01-29 06:36:34
回答 1查看 1.5K关注 0票数 1

我对密码学很陌生,我不太清楚我在这里做错了什么,

代码语言:javascript
复制
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();
    }
}

正如您所看到的,im传入一个字节数组和一个密码。我确保密码总是32个字符。

当我解密数据时,我会得到Padding is invalid and cannot be removed.

钥匙和盐总是一样的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-29 07:29:15

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

代码语言:javascript
复制
keystr.ToUpper()

但只适用于解密方面。所以使用的钥匙是不同的。

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

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

https://stackoverflow.com/questions/21423805

复制
相关文章

相似问题

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