2012-01-03 3 views
-3

Это метод для шифрования текста и возвращает зашифрованный текст:C метод # шифрования не работает

public static string Encrypt(this string clearText, CryptologyMethod method) 
{ 
    ICryptoTransform cryptoTransform = null; 
    switch (method) 
    { 
     case CryptologyMethod.TripleDes: 
      cryptoTransform = new TripleDESCryptoServiceProvider().CreateEncryptor(Config.TripleDesKey, Config.TripleDesIV); 
      break; 
     case CryptologyMethod.AES: 
      cryptoTransform = new AesCryptoServiceProvider().CreateEncryptor(Config.AesKey, Config.AesIV); 
      break; 
    } 
    using (MemoryStream memoryStream = new MemoryStream()) 
    { 
     using (CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoTransform, CryptoStreamMode.Write)) 
     { 
      using (StreamWriter streamWriter = new StreamWriter(cryptoStream)) 
      { 
       streamWriter.Write(clearText); 
       cryptoStream.FlushFinalBlock(); 
       return memoryStream.Text(); 
      } 
     } 
    } 
} 

public enum CryptologyMethod 
{ 
    TripleDes, 
    AES 
} 

Text() является метод расширения, чтобы прочитать содержимое потока:

public static string Text(this Stream stream) 
{ 
    return new StreamReader(stream).ReadToEnd(); 
} 

Кроме того, Config.TripleDesKey и другие свойства возвращают массив байтов, считанных из файла конфигурации.

Проблема заключается в том, что, когда я использую этот метод расширения, то результат всегда пустая строка:

строка зашифрованного текста = «некоторые чистый текст» .Encrypt (CryptologyMethod.TripleDes); // cipherText пуст

+0

Пожалуйста, почему downvote? –

+0

Я не спускал вниз - но: в чем проблема? ошибка компилятора? «неправильное» шифрование? – Yahia

+8

Для кого-то, у которого почти 5 тыс. Репутации, вы не знаете, как задать вопрос. Какова ошибка, каков вход, каков ожидаемый результат? Вы понимаете, что вам нужно сбросить свою позицию после заполнения? – leppie

ответ

2

Я думаю, что у меня был этот вопрос раньше, решение было довольно очевидным, как только я понял это и полностью непрозрачно до этого.

Проблема была в том, что ReadToEnd относительна, как в «от текущего местоположения до конца». Проблема в том, что «текущая позиция» уже «закончилась», потому что я только что закончил писать до конца потока. Поэтому я исправлю вашу проблему следующим образом:

public static string Text(this Stream stream) 
{ 
    stream.Position = 0 
    return new StreamReader(stream).ReadToEnd(); 
} 

Работал для меня с аналогичной проблемой, надеюсь, что это поможет.

+0

Thats точно, как я исправил это тоже: http://rextester.com/FPLA30520 – Jamiec

+0

Почему он производит некоторые '?' Метки в бриллиантах? Также, когда я хочу расшифровать его с помощью одного и того же ключа, он говорит: * Длина данных для дешифрования недопустима *. –

+0

Это звучит как совершенно другая проблема. Означает ли это, что вы теперь исправили поток? – Task

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