2011-04-27 1 views
1

XML 파일을 암호화하고 다른 위치로 보내고 해독해야합니다. 아래의 코드에서 볼 수 있듯이 동일한 키를 사용하고 있지만 작동하지 않습니다 (현재는 두 개의 로컬 파일 만 사용하고 있습니다).XML 파일 암호화/암호 해독

패딩이 유효 제거 할 수 없습니다 다음과 같이

내가 오류입니다. Decrypt.aspx에서이 라인에

: 나는 그것이 예를 들어, 실제 암호화 단계의 원인이 오류에있을 수 있습니다 생각하고 XmlTextReader는

으로 희미한 xReader이 제대로 저장 파일이 없습니다.

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") 
:

는 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() 

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") 

그리고 가능한 한 관심을 위해 Decrypt.aspx, 여기 내가 사용하고있는 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"= 오류가 발생했습니다. 아니요, 주문을 변경했습니다. 사용 된 마지막 항목을 닫는 것이 나머지 항목으로 분할되는 것을 의미한다고 가정했습니다. –