2016-11-16 73 views
1

我需要在Windows Phone 8.1中的應用程序上執行128位AES加密。我用下面的代碼分別對數據進行加密和解密:AES加密Windows Phone 8.1

private string GetEncryptedContent(string content) 
    { 
     byte[] keyMaterial = Encoding.UTF8.GetBytes(EncryptionKey); 
     byte[] data = Encoding.UTF8.GetBytes(content); 
     var provider = WinRTCrypto.SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithm.AesCbcPkcs7); 
     var key = provider.CreateSymmetricKey(keyMaterial); 
     byte[] cipherText = WinRTCrypto.CryptographicEngine.Encrypt(key, data, null); 
     return Encoding.UTF8.GetString(cipherText, 0, cipherText.Length); 
    } 

    private string GetDecryptedContent(string content) 
    { 
     byte[] keyMaterial = Encoding.UTF8.GetBytes(EncryptionKey); 
     byte[] data = Encoding.UTF8.GetBytes(content); 
     var provider = WinRTCrypto.SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithm.AesCbcPkcs7); 
     var key = provider.CreateSymmetricKey(keyMaterial); 
     byte[] cipherText = WinRTCrypto.CryptographicEngine.Decrypt(key, data, null); 
     return Encoding.UTF8.GetString(cipherText, 0, cipherText.Length); 
    } 

但是加密和解密似乎沒有正常工作。這是獲取加密一些Unicode字符和解密扔崩潰:

長度不是塊大小的倍數,沒有填充是 選擇\ r \ n參數名:密文

什麼我在這裏做錯了嗎?有人可以幫忙嗎?

編輯

後更多的時間與谷歌,我發現用於加密和解密下面的方法,但他們似乎並沒有任何工作。

public string GetEncryptedContent(string input, string pass) 
    { 
     SymmetricKeyAlgorithmProvider SAP = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesEcbPkcs7); 
     CryptographicKey AES; 
     HashAlgorithmProvider HAP = HashAlgorithmProvider.OpenAlgorithm(HashAlgorithmNames.Md5); 
     CryptographicHash Hash_AES = HAP.CreateHash(); 

     string encrypted = ""; 
     try 
     { 
      byte[] hash = new byte[32]; 
      Hash_AES.Append(CryptographicBuffer.CreateFromByteArray(Encoding.UTF8.GetBytes(pass))); 
      byte[] temp; 
      CryptographicBuffer.CopyToByteArray(Hash_AES.GetValueAndReset(), out temp); 

      Array.Copy(temp, 0, hash, 0, 16); 
      Array.Copy(temp, 0, hash, 15, 16); 

      AES = SAP.CreateSymmetricKey(CryptographicBuffer.CreateFromByteArray(hash)); 

      IBuffer Buffer = CryptographicBuffer.CreateFromByteArray(Encoding.UTF8.GetBytes(input)); 
      encrypted = CryptographicBuffer.EncodeToBase64String(CryptographicEngine.Encrypt(AES, Buffer, null)); 

      return encrypted; 
     } 
     catch (Exception ex) 
     { 
      return null; 
     } 
    } 


    public string GetDecryptedContent(string input, string pass) 
    { 
     SymmetricKeyAlgorithmProvider SAP = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesEcbPkcs7); 
     CryptographicKey AES; 
     HashAlgorithmProvider HAP = HashAlgorithmProvider.OpenAlgorithm(HashAlgorithmNames.Md5); 
     CryptographicHash Hash_AES = HAP.CreateHash(); 

     string decrypted = ""; 
     try 
     { 
      byte[] hash = new byte[32]; 
      Hash_AES.Append(CryptographicBuffer.CreateFromByteArray(Encoding.UTF8.GetBytes(pass))); 
      byte[] temp; 
      CryptographicBuffer.CopyToByteArray(Hash_AES.GetValueAndReset(), out temp); 

      Array.Copy(temp, 0, hash, 0, 16); 
      Array.Copy(temp, 0, hash, 15, 16); 

      AES = SAP.CreateSymmetricKey(CryptographicBuffer.CreateFromByteArray(hash)); 

      IBuffer Buffer = CryptographicBuffer.DecodeFromBase64String(input); 
      byte[] Decrypted; 
      CryptographicBuffer.CopyToByteArray(CryptographicEngine.Decrypt(AES, Buffer, null), out Decrypted); 
      decrypted = Encoding.UTF8.GetString(Decrypted, 0, Decrypted.Length); 

      return decrypted; 
     } 
     catch (Exception ex) 
     { 
      return null; 
     } 
    } 

EDIT 2

終於設法得到加密正常工作,但解密,因爲我傳遞的編碼不正確的還是不想必工作:

private string GetEncryptedContent(string content) 
    { 
     byte[] keyMaterial = Encoding.UTF8.GetBytes(EncryptionKey); 
     byte[] data = Encoding.UTF8.GetBytes(content); 
     byte[] iv = new byte[128/8]; // Adding this solved the encryption issue. 
     var provider = WinRTCrypto.SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithm.AesCbcPkcs7); 
     var key = provider.CreateSymmetricKey(keyMaterial); 
     byte[] cipherText = WinRTCrypto.CryptographicEngine.Encrypt(key, data, iv); 
     return Convert.ToBase64String(cipherText); 
    } 

    private string GetDecryptedContent(string content) 
    { 
     byte[] keyMaterial = Encoding.UTF8.GetBytes(EncryptionKey); 
     byte[] data = Convert.FromBase64String(content); // Believe this is where the issue is, but not able to figure it out. 
     byte[] iv = new byte[128/8]; // Added this to make the decryption work the same way. 
     var provider = WinRTCrypto.SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithm.AesCbcPkcs7); 
     var key = provider.CreateSymmetricKey(keyMaterial); 
     byte[] cipherText = WinRTCrypto.CryptographicEngine.Decrypt(key, data, iv); 
     return Convert.ToBase64String(cipherText); 
    } 

回答

1

我終於解決了這個問題。問題在於文本編碼。使用正確的編碼解決了問題。下面的工作代碼:

public static string EncryptAES(string content, string password) 
    { 
     byte[] keyMaterial = Encoding.UTF8.GetBytes(password); 
     byte[] data = Encoding.UTF8.GetBytes(content); 
     byte[] iv = new byte[keyMaterial.Length]; 
     var provider = WinRTCrypto.SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithm.AesCbcPkcs7); 
     var key = provider.CreateSymmetricKey(keyMaterial); 
     byte[] cipherText = WinRTCrypto.CryptographicEngine.Encrypt(key, data, iv); 
     return Convert.ToBase64String(cipherText); 
    } 

    public static string DecryptAES(string content, string password) 
    { 
     byte[] keyMaterial = Encoding.UTF8.GetBytes(password); 
     byte[] data = Convert.FromBase64String(content); 
     byte[] iv = new byte[keyMaterial.Length]; 
     var provider = WinRTCrypto.SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithm.AesCbcPkcs7); 
     var key = provider.CreateSymmetricKey(keyMaterial); 
     byte[] cipherText = WinRTCrypto.CryptographicEngine.Decrypt(key, data, iv); 
     return Encoding.UTF8.GetString(cipherText, 0, cipherText.Length); 
    } 

WinRTCrypto可作爲PCLCrypto一部分。