我正在编写一个Vb.Net应用程序,它从PHP服务器读取加密的XML文件。我正在使用此处找到的代码段:
PHP Encryption & VB.net Decryption
特别是Richard Varno的回答和代码。我可以将PHP服务器上的原始XML文件与VB.Net上的解密版本进行比较,它们是相同的。
问题在于,当我将解密后的版本加载到Vb.Net中的XML文档中时,我只得到一个空文档。
如果我从PHP服务器加载未加密的版本,那很好。除了已经加密然后解密之外,我看不出两者之间有任何明显的区别。两者都是字符串,两者都是Gzip所以为什么这不起作用?
这是我在未加密的字符串中读取的代码:
Dim request As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create(lookupUrl)
' Tell the server that we want it compressed
request.AutomaticDecompression = DecompressionMethods.GZip
request.Timeout = 3000 ' Set 3 second timeout
' Parse the contents from the response to a stream object
stream = response.GetResponseStream()
' Create a reader for the stream object
Dim reader As New StreamReader(stream)
' Read from the stream object using the reader, put the encrypted contents in a string
Dim contents As String = reader.ReadToEnd()
' Put de-encrypted contents into another string
Dim decrypted As String = ""
' Create a new, empty XML document
Dim document As New System.Xml.XmlDocument()
Console.WriteLine("Received: " & contents)
' De-encrypt the data from the response from the server
decrypted = DecryptRJ256(Globals.sKy, Globals.sIV, contents)
Console.WriteLine("Decrypted: " & decrypted)
' Load the contents into the XML document
document.LoadXml(contents)
Dim nodes As XmlNodeList = document.DocumentElement.SelectNodes("//results/Node1")
现在上面有效,但如果我更换
document.LoadXml(contents)
使用:
document.LoadXml(decrypted)
我的XML文档是空的。
答案 0 :(得分:1)
事实证明,解密函数用空字符填充解密字符串的末尾。当被视为十六进制时,它们显示为00,但我通过console.writeline输出的信息根本没有显示。
空字符不是有效的XML,这就是为什么我没有得到任何输出。
解决方案是编写一个函数,该函数使用解密的字符串并使用(在我的情况下在.Net 4.0中)剥离它们的XmlConvert.IsXmlChar(ch)函数。
一旦删除了空字符,我就得到了预期的解密输出。