1

当我调用以下方法从 Windows 应用程序解密字符串时,我看到“填充无效且无法删除”错误。字符串是从 asp.net 应用程序加密的。两个应用程序都引用同一个程序集。我能够从 asp.net 应用程序中毫无问题地加密和解密。这是我进行加密和解密的主要代码。

    private static byte[] EncryptHelper(byte[] arrData, string Password, bool Encrypt)
    {
        //Create the SymetricAlgorithem object
        SymmetricAlgorithm myAlg = new RijndaelManaged();

        //define a salt value to derive the key.
        byte[] salt = System.Text.Encoding.ASCII.GetBytes("hjkhj877ffasah");

        //Instantiate Rfc2898DeriveBytes with the password and salt.
        Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(Password, salt);


        myAlg.Key = key.GetBytes(myAlg.KeySize / 8); 
        myAlg.IV = key.GetBytes(myAlg.BlockSize / 8); 
        myAlg.Padding = PaddingMode.PKCS7;
        //Create the ICryptoTransform Object
        ICryptoTransform encrytptor = Encrypt ? myAlg.CreateEncryptor() : myAlg.CreateDecryptor();

        //Create Memorystream to write the encrypted data
        using (MemoryStream aStream = new MemoryStream())
        {

            //Create the CryptoStream Ojbect using the aStream object
            using (CryptoStream encryptStream = new CryptoStream(aStream, encrytptor, CryptoStreamMode.Write))
            {
                //Write the contents to crypto stream
                encryptStream.Write(arrData, 0, arrData.Length);

                //Flush the cryptostream
                encryptStream.FlushFinalBlock();

                //Reposition the memorystream to write the contents to an array.
                aStream.Position = 0;

            }
            aStream.Flush();
            //Convert to an array and return
            return aStream.ToArray();

        }
    }

这是我用来将纯文本从/到字节数组转换的方法

    private static byte[] GetBytes(string str)
    {
        byte[] bytes = new byte[str.Length * sizeof(char)];
        System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
        return bytes;
    }

    private static string GetString(byte[] bytes)
    {
        char[] chars = new char[bytes.Length / sizeof(char)];
        System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
        return new string(chars);
    }

为了将密文保存到数据库,我使用 Convert.ToBase64String() 和 Convert.FromBase64String。问题出在我使用 Rfc2898DeriveBytes 类的方式上吗?

4

1 回答 1

2

好吧,我认为重要的是要提一下,从安全角度来看,对于具有相同密码的每条消息,您将拥有相同的 IV,而可预测的 IV 是一个非常的禁忌。

在那之后,我有点不想多看它,看看出了什么问题,stackoverflow 上有很多非常糟糕的剪切和粘贴 C# 加密,他们只是坐在那里,没有更新机制,没有人看除了人们发现它们再次剪切和粘贴之外。

查看字符串对称认证加密的现代示例。#

我尽量保持最新并进行审查。

于 2013-01-11T15:43:28.147 回答