2011-04-27 29 views
1

XMLファイルを暗号化して別の場所に送信し、そこで復号化する必要があります。以下のコードからわかるように、私は同じキーを使用していますが、動作しません(今のところ2つのローカルファイルを使用しています)。別ファイルのXML暗号化/復号化

次のように私が手にエラーがある:

パディングは無効であり、削除することはできません。 Decrypt.aspxで

この行の

に:薄暗いxReader私はそれがファイルが正しく保存されない、例えば、エラーの原因となる実際の暗号化段階にあるかもしれない考えていますXmlTextReaderは

として。

Encrypt.aspx

Dim rijnAlg As RijndaelManaged 
rijnAlg = RijndaelManaged.Create() 

rijnAlg.Key = {118, 123, 23, 17, 161, 152, 35, 68, 126, 213, 16, 115, 68, 217, 58, 108, 56, 218, 5, 78, 28, 128, 113, 208, 61, 56, 10, 87, 187, 162, 233, 38} 
rijnAlg.IV = {33, 241, 14, 16, 103, 18, 14, 248, 4, 54, 18, 5, 60, 76, 16, 191} 
Dim encryptor As ICryptoTransform 
encryptor = rijnAlg.CreateEncryptor(rijnAlg.Key, rijnAlg.IV) 

Dim wStream As FileStream 
wStream = File.Open("C:\test.xml", FileMode.Create) 

Dim cStream As CryptoStream 
cStream = New CryptoStream(wStream, encryptor, CryptoStreamMode.Write) 

Dim sWriter As StreamWriter 
sWriter = New StreamWriter(cStream) 

XMLDoc.Save(sWriter) 

'Clear memory' 
wStream.Flush() 
wStream.Close() 

Decrypt.aspx

Dim rijnAlg As RijndaelManaged 
rijnAlg = RijndaelManaged.Create() 

rijnAlg.Key = {118, 123, 23, 17, 161, 152, 35, 68, 126, 213, 16, 115, 68, 217, 58, 108, 56, 218, 5, 78, 28, 128, 113, 208, 61, 56, 10, 87, 187, 162, 233, 38} 
rijnAlg.IV = {33, 241, 14, 16, 103, 18, 14, 248, 4, 54, 18, 5, 60, 76, 16, 191} 
Dim decryptor As ICryptoTransform 
decryptor = rijnAlg.CreateDecryptor(rijnAlg.Key, rijnAlg.IV) 

Response.Write(rijnAlg.Key) 
Response.Write(rijnAlg.IV) 

Dim rStream As FileStream 
rStream = File.OpenRead("C:\test.xml") 

Dim cStream As CryptoStream 
cStream = New CryptoStream(rStream, decryptor, CryptoStreamMode.Read) 

Dim xReader As XmlTextReader 
xReader = New XmlTextReader(cStream) 

Dim xDoc As XDocument 
xDoc = XDocument.Load(xReader) 

xDoc.Save("C:\test.xml") 

、可能な関心のために、ここで私が使用していますXMLを作成するコードです:

Dim XMLDoc As XDocument 
    XMLDoc = New XDocument(
     New XDeclaration("1.0", "utf-8", "yes"), 
     New XElement("user", 
      New XElement("details", 
       New XElement("firstname", Firstname.Text), 
       New XElement("surname", Lastname.Text) 
      ) 
     ) 
    ) 

XMLDoc.Save("C:\test.xml") 

答えて

0

私の問題に最善の結論を示したJon Skeetに大変感謝しています。最終的なコード(と改善):

Encrypt.aspx

Using ra As RijnDaelManaged = RijndaelManaged.Create() 

    ra.Key = {118, 123, 23, 17, 161, 152, 35, 68, 126, 213, 16, 115, 68, 217, 58, 108, 56, 218, 5, 78, 28, 128, 113, 208, 61, 56, 10, 87, 187, 162, 233, 38} 
    ra.IV = {33, 241, 14, 16, 103, 18, 14, 248, 4, 54, 18, 5, 60, 76, 16, 191} 

    encrypt = ra.CreateEncryptor(ra.Key, ra.IV) 

    Using ws As FileStream = File.Open("C:\test1.xml", FileMode.Create) 

     Using cs As CryptoStream = New CryptoStream(ws, encrypt, CryptoStreamMode.Write) 

      XMLDoc.Save(cs) 

     End Using 

    End Using 

End Using 

Decrypt.aspx

Using ra As RijndaelManaged = RijndaelManaged.Create() 

    ra.Key = {118, 123, 23, 17, 161, 152, 35, 68, 126, 213, 16, 115, 68, 217, 58, 108, 56, 218, 5, 78, 28, 128, 113, 208, 61, 56, 10, 87, 187, 162, 233, 38} 
    ra.IV = {33, 241, 14, 16, 103, 18, 14, 248, 4, 54, 18, 5, 60, 76, 16, 191} 

    decrypt = ra.CreateDecryptor(ra.Key, ra.IV) 

    Using rs As FileStream = File.OpenRead("C:\test1.xml") 

     Using cs As CryptoStream = New CryptoStream(rs, decrypt, CryptoStreamMode.Read) 

      Using xr As XmlTextReader = New XmlTextReader(cs) 

       xDoc = XDocument.Load(xr) 
       xDoc.Save("C:\test2.xml") 

      End Using 

     End Using 

    End Using 

End Using 
2

あなたは、 CryptoStreamまたはStreamWriterではなく、FileStreamを閉じる/フラッシュするだけです。それはCryptoStreamに最終ブロックをフラッシュする機会を与えません。

私は個人的にはすべてUsingというステートメントを使用しますが、その時点ですべてが自動的に閉じられ、正常に動作することがわかります。つまり、例外がある場合にはリソースが解放されることを意味します。たとえば、書き込みが失敗した場合は何も終了しません。

StreamWriterで気にする必要はありません。ちょうどCryptoStreamに直接保存してください。それ以外の場合は、XML の両方が使用されています。StreamWriterは、使用されているエンコードを制御しようとしています。

+0

それは私はしかし他のストリームを閉じることはできないだろう。私はUsingメソッドを試し、私がどうやって行くのか教えてあげます。ありがとうございました。 –

+0

@ user718341:「あなたを許さないだろう」ということはどういう意味ですか?私の推測では、それらを間違った順序で閉じようとしていて、クローズされたFileStreamにフラッシュしようとしました... –

+0

"wouldnt let me" =エラーが出ました。いいえ、私は注文を変更しました - 私はそれが残りのものに分割された最後のものを閉じることを意味していたと仮定しました。 –