2011-04-27 109 views
1

我需要加密一個XML文件,將它發送到另一個位置並在那裏進行解密。正如你從下面的代碼可以看到的,我使用了相同的密鑰,但它不起作用(現在我只是使用兩個本地文件)。在單獨的文件中對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

你'只關閉/沖洗FileStream,而不是CryptoStreamStreamWriter。這不會給CryptoStream一個沖洗最後一塊的機會。

就我個人而言,我會使用Using所有的聲明,在這一點上一切都會自動關閉,我懷疑你會發現它工作正常。這也意味着如果出現異常,您的資源將被釋放 - 例如,目前,如果寫入失敗,則不會關閉任何內容。

我會不打擾與StreamWriter - 只是直接保存到CryptoStream而不是。否則,您將同時嘗試控制所用的編碼,即XML ,StreamWriter

+0

它不會讓我關閉其他流雖然。我會嘗試使用方法,並讓你知道我如何去。謝謝。 – 2011-04-27 06:41:12

+0

@ user718341:你是什麼意思它「不會讓你」?我的猜測是,你試圖以錯誤的順序關閉它們,並且他們試圖刷新到一個關閉的FileStream ... – 2011-04-27 06:43:34

+0

「wouldnt let me」=有錯誤。不,我改變了順序 - 我只是假設它意味着關閉最後一個被分解到其餘部分的順序。 – 2011-04-27 06:46:59