Я сериализую объект через DataContractSerializer без проблем.Можно ли десериализовать зашифрованный файл через DataContractSerializer?
Но если я попытаюсь сериализовать этот объект в зашифрованном файле, я получаю исключение при десериализации.
Вот мой код:
public static bool SerializeDataContract<t>(Stream fileStream, t o, bool bCrypt = false)
{
DataContractSerializer serializer = new DataContractSerializer(typeof(t));
if(bCrypt)
{
TripleDESCryptoServiceProvider crypt = new TripleDESCryptoServiceProvider();
crypt.IV = CRYPT_INIT_VECTOR;
crypt.Key = CRYPT_KEY;
crypt.Padding = PaddingMode.Zeros;
using(CryptoStream cryptoStream = new CryptoStream(fileStream, crypt.CreateEncryptor(), CryptoStreamMode.Write))
{
serializer.WriteObject(cryptoStream, o);
cryptoStream.Close();
}
}
else
serializer.WriteObject(fileStream, o);
return true;
}
public static bool DeserializeDataContract<t>(Stream fileStream, out t o, bool bCrypt = false)
{
o = default(t);
try
{
DataContractSerializer serializer = new DataContractSerializer(typeof(t));
if(bCrypt)
{
TripleDESCryptoServiceProvider crypt = new TripleDESCryptoServiceProvider();
crypt.IV = CRYPT_INIT_VECTOR;
crypt.Key = CRYPT_KEY;
crypt.Padding = PaddingMode.Zeros;
using(CryptoStream cryptoStream = new CryptoStream(fileStream, crypt.CreateDecryptor(), CryptoStreamMode.Read))
{
//TraceXML(cryptoStream);
o = (t)serializer.ReadObject(cryptoStream);
cryptoStream.Close();
}
}
else
{
o = (t)serializer.ReadObject(fileStream);
}
}
catch(Exception ex)
{
return false;
}
return true;
}
Если я называю две функции с Bcrypt = ложь, все работает, как ожидалось. Но если я вызываю функции с bCrypt = true, я получаю исключение при десериализации.
Исключение (транслируется с немецкого языка на английский): SerializationException: данные на корневом уровне недействительны.
Если я трассирую данные, которые считываются после дешифрования, данные мне кажутся подходящими, то есть они выглядят так же, как сериализация без шифрования.
Знаете ли вы, где ошибка в моем коде?
Или это просто невозможно использовать шифрование с помощью DataContractSerializer?
Это именно то, что мне не хватает, спасибо. Уверены ли вы, что нет проблем с удалением нулей в конце? Гарантировано ли, что все нули в конце потока предназначены для заполнения? – MTR
Должно быть, так как вы изначально шифруете xml, у которого никогда не будет конечного нуля. – Phil
Вы правы, я не понимал, что вы удаляете нули в расшифрованном потоке. – MTR