Я искал в Интернете, что означает это исключение по отношению к моей программе, но не могу найти решение или причину, по которой это происходит с моей конкретной программой. Я использовал пример, предоставленный моим msdn, для шифрования и дешифрования XmlDocument с использованием алгоритма Rijndael. Шифрование работает нормально, но когда я пытаюсь расшифровать, я получаю следующее исключение:
Заполнение недействительно и не может быть удалено
Кто-нибудь может сказать мне, что я могу сделать, чтобы решить эту проблему? В приведенном ниже коде я получаю ключ и другие данные. Если для параметра cryptoMode установлено значение false, он вызовет метод дешифрования, в котором возникает исключение:
public void Cryptography(XmlDocument doc, bool cryptographyMode)
{
RijndaelManaged key = null;
try
{
// Create a new Rijndael key.
key = new RijndaelManaged();
const string passwordBytes = "Password1234"; //password here
byte[] saltBytes = Encoding.UTF8.GetBytes("SaltBytes");
Rfc2898DeriveBytes p = new Rfc2898DeriveBytes(passwordBytes, saltBytes);
// sizes are devided by 8 because [ 1 byte = 8 bits ]
key.IV = p.GetBytes(key.BlockSize/8);
key.Key = p.GetBytes(key.KeySize/8);
if (cryptographyMode)
{
Ecrypt(doc, "Content", key);
}
else
{
Decrypt(doc, key);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
// Clear the key.
if (key != null)
{
key.Clear();
}
}
}
private void Decrypt(XmlDocument doc, SymmetricAlgorithm alg)
{
// Check the arguments.
if (doc == null)
throw new ArgumentNullException("Doc");
if (alg == null)
throw new ArgumentNullException("alg");
// Find the EncryptedData element in the XmlDocument.
XmlElement encryptedElement = doc.GetElementsByTagName("EncryptedData")[0] as XmlElement;
// If the EncryptedData element was not found, throw an exception.
if (encryptedElement == null)
{
throw new XmlException("The EncryptedData element was not found.");
}
// Create an EncryptedData object and populate it.
EncryptedData edElement = new EncryptedData();
edElement.LoadXml(encryptedElement);
// Create a new EncryptedXml object.
EncryptedXml exml = new EncryptedXml();
// Decrypt the element using the symmetric key.
byte[] rgbOutput = exml.DecryptData(edElement, alg); <---- I GET THE EXCEPTION HERE
// Replace the encryptedData element with the plaintext XML element.
exml.ReplaceData(encryptedElement, rgbOutput);
}
Обо мне сообщает та же ошибка клиент. Я лично не могу репродукция это. Рассмотрение кода Шифрует , и Дешифруют методы, оба имеют Дополнение набор к PaddingMode. PKCS7. Дешифруют , похож на это, и я не вижу проблемы с ним в отношении' FlushFinalBlock'. Кто-то мог пролить некоторый свет на него?
public string Decrypt(string cipherText)
{
if (string.IsNullOrEmpty(cipherText))
return "";
string result;
Encoding byteEncoder = Encoding.Default;
byte[] rijnKey = byteEncoder.GetBytes(Password);
byte[] rijnIv = byteEncoder.GetBytes(InitialVector);
RijndaelManaged rijn = new RijndaelManaged { Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 };
using (MemoryStream msDecrypt = new MemoryStream(Convert.FromBase64String(cipherText)))
{
using (ICryptoTransform decryptor = rijn.CreateDecryptor(rijnKey, rijnIv))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader swDecrypt = new StreamReader(csDecrypt))
{
result = swDecrypt.ReadToEnd();
}
}
}
}
rijn.Clear();
return result.Replace("\0", "");
}