2016-11-16 74 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一部分。