2013-11-30 3 views
8

Я новичок в C#, и мне действительно нужна помощь. Мне нужно, чтобы зашифровать/расшифровать строку с AES-256-CBC в C#, я нашел это для шифрования строки:Как расшифровать зашифрованную строку AES-256-CBC

public static string EncryptString(string message, string KeyString, string IVString) 
    { 
     byte[] Key = ASCIIEncoding.UTF8.GetBytes(KeyString); 
     byte[] IV = ASCIIEncoding.UTF8.GetBytes(IVString); 

     string encrypted = null; 
     RijndaelManaged rj = new RijndaelManaged(); 
     rj.Key = Key; 
     rj.IV = IV; 
     rj.Mode = CipherMode.CBC; 

     try 
     { 
      MemoryStream ms = new MemoryStream(); 

      using (CryptoStream cs = new CryptoStream(ms, rj.CreateEncryptor(Key, IV), CryptoStreamMode.Write)) 
      { 
       using (StreamWriter sw = new StreamWriter(cs)) 
       { 
        sw.Write(message); 
        sw.Close(); 
       } 
       cs.Close(); 
      } 
      byte[] encoded = ms.ToArray(); 
      encrypted = Convert.ToBase64String(encoded); 

      ms.Close(); 
     } 
     catch (CryptographicException e) 
     { 
      Console.WriteLine("A Cryptographic error occurred: {0}", e.Message); 
      return null; 
     } 
     catch (UnauthorizedAccessException e) 
     { 
      Console.WriteLine("A file error occurred: {0}", e.Message); 
      return null; 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("An error occurred: {0}", e.Message); 
     } 
     finally 
     { 
      rj.Clear(); 
     } 
     return encrypted; 
    } 

Я попытался написать функцию расшифровывать базы на коде выше, следующий код, что Я сделал:

// Decrypt a byte array into a byte array using a key and an IV 
     private byte[] Decrypt(byte[] cipherData, byte[] Key, byte[] IV) 
     { 
      byte[] decryptedData; 
      //string plaintext = null; 
      //MemoryStream ms = new MemoryStream(cipherData); 

      RijndaelManaged alg = new RijndaelManaged(); 
    alg.KeySize = 256; 
      alg.BlockSize = 128; 
      alg.Key = Key; 
      alg.IV = IV; 
      alg.Mode = CipherMode.CBC; 
      alg.Padding = PaddingMode.Zeros; 

      //Array.Copy(Key, 0, IV, 0, IV.Length); 

      ICryptoTransform decryptor = alg.CreateDecryptor(alg.Key, alg.IV); 

      using(MemoryStream ms = new MemoryStream(cipherData)) 
      { 
       using (CryptoStream csDecrypt = new CryptoStream(ms, decryptor, CryptoStreamMode.Read)) 
       { 
        using (StreamReader sw = new StreamReader(csDecrypt)) 
        { 
         sw.ReadToEnd(); 
         sw.Close(); 
        } 

        csDecrypt.Close(); 
        decryptedData = ms.ToArray(); 
       } 
      } 

      //byte[] decryptedData = System.Text.Encoding.Unicode.GetBytes(plaintext); 
      return decryptedData; 
     } 

Но это вздор, он ничего не может расшифровать. Я действительно смущен и нуждаюсь в помощи. Спасибо за любую помощь!

P/s: Пожалуйста, не давайте мне другие подобные ответы на вопросы, я уже смотрю на них. Их функция шифрования не имеет того же выхода, что и вышеупомянутая функция шифрования, в то время как мне нужно расшифровать строку, которая ДОЛЖНА быть зашифрована указанной выше функцией. У меня есть двое друзей, которые писали дешифровку в PHP и объектно-C, которые соответствовали вышеуказанной функции шифрования, плохо, если бы они снова это сделали.

+2

Ваше шифрование дает строку base64 в качестве вывода, но ваш расшифровка принимает байтовый массив в качестве входных данных. Как вы преобразовываете строку в массив байтов перед расшифровкой? –

ответ

5

Глядя на ваше шифрование, что-то вроде этого должно это сделать, передача результирующей строки с вашего шифрования должна вернуть исходную строку;

// Decrypt a string into a string using a key and an IV 
public static string Decrypt(string cipherData, string keyString, string ivString) 
{ 
    byte[] key = Encoding.UTF8.GetBytes(keyString); 
    byte[] iv = Encoding.UTF8.GetBytes(ivString); 

    try 
    { 
     using (var rijndaelManaged = 
       new RijndaelManaged {Key = key, IV = iv, Mode = CipherMode.CBC}) 
     using (var memoryStream = 
       new MemoryStream(Convert.FromBase64String(cipherData))) 
     using (var cryptoStream = 
       new CryptoStream(memoryStream, 
        rijndaelManaged.CreateDecryptor(key, iv), 
        CryptoStreamMode.Read)) 
     { 
      return new StreamReader(cryptoStream).ReadToEnd(); 
     } 
    } 
    catch (CryptographicException e) 
    { 
     Console.WriteLine("A Cryptographic error occurred: {0}", e.Message); 
     return null; 
    } 
    // You may want to catch more exceptions here... 
} 

Небольшая записка; вы получаете ключ, используя кодировку UTF8 из ключевой строки, кодировка UTF8 может дать вам несколько байтов для международных символов, что может дать ключ или IV неправильной длины для шифрования/дешифрования. Кроме того, использование небольшого диапазона паролей/ключей с 8 символами и печатными символами не даст вам очень безопасного шифрования, вы можете запустить строку, хотя SHA1 или аналогичную, прежде чем использовать ее в качестве ключа (что, к сожалению, сделает ее несовместимой с текущее шифрование)

+0

Он работал как шарм, большое вам спасибо! – Mee

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