错误RijndaelManaged,“填充无效,无法删除”
我有来自CryptoStream
错误:
填充无效,无法删除。
码
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; }
使用PaddingMode.Zeros
修复问题,以下代码:
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); } }
我跳来帮助你。
请检查您的密码短语 – 在两种方法EncrypteBytes和DecrypteBytes中应该相同。 如果两者不相同,则会产生错误。
我的问题是我以字节为单位加密输出并将其转换为字符串。 字符串返回字节数组(用于解密)不一样。 我正在使用UTF8Encoding,然后我尝试了ASCIIEnconding。 都没有奏效。
Convert.FromBase64String / ToBase64String工作正常,摆脱了填充问题并实际解密了数据。
这是工作
上述就是C#学习教程:错误RijndaelManaged,“填充无效,无法删除”分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
using (FileStream fs = new FileStream( absolute, FileMode.Open )) { // create a CryptoStream in read mode using (CryptoStream cryptoStream = new CryptoStream( fs, decryptor, CryptoStreamMode.Read )) { int readLength = ( int )fs.Length; byte[] buffer = new byte[readLength]; cryptoStream.Read( buffer, 0, readLength ); using (MemoryStream ms = new MemoryStream( buffer )) { BinaryFormatter bf = new BinaryFormatter( ); settings = ( SettingsJson )bf.Deserialize( ms );// Deserialize SettingsJson array } } fs.Close( ); }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1016115.html