我需要加密XML文件,将其发送到另一个位置并在那里解密。正如您从下面的代码中看到的那样,我使用相同的密钥但它不起作用(现在我只使用两个本地文件)。
我得到的错误如下:
在Decrypt.aspx的这一行填充无效,无法删除。
: Dim xReader As 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 :(得分:2)
您只关闭/刷新FileStream
,而不是CryptoStream
或StreamWriter
。这并没有让CryptoStream
有机会刷新它的最后一个块。
我个人会对所有这些语句使用Using
语句,此时所有内容都会自动关闭,我怀疑你会发现它运行正常。这也意味着如果出现异常,您的资源将被释放 - 例如,如果写入失败,您就不会关闭任何内容。
我也不打扰StreamWriter
- 只需直接保存到CryptoStream
。否则,你有{em>和这两个StreamWriter
试图控制使用的编码。
答案 1 :(得分: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