2017-05-25 163 views
1

我使用這個功能在我UWP項目數據加密:解密使用AES失敗

public string Encrypt(string text, string key) 
    { 
     byte[] buffer = Encoding.UTF8.GetBytes(text); 
     byte[] sessionKey = Encoding.UTF8.GetBytes(key); 

     Aes myAes = Aes.Create(); 

     myAes.Mode = CipherMode.ECB; 
     myAes.KeySize = 128; 
     myAes.Key = sessionKey; 
     myAes.Padding = PaddingMode.PKCS7; 

     ICryptoTransform encryptor = myAes.CreateEncryptor(); 
     buffer = encryptor.TransformFinalBlock(buffer, 0, buffer.Length); 

     return Convert.ToBase64String (buffer); 

    } 

但在解密從加密()返回的數據,我得到不同的結果(不等於文本參數Encrypt())。我使用下面的代碼:

public string Decrypt(string text, string key) 

    { 

     byte[] buffer = Convert.FromBase64String(text); 
     byte[] sessionKey = Encoding.UTF8.GetBytes(key); 

     Aes myAes = Aes.Create(); 

     myAes.Mode = CipherMode.ECB; 
     myAes.KeySize = 128; 
     myAes.Key = sessionKey; 
     myAes.Padding = PaddingMode.PKCS7; 

     ICryptoTransform decryptor = myAes.CreateDecryptor(); 
     buffer = decryptor.TransformFinalBlock(buffer, 0, buffer.Length); 

     return Convert.ToBase64String(buffer); 
    } 

我使用加密和解密使用相同的密鑰

UPDATE: 文本參數傳遞給加密():450131283 :: 0300DC98050044C406000100040052C40100626B02007E810900660F

自加密()返回文本: 「lzkPu35Hq7j52IiMWRYSS6j7Vg84abVmhXmNpSxHShJDTbOqkZRFtsPZkEzTsjgRT4MzRHCQUS6MCiq1e5JCune4bZZi1nxxwHtEjZLKZ9E =」

我傳遞給解密()方法,我也得到了以下同(以上)值: 「NDUwMTMxMjgzOjowMzAwREM5ODA1MDA0NEM0MDYwMDAxMDAwNDAwNTJDNDAxMDA2MjZCMDIwMDdFODEwOTAwNjYwRg ==」

+0

不同的結果?不是錯誤?解密應該正常工作或失敗。 – Crowcoder

+0

@Crowcoder我認爲是一樣的,但發現如果我使用錯誤的IV解密,除了前16個字節之外的所有內容都可以正常解密,並且不會拋出異常。如果你顯示輸入和輸出ravi,可能會有所幫助。 – Kevin

+0

@凱文,我更新了我的答案。解密失敗。 –

回答

8

的問題是,你正在與解密結束做什麼:

return Convert.ToBase64String(buffer); 

你真的想解密的二進制數據轉換回在反映你一個字符串轉換爲純文本的二進制數據轉換它原來的方式的方式的字符串,所以你要:

return Encoding.UTF8.GetString(buffer); 

這類問題通常通過查看轉換鏈中每個方向的每個方向來最好地解決,並確保它們是平衡的。因此,它應該是這樣的:

Text 
    (Encode with UTF-8) 
     Non-encrypted binary data 
      (Encrypt) 
       Encrypted binary data 
        (Convert to base64) 
         Encrypted data as base64 text 
         (Store or whatever...) 
         Encrypted data as base64 text 
        (Convert from base64) 
       Encrypted binary data 
      (Decrypt) 
     Non-encrypted binary data 
    (Decode with UTF-8) 
Text 

如果我有你有「使用UTF-8解碼」,「轉換爲base64」,所以解碼步驟不匹配的編碼步驟。

+0

用你的答案更新我的代碼後,我的加密方法給了怪異的字符:「 h 2 e\u007f dT\uћћ\ \ \ \ \\ ))) '\ u0013> ] \ u001c \u0016 A &y \ r \u001b \ a \ u0016 \u 8emA\vm \ 0 \u0017 \u0018 k \\] \u001d 9「 –

+0

@ravikumar:我沒有建議改變你的* encrypt *方法 - 我建議改變你的* decrypt *方法。請仔細閱讀答案的其餘部分,以便了解將要發生的事情。 –