2016-09-29 11 views
1

PHPサーバーから暗号化されたXMLファイルを読み取るVb.Netアプリケーションを作成しています。私はここで見つかったコードスニペットを使用しています:復号化された文字列からのXML文書の解析

PHP Encryption & VB.net Decryption

特にリチャードVarnoの答えとコードを。 PHPサーバー上の元のXMLファイルとVB.Net上の暗号化されたバージョンを比較することができ、それらは同じです。

問題は、復号化されたバージョンをVb.NetのXMLドキュメントに読み込むと、空のドキュメントが表示されるだけです。

PHPサーバーから暗号化されていないバージョンを読み込むと問題ありません。私は暗号化されていないし、暗号化されていない以外は、2つの間に明白な違いはありません。どちらも文字列で、両方とも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が実際には暗号化されていないと推測する必要があります。 '' Received: "&contents)'と書いた出力は何ですか? – Crowcoder

+0

暗号化されています。 l4QiwAAs9m/ZEetl4fsXTvBC2Y/PFtI4WEteGADcHlGHcqlr5C5N5AuVAv97bWvAqVAvLBWVDMXg6dDMNJAdDZg95soIZ/hAVkYGV4IvQHZo2emg + TVz160p6ZiW26mL3uvZOTuT722CbECIm3y4u /そしてそれは私に、サーバが生成したXMLを与える解読:それはコメントのためにあまりにも長いですが、それが起動するように私はそれをすべてを投稿することはできません。 –

+0

私は 'DecryptRJ256'に慣れていません。 'LoadXml(contents)'が動作する唯一の方法である3番目のパラメータ( 'contents')を変更する必要があります。 'DecryptRJ256'の戻り値は何ですか? – Crowcoder

答えて

1

解読関数は、解読された文字列の終わりをヌル文字で埋めていたことが判明しました。 16進数で表示されたときは00と表示されましたが、console.writeline経由で出力したものは、これをまったく表示していませんでした。

ヌル文字は有効なXMLではないため、出力が得られませんでした。

解決策は、解読された文字列を歩いて(私の場合は.Net 4.0)XmlConvert.IsXmlChar(ch)関数を使用してこれらを取り除く関数を書くことでした。

ヌル文字を削除すると、予想される復号化された出力が得られます。

+0

無効なパディングが例外をスローする必要があります – Crowcoder

+0

あなたは正しいですが、私のコードは何らかの理由でトラップしていませんでしたが、診断ツールの[イベント]タブに表示されていました。私は、それらを見ていないように選択されたメモリ使用量タブを持っていた。ドー! –

関連する問題