<>转换To和From 64BaseString时Xml丢失

时间:2012-09-24 13:07:44

标签: c# .net xml encryption

我有这个简单的Xml文件

<Root>
    <Licence Name="My name" Age="23"/>
</Root>

在我的加密和解密过程中,我正在使用ToBase64String()FromBase64String()方法,但是当我尝试解密文件时,它没有工作,&lt;&gt; ; 女巫限制我的许可证元素丢失。这是加密和解密后的结果:

<Root>&lt;Licence Name="My name" Age="23" /&gt;</Root>

这是我的代码

//Encrypt
private void bnEncrypt_Click(object sender, EventArgs e)
{
        var xDoc = XElement.Load(@"C:\Opticien\Lic.xml");
        var data = xDoc.Element("Licence").ToString();

        var dataByte = Encoding.UTF8.GetBytes(data);
        var dataEncrypted = Convert.ToBase64String(dataByte);

        xDoc.SetValue(dataEncrypted);
        xDoc.Save(@"C:\Opticien\Lic.xml");
        memoEdit1.Text = xDoc.ToString();
}

//Decrypt
private void bnDecrypt_Click(object sender, EventArgs e)
{
        var xDoc = XElement.Load(@"C:\Opticien\Lic.xml");
        var data = xDoc.Value;

        var dataByte = Convert.FromBase64String(data);
        var dataDecrypted = Encoding.UTF8.GetString(dataByte);

        xDoc.SetValue(dataDecrypted);
        xDoc.Save(@"C:\Opticien\Lic.xml");
        memoEdit1.Text = xDoc.ToString();
}

2 个答案:

答案 0 :(得分:3)

您正在xDoc.SetValue(dataDecrypted);中使用SetValue。这将设置<Root>节点的文本,转义任何特殊字符,例如'&lt;'和'&gt;'字符。

相反,使用XElement.Parse()创建一个基于解码(而不是解密)字符串的新XElement。

答案 1 :(得分:1)

而不是xDoc.SetValue(dataDecrypted);您需要使用此代码:

xDoc.FirstNode.ReplaceWith(XElement.Parse(dataDecrypted));