C# AeS加密&x27;值不能为null';

C# AeS加密&x27;值不能为null';,c#,aes,memorystream,cryptostream,C#,Aes,Memorystream,Cryptostream,我最近一直在试验“加密流”,并偶然想到通过加密和解密文本。Aes类。”命名空间:System.Security.Cryptography' 在使用两个输入参数成功加密文本后:text、Password static byte[] Salt = { 18,39,27,48,82,32,12,92 }; public static string EncryptAES(string txt, string Password) { Rfc2898DeriveByt

我最近一直在试验“加密流”,并偶然想到通过加密和解密文本。Aes类。”命名空间:System.Security.Cryptography'

在使用两个输入参数成功加密文本后:text、Password

static byte[] Salt = { 18,39,27,48,82,32,12,92 };
        public static string EncryptAES(string txt, string Password) {
            Rfc2898DeriveBytes rfc = new Rfc2898DeriveBytes(Password, Salt);
            RijndaelManaged RJM = new RijndaelManaged();
            RJM.Key = rfc.GetBytes(RJM.KeySize / 8);
            ICryptoTransform ICT = Aes.Create().CreateEncryptor(RJM.Key, RJM.IV);

            using (MemoryStream MS = new MemoryStream()) {
                using (CryptoStream CS = new CryptoStream(MS, ICT, CryptoStreamMode.Write)) {
                    using (StreamWriter SW = new StreamWriter(CS)) {
                        SW.Write(txt);
                    }
                }

                return Convert.ToBase64String(MS.ToArray());
            }
        }
解密文本的问题发生了

我解密文本的尝试如下:

public static string DecryptAES(string EncryptedTxt, string Password) {
            Rfc2898DeriveBytes rfc = new Rfc2898DeriveBytes(EncryptedTxt, Salt);
            RijndaelManaged RJM = new RijndaelManaged();
            RJM.Key = rfc.GetBytes(RJM.KeySize / 8);
            ICryptoTransform ICT = Aes.Create().CreateDecryptor(RJM.Key, RJM.IV);
            using (MemoryStream MS = new MemoryStream(Convert.FromBase64String(EncryptedTxt))) {
                using (CryptoStream CS = new CryptoStream(MS, ICT, CryptoStreamMode.Read)) {
                    using (StreamReader SR = new StreamReader(CS)) {
                        return SR.ReadToEnd();
                    }
                }
            }
但是,;似乎我将memorystream转换为字符串然后再转换回来的方式是invaild,因为我得到了以下错误:错误:值不能为null\n参数名称:inputBuffer

错误发生在使用(MemoryStream MS=new MemoryStream(Convert.FromBase64String(EncryptedText))时的

如何将MemoryStream转换为字符串并返回?


提前感谢:-)

我注意到的第一件事是你没有正确使用盐。盐不应该是恒定的。我会创建一个随机的salt,并在输出前添加它。同样的IV程序。一个明显的错误是,您使用不同的IV进行解密,而不是加密(两次都是随机的)。您需要使用一个随机的进行加密,并将其前置到密文中。