2017-01-18 2 views
2

У меня был простой класс для создания базового локального шифрования для Windows Phone 8. Я снова хотел использовать этот класс в новом приложении Windows 10 для Windows Store. К сожалению, я больше не могу использовать класс AesManaged.UWP: шифрование и дешифрование AES

Я попытался использовать Windows.Security.Cryptography.Core, но я полностью застрял. Это оригинальный класс, который я использовал для Windows Phone 8. Тогда я должен был найти его где-то в Интернете.

using System.Security.Cryptography; 

namespace TestGame 

{ 
    public class AesEnDecryption 
    { 
     private string AES_Key = "MYLiSQ864FhDevJOeMs9EVp5RmfC7OuH"; 
     private string AES_IV = "FoL5Tyd9sZclVn5A"; 

     public string AES_encrypt(string Input) 
     { 
      var aes = new AesManaged(); 
      aes.KeySize = 128; 
      aes.BlockSize = 128; 
      aes.Key = Convert.FromBase64String(AES_Key); 
      aes.IV = Encoding.UTF8.GetBytes(AES_IV); 

      var encrypt = aes.CreateEncryptor(aes.Key, aes.IV); 
      byte[] xBuff = null; 
      using (var ms = new MemoryStream()) 
      { 
       using (var cs = new CryptoStream(ms, encrypt, CryptoStreamMode.Write)) 
       { 
        byte[] xXml = Encoding.UTF8.GetBytes(Input); 
        cs.Write(xXml, 0, xXml.Length); 
       } 

       xBuff = ms.ToArray(); 
      } 

      string Output = Convert.ToBase64String(xBuff); 
      return Output; 
     } 

     public string AES_decrypt(string Input) 
     { 
      var aes = new AesManaged(); 
      aes.KeySize = 128; 
      aes.BlockSize = 128; 
      aes.Key = Convert.FromBase64String(AES_Key); 
      aes.IV = Encoding.UTF8.GetBytes(AES_IV); 

      var decrypt = aes.CreateDecryptor(); 
      byte[] xBuff = null; 
      using (var ms = new MemoryStream()) 
      { 
       using (var cs = new CryptoStream(ms, decrypt, CryptoStreamMode.Write)) 
       { 
        byte[] xXml = Convert.FromBase64String(Input); 
        cs.Write(xXml, 0, xXml.Length); 
       } 

       xBuff = ms.ToArray(); 
      } 

      string Output = Encoding.UTF8.GetString(xBuff, 0, xBuff.Length); 

      return Output; 
     } 
    } 
} 

Кто-нибудь знает, как перевести это для приложений Windows 10WWW?

Спасибо!

+0

Если вы используете .NET Core, попробуйте 'Aes.Create()' вместо 'new AesManaged()' – bartonjs

+1

** Никогда ** повторно использовать IV; всегда используйте новый IV для каждого зашифрованного сообщения. И это предполагает, что ключ на самом деле не жестко закодирован, а передан как аргумент для каждого пользователя или что-то еще. Их * оба * hardcoded просто просты ... «не умные». – RobIII

ответ

2

Вы должны прочитать документацию о SymmetricAlgorithmProvider и CryptographicEngine.

У меня вот маленький пример, как использовать их вместе:

using System; 
using System.Linq; 
using System.Runtime.InteropServices.WindowsRuntime; 
using System.Text; 
using Windows.Security.Cryptography; 
using Windows.Security.Cryptography.Core; 
using Windows.Storage.Streams; 

namespace CryptTest 
{ 
    public class AesEnDecryption 
    { 

     // Key with 256 and IV with 16 length 
     private string AES_Key = "Y+3xQDLPWalRKK3U/JuabsJNnuEO91zRiOH5gjgOqck="; 
     private string AES_IV = "15CV1/ZOnVI3rY4wk4INBg=="; 
     private IBuffer m_iv = null; 
     private CryptographicKey m_key; 

     public AesEnDecryption() 
     { 

      IBuffer key = Convert.FromBase64String(AES_Key).AsBuffer(); 
      m_iv = Convert.FromBase64String(AES_IV).AsBuffer(); 
      SymmetricKeyAlgorithmProvider provider = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbcPkcs7); 
      m_key = provider.CreateSymmetricKey(key); 
     } 

     public byte[] Encrypt(byte[] input) 
     { 

      IBuffer bufferMsg = CryptographicBuffer.ConvertStringToBinary(Encoding.ASCII.GetString(input), BinaryStringEncoding.Utf8); 
      IBuffer bufferEncrypt = CryptographicEngine.Encrypt(m_key, bufferMsg, m_iv); 
      return bufferEncrypt.ToArray(); 
     } 

     public byte[] Decrypt(byte[] input) 
     { 
      IBuffer bufferDecrypt = CryptographicEngine.Decrypt(m_key, input.AsBuffer(), m_iv); 
      return bufferDecrypt.ToArray(); 
     } 
    } 
} 

Если вы хотите использовать другой алгоритм, то AesCbcPkcs7, то вы необходимо изменить SymmetricAlgorithmName

+0

Большое спасибо. Я пробовал вот так: private void EncryptButton_Click (отправитель объекта, RoutedEventArgs e) { AesEnDecryption endec = new AesEnDecryption(); byte [] toEncrypt = Encoding.ASCII.GetBytes ("abcdefghijklmnopqrstuvwxyz"); byte [] encrypted = endec.Encrypt (array); } Но на линии: Буфер IBufferEncrypt = CryptographicEngine.Encrypt (m_key, bufferMsg, m_iv); Я получаю следующее сообщение об ошибке: поставляемый пользовательский буфер недействителен для запрошенной операции. (Исключение из HRESULT: 0x800706F8). Я пробовал разные длины для toEncrypt (16, 32, 64, 128, 192). – Robin

+0

Извините за плохой макет моего предыдущего комментария :( – Robin

+0

Я попробую его позже. И обновите свой ответ – TheTanic

Смежные вопросы