2016-09-29 62 views
1

我在写一个Vb.Net应用程序,它从PHP服务器读取加密的XML文件。我使用的是在这里找到的代码片段:解析来自解密字符串的XML文档

PHP Encryption & VB.net Decryption

专门理查德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文件是空的。

+1

基于这个信息,我不得不猜测你的xml实际上并没有被加密。什么是你写的输出'“收到:”&内容)'? – Crowcoder

+0

它被加密。我不能发布这一切,因为它是一个评论太长,但它开始:l4QiwAAs9m/ZEetl4fsXTvBC2Y/PFtI4WEteGADcHlGHcqlr5C5N5AuVAv97bWvAqVAvLBWVDMXg6dDMNJAdDZg95soIZ/hAVkYGV4IvQHZo2emg + TVz160p6ZiW26mL3uvZOTuT722CbECIm3y4u /解密它给我生成服务器的XML。 –

+0

我不熟悉'DecryptRJ256'。它必须改变第三个参数('contents'),这是'LoadXml(contents)'的唯一方法。 DecryptRJ256的返回值是多少? – Crowcoder

回答

1

事实证明,解密函数是用空字符填充解密字符串的末尾。当以十六进制格式查看时,这些显示为00,但我通过console.writeline得到的输出完全没有显示。

空字符不是有效的XML,这就是为什么我没有得到任何输出。

解决的办法是编写一个函数,使用解密后的字符串,并在XmlConvert.IsXmlChar(ch)函数中使用(在我的情况下,使用.Net 4.0)。

一旦剥离空字符我得到了预期的解密输出。

+0

无效的填充应该引发异常 – Crowcoder

+0

您是对的 - 它的确如此,但是由于某些原因,我的代码并未陷入它,但它出现在诊断工具的事件选项卡中。我选择了内存使用标签,所以没有看到它们。啊! –