1
내 코드의 조각이다 : 나는 예외를 얻을읽기/쓰기 암호화 된 XML
public class ShelfCache
{
public Shelf Data;
public ShelfCache()
{
Data = new Shelf();
}
public void Write(string Filename)
{
XmlSerializer xsl = new XmlSerializer(typeof(Shelf));
TextWriter xslWriter = new StreamWriter(Filename);
xsl.Serialize(xslWriter, Data);
xslWriter.Flush();
xslWriter.Close();
}
public void Read(string Filename)
{
Data = new Shelf();
XmlSerializer xsl = new XmlSerializer(typeof(Shelf));
TextReader xslReader = new StreamReader(Filename);
Data = (Shelf)xsl.Deserialize(xslReader);
xslReader.Close();
}
public void WriteEncrypted(string Filename, string EncryptionKey = "")
{
string _Key = EncryptionKey + Environment.ExpandEnvironmentVariables("%USERNAME%%COMPUTERNAME%123456789ABCDEFabcdef").Substring(0, 32);
string _IV = Environment.ExpandEnvironmentVariables("%COMPUTERNAME%123456789abcdef").Substring(0, 16);
byte[] Key = Encoding.UTF8.GetBytes(_Key);
byte[] IV = Encoding.UTF8.GetBytes(_IV);
FileStream CacheStream = new FileStream(Filename, FileMode.Create, FileAccess.ReadWrite, FileShare.Read);
RijndaelManaged CryptoProvider = new RijndaelManaged();
ICryptoTransform CacheTransform = CryptoProvider.CreateEncryptor(Key, IV);
CryptoStream EncryptionStream = new CryptoStream(CacheStream, CacheTransform, CryptoStreamMode.Write);
XmlSerializer xsl = new XmlSerializer(typeof(Shelf));
xsl.Serialize(EncryptionStream, Data);
EncryptionStream.Flush();
CacheStream.Close();
}
public void ReadEncrypted(string Filename, string EncryptionKey = "")
{
string _Key = EncryptionKey + Environment.ExpandEnvironmentVariables("%USERNAME%%COMPUTERNAME%123456789ABCDEFabcdef").Substring(0, 32);
string _IV = Environment.ExpandEnvironmentVariables("%COMPUTERNAME%123456789abcdef").Substring(0, 16);
byte[] Key = Encoding.UTF8.GetBytes(_Key);
byte[] IV = Encoding.UTF8.GetBytes(_IV);
FileStream CacheStream = new FileStream(Filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
RijndaelManaged CryptoProvider = new RijndaelManaged();
ICryptoTransform CacheTransform = CryptoProvider.CreateEncryptor(Key, IV);
CryptoStream DecryptionStream = new CryptoStream(CacheStream, CacheTransform, CryptoStreamMode.Read);
XmlSerializer xsl = new XmlSerializer(typeof(Shelf));
Data = (Shelf)xsl.Deserialize(DecryptionStream);
CacheStream.Close();
}
}
은 "이있다 XML 문서 (1 1)에서 오류가 발생했습니다. " "루트 레벨의 데이터가 유효하지 않습니다. 라인 1, 위치 1"내부 예외가 있습니다. 라인에 :
Data = (Shelf)xsl.Deserialize(DecryptionStream);
당신은 암호화 된 XML 문서를 작성하지 못할 ... (내가 솔루션을 좋아하지 않아,하지만 작동)하고 결국 것입니다. 다음 중 하나를 수행 할 수 있습니다. XML 파일을 작성한 다음 자체 파일을 암호화합니다. 또는 데이터를 암호화합니다 (XML이 아닌 바이너리 형식으로). 그런 다음 해독합니다. 데이터를 해독하고 XML 파일을 구성합니다. – Botonomous
@Anon 그래서 [this] (http://www.w3.org/TR/xmlenc-core/)가 존재하지 않습니까? –
알았어 - 파일의 일부를 사람이 읽을 수 없도록 지정해야합니다 ... XmlSerializer에서 BinaryFormatter로 변경하려고했습니다 ... BinaryFormatter를 사용하고 암호화하지 않으면 파일을 성공적으로 다시 읽을 수 없습니다. .. 나는 그것이 파일의 크기와 관련이 있을지도 모른다고 생각한다. 왜냐하면 디스크의 약 25KB를 차지하는 중첩 된 객체의 목록 인 데이터의 대부분을 주석 처리 할 때 성공하기 때문이다. –