2016-11-16 23 views
1

Windows Phone 8.1のアプリケーションで128ビットAES暗号化を行う必要があります。私はそれぞれデータの暗号化と復号化に次のコードを使用しました:しかし、暗号化と復号化が正しく機能していないようです。これは、いくつかのUnicode文字に暗号化し、復号化にクラッシュを投げてきている。AES暗号化Windows Phone 8.1

長はブロックサイズの倍数ではなく、パディングが を選択されていない\ rを\名前nParameter:暗号文

何私はここで間違っていますか?誰かが助けてくれますか?

EDIT

Googleとのより多くの時間が経過した後、私は、暗号化と復号化のために、以下の方法を見つけましたが、彼らはどちらか動作するようには思えません。 EDIT 2

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; 
     } 
    } 

は、最後に正常に動作し、暗号化を得ることができたが、私は渡していエンコーディングが正しいものではありませんので、解読はまだおそらく動作していない:

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); 
    } 

WinRTCryptoPCLCryptoの一部として利用可能です。