2014-12-13 2 views
1

Я пытаюсь расшифровать с помощью этой функции, но я не уверен, что является причиной его неисправностьAesCryptoServiceProvider расшифровать

public string Decrypt(byte[] cipherText, byte[] IV, byte[] key) 
    { 

     using (AesCryptoServiceProvider AESDecrypt = new AesCryptoServiceProvider()) 
     { 

      //here we set the key and IV instead having the class generate them. 
      AESDecrypt.IV = IV; 
      AESDecrypt.Key = key; 

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

      using (MemoryStream msDecrypt = new MemoryStream(cipherText)) 
      { 
       using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, 
        decryptor, CryptoStreamMode.Read)) 
       { 
        using (StreamReader srDecrypt = new StreamReader(csDecrypt)) 
        { 
         csDecrypt.Flush(); 
         plainText = srDecrypt.ReadToEnd(); 
         return plainText; 
        } 
       } 
      } 
     } 

    } 

возвращает открытый текст, пустую строку. Ключ и IV являются системой, сгенерированной в предыдущей функции и передаются правильно.

+1

Когда вы открываете свой 'StreamReader', это msDecrypt/cipherText длины, которые вы ожидаете от них? Я делаю это только с потоками, а не с byte [], но попробовали ли вы проверить положение потока msDecrypt (когда вы открываете считыватель потоков?). Он должен находиться в позиции 0. – ne1410s

+1

Вы помываете метод шифрования? Проверьте длину зашифрованного текста в начале вашего метода и выбросьте исключение, если оно равно нулю. Используя код шифрования, который вы использовали в предыдущем потоке, если вы не реализовали Flush() правильно, у вас может быть массив байтов с нулевой длиной. –

+1

Удалите флеш, посмотрите, работает ли он. Если у вас всего 16 байтов зашифрованного текста, может быть, что сам открытый текст состоит из 0 байтов (или, если вы просто распечатываете его, из непечатаемых символов). В этом случае у вас есть только блок из 16 заполняющих байтов. –

ответ

0

Я неправильно прочитал ответ первого вопроса и использовал .flushfinalblock, чтобы заставить его вернуть «зашифрованный текст», не обращаясь к основной проблеме. Когда я переместил шифр = msEncrypt.ToArray(); вне криптового потока он работал отлично. И удалил .flush(). .FacePalm()