Шифрование строковых данных

Тема в разделе ".NET", создана пользователем EuGenius, 2 апр 2007.

  1. EuGenius

    EuGenius Гость

    Как шифровать строкив в C#? Желательно встроенными средствами.
    Вроде есть такие методы - RSA, MD5, AES, BlowFish, RC2, RC5, RC6
    Дайте примеры. у кого есть.
    Благодарю.
     
  2. NikSoft

    NikSoft Гость

  3. Pasha

    Pasha Гость

    Смотри System.Security.Cryptography.
     
  4. NikSoft

    NikSoft Гость

    Зачем говорить об очевидных вещах?
     
  5. EuGenius

    EuGenius Гость

  6. Pasha

    Pasha Гость

    <!--QuoteBegin-NikSoft+2:04:2007, 10:12 -->
    <span class="vbquote">(NikSoft @ 2:04:2007, 10:12 )</span><!--QuoteEBegin-->Зачем говорить об очевидных вещах?
    [snapback]60920" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Чтобы люди наконец-то научились пользоватся гуглом.
     
  7. Real-Mulik

    Real-Mulik Гость

    Не знаю нужен ли или нет.. вот готовый класс для шифрования методом Rijndael... тока ключи меняй ;)

    Код (Text):
    public class SecutityPassword:IDisposable
    {
    private RijndaelManaged Transformer = new RijndaelManaged();

    public SecutityPassword()
    {
    Transformer.IV = new byte[] { 12, 23, 34, 66, 56, 67, 78, 1, 1, 5, 22, 05, 67, 23, 89, 1 };
    Transformer.Key = new byte[] { 02, 58, 94, 254, 3, 3, 3, 1, 54, 65, 34, 34, 45, 65, 77, 100, 02, 58, 94, 22, 43, 3, 53, 1, 54, 65, 34, 34, 45, 65, 77, 100 };
    }
    public string Coding(string SourceText)
    {
    try
    {
    byte[] toCode = Encoding.ASCII.GetBytes(SourceText);
    ICryptoTransform Itrans = Transformer.CreateEncryptor(Transformer.Key, Transformer.IV);
    MemoryStream buffer = new MemoryStream();
    CryptoStream CryptoBuffer = new CryptoStream(buffer, Itrans, CryptoStreamMode.Write);
    CryptoBuffer.Write(toCode, 0, toCode.Length);
    CryptoBuffer.FlushFinalBlock();
    byte[] result = buffer.ToArray();
    return Convert.ToBase64String(result);
    }
    catch (Exception)
    {
    return SourceText;
    }
    }
    public string Decoding(string SourceText)
    {
    try
    {
    byte[] tmp2 = Convert.FromBase64String(SourceText);
    ICryptoTransform Idec = Transformer.CreateDecryptor(Transformer.Key, Transformer.IV);
    MemoryStream buffer = new MemoryStream();
    CryptoStream CryptoBuffer = new CryptoStream(buffer, Idec, CryptoStreamMode.Write);
    CryptoBuffer.Write(tmp2, 0, tmp2.Length);
    CryptoBuffer.FlushFinalBlock();
    byte[] Decripted = buffer.ToArray();
    return Encoding.ASCII.GetString(Decripted);
    }
    catch (Exception)
    {
    return SourceText;
    }
    }

    #region IDisposable Members

    public void Dispose()
    {
    Transformer.Clear();
    }

    #endregion
    }
     
  8. karlito

    karlito Гость

    Печально. Руки и ноги поотрывал бы за такой код, извините, за грубость.

    Как часто мы используем вещи, суть которых не понимаем. Как часто бы люди пишут код, который, главное, чтобы работал. Но как только системы чуть-чуть начинают давать сбои, начинают закрываться целые проекты - из-за невозможности обнаружить, фиксировать, исправить ошибки, либо больших лбов начинают приглашать, чтобы разрулить ситуацию. Печально.

    Я всем программерам говорю и ещё раз повторю: несите ответственность за каждую строчку кода, что пришите, думайте над каждой строчкой прежде чем написать её.

    Найти и поправить ошибки в своём коде предлагаю автору и стопроцентная гарантия, что если автор их сам найдёт, то запомнит надолго.

    Это первое, что программер должен уметь.
     
  9. NikSoft

    NikSoft Гость

    Да, это первое условие.
    Затем - знание алгоритмов и приемов разработки ПО.
    А это - дело десятое
     
  10. Real-Mulik

    Real-Mulik Гость

    <!--QuoteBegin-karlito+13:04:2007, 23:35 -->
    <span class="vbquote">(karlito @ 13:04:2007, 23:35 )</span><!--QuoteEBegin-->Найти и поправить ошибки в своём коде предлагаю автору и стопроцентная гарантия, что если автор их сам найдёт, то запомнит надолго.
    [snapback]62399" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Я прошу прощения.. я самоучка в .NET и нигде этому не обучался... потому не могу претендавать на однозначно правильный и полный код... в данно классе я не прусмотрел много чего, однако я точно знаю и несу <!--QuoteBegin-karlito+13:04:2007, 23:35 -->
    <span class="vbquote">(karlito @ 13:04:2007, 23:35 )</span><!--QuoteEBegin-->ответственность за каждую строчку
    [snapback]62399" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    т.к. разбирал это пример по строчно.... Если осмотреть код критично, то можно найти много ошибок и неточностей.. однако всего предусмотреть невозможно... и я буду очень вам признателен если вы, ну елси не укажите на ошибки, то хотябы намекнете с какой стороны смотреть .. (неправильное приминение функций, неверный алгоритм....)

    Посути тут и общаются люди для обемна опытом.

    P.S. Да и я признаю совю ошибку точно, это не готовый класс а выступает в качестве пример как работающий в опредленных условиях кодировщик строк.
     
  11. karlito

    karlito Гость

    Для: Real-Mulik

    Проблемы твоего кода:
    * обработка исключений - выкинь её всю из этого класса. клиент класса должен знать, что происходит. он будет заниматься обработкой исключений
    * закрытие ресурсов сразу по окончанию их работы
    * внутреннее поле и IDisposable интерфейс не нужен здесь, обычно клиенты этого класса не будут шифровать, а потом сразу же дешифровать данные. Отработал методик по шифрованию/дешифрованию и закрыл всё за собой
    * ключик и вектор шифрования дай клиенту задать свои

    Переименовать сам класс и методы и можно продавать. :)

    Перепиши и посмотрим
     
  12. Pasha

    Pasha Гость

    А еще нечто похожее есть в MSDN, в статье по классу RijndaelManaged.
     
  13. Real-Mulik

    Real-Mulik Гость

    Вот спасибо! вот реально ответили! теперь буду знать! В принципе все доганал, только один момент, почему не надо IDisposable реализовывать, я его специально реализовал чтобы можно было бы использовать using конструкцию...
     
  14. Pasha

    Pasha Гость

    <!--QuoteBegin-Real-Mulik+23:04:2007, 17:26 -->
    <span class="vbquote">(Real-Mulik @ 23:04:2007, 17:26 )</span><!--QuoteEBegin-->В принципе все доганал, только один момент, почему не надо IDisposable реализовывать, я его специально реализовал чтобы можно было бы использовать using конструкцию...
    [snapback]63168" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    MSDN:
    IDisposable.Dispose Method: Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
    Твой класс использует unmanaged resources?

    Конструкция using - это просто способ явно вызвать Dispose.
     
  15. karlito

    karlito Гость

    Для: Pasha
    Не верь всему, что в MSDN написано.

    Я бы немного перефразировал.
    Если у тебя есть в классе внутренние поля, реализующие IDisposable интерфейс, то класс также должен реализовать IDisposable интерфейс, в Dispose методе которого вызываются все Dispose методы на внутренних полях. Но если в классе идёт работа с неуправляемыми ресурсами, которые необходимо закрывать при 'убитии' объекта, то здесь дополнительно на сцену вместе с IDisposable интерфейсом выплывает Finalizer метод, цель которого - "ну, не заставишь ты клиентов твоего класса всегда вызывать Dispose метод по окончании работы с оним, а утечка ресурсов недопустима".


    НЕЯВНО вызвать Dispose.
     
  16. Pasha

    Pasha Гость

    <!--QuoteBegin-karlito+25:04:2007, 00:28 -->
    <span class="vbquote">(karlito @ 25:04:2007, 00:28 )</span><!--QuoteEBegin-->Не верь всему, что в MSDN написано.
    [snapback]63368" rel="nofollow" target="_blank[/snapback]​
    [/quote]Ну, про Dispose в MSDN все правильно написано. Я просто надеялся, что после упоминания MSDN автор кода не поленится почитать статьи [snapback]63368" rel="nofollow" target="_blank[/snapback]</div>[/quote]Так вот всегда и вызывать? А если Dispose был вызван из финалайзера? Ты можешь гарантировать что для внутренних disposable полей финалайзеры еще не былы вызваны? Вобщем, получишь в результате код из серии "happy debugging" который иногда падает, но почему, и в каком именно месте - никто не знает.
     
  17. karlito

    karlito Гость

    Для: Pasha
    Можете рассматривать как шаблон проектирования. Dispose метод должен быть устойчив к вызову его несколько раз. Очень часто разработчики пишут:
    using(SqlConnection connection = ...)
    {
    ...
    connection.Close();
    }
    Такой код не должен падать.

    А теперь представьте, что вы пишете обёртку, допустим, вокруг SqlConnection. Само соединение является внутренним полем вашей обёртки. Пользователь после работы с этой обёрткой ДОЛЖЕН иметь возможность закрыть все ресурсы, с которыми он работал. Как такое сделать? А если явно ничего не закрыл, то ресурсы, опять же, должны быть закрыты.

    Поэтому полностью несогласен с выше указанным выражением. Хотя может быть бывают иногда исключения. Совсем редко и в слишком специфической задаче.
     
  18. Pasha

    Pasha Гость

    <!--QuoteBegin-karlito+27:04:2007, 18:58 -->
    <span class="vbquote">(karlito @ 27:04:2007, 18:58 )</span><!--QuoteEBegin-->А теперь представьте, что вы пишете обёртку, допустим, вокруг SqlConnection. Само соединение является внутренним полем вашей обёртки. Пользователь после работы с этой обёрткой ДОЛЖЕН иметь возможность закрыть все ресурсы, с которыми он работал. Как такое сделать? А если явно ничего не закрыл, то ресурсы, опять же, должны быть закрыты.
    [snapback]63794" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Рассмотрим следующую ситуацию:
    Вы написали обертку, которая в своем методе Finalize вызывает Dispose, Dispose вызывает this.innerField.Dispose(). Пользователь использовал вашу обертку без конструкции using и явного вызова Dispose. Сборщик мусора вызывает финалайзеры.
    <!--QuoteBegin-Implementing a Dispose Method+-->
    <span class="vbquote">(Implementing a Dispose Method)</span><!--QuoteEBegin-->When an object is executing its finalization code, it should not reference other objects, because finalizers do not execute in any particular order. If an executing finalizer references another object that has already been finalized, the executing finalizer will fail.[/quote]
    <!--QuoteBegin-Object.Finalize+-->
    <span class="vbquote">(Object.Finalize)</span><!--QuoteEBegin-->The finalizers of two objects are not guaranteed to run in any specific order, even if one object refers to the other. That is, if Object A has a reference to Object B and both have finalizers, Object B might have already finalized when the finalizer of Object A starts.[/quote]
    И вот совершенно непреднамеренно он финализирует сначала innerField, а потом уже вашу обертку. И обертка падает со страшным ексепшеном на строчке this.innerField.Dispose().
    UPD: ну, может не падает явно, с сообщением об ошибке - исключения в финалайзерах глушатся. Но то, что методы Dispose и Finalize не отработают до конца - это гарантировано.
    <!--QuoteBegin-karlito+27:04:2007, 18:58 -->
    <span class="vbquote">(karlito @ 27:04:2007, 18:58 )</span><!--QuoteEBegin-->Поэтому полностью несогласен с выше указанным выражением. Хотя может быть бывают иногда исключения. Совсем редко и в слишком специфической задаче.
    [snapback]63794" rel="nofollow" target="_blank[/snapback]​
    [/quote]Вы совершенно не согласны сразу с двумя статьями из MSDN, на которые я дал ссылки в предыдущем сообщении? Или считаете сборку мусора редкой операцией?
     
  19. karlito

    karlito Гость

    Одно правило забыли. Вернее даже написали о нём, но видно немножко не поняли (When an object is executing its finalization code, it should not reference other objects).
    В методе Finalize должны закрываться только неуправляемые ресурсы.
    Dispose не должен вызываться из Finalize. Это не идентичные методы. Dispose работает и с управляемыми и неуправляемыми ресурсами, а Finalize только с неуправляемыми. Microsoft даже предложила шаблон для реализации вашего класса для корректного и надёжного закрытия ресурсов.
    Этот шаблон широко применяется в BCL и способен к расширению.
    Код (Text):
    public class SomeClass : IDisposable
    {
    public void Dispose()
    {
    Dispose(true);
    GC.SuppressFinalize(this);
    }

    public void Dispose(bool disposing)
    {
    if (!disposing)
    {
    // закрываем управляемые ресурсы
    }
    // закрываем неуправляемые
    }

    ~SomeClass()
    {
    Dispose(false);
    }
    }
    Всё ставьте под сомнение, даже свои знания. Но не с этим был несогласен. А вот с этим выражением. В чём здесь ошибка, думаю поняли.
    Программист должен писать код, который будет работать неважно 1000 раз/сек или 1 раз/неделю будет происходить сборака мусора.
     
  20. Pasha

    Pasha Гость

    <!--QuoteBegin-karlito+29:04:2007, 15:33 -->
    <span class="vbquote">(karlito @ 29:04:2007, 15:33 )</span><!--QuoteEBegin-->Всё ставьте под сомнение, даже свои знания. Но не с этим был несогласен. А вот с этим выражением. В чём здесь ошибка, думаю поняли.
    [snapback]63934" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Нет, не понял. Я написал, что не всегда надо вызывать Dispose для внутренних полей. Это не так?
    :(
    Судя по сообщениям, мы имеем в виду разный Dispose. Я - тот, который вызывается и из финалайзера, и из IDisposabel.Dispose.

    Но пробелма вообще не в этом. Проблема в том, что ресурсы надо явно освобождать сразу же после использования, а не ждать, что добрый юзер напишет using или dispose. А в мегакоде выше не понятно, вызовется ли Transformer.Clear() при сборке мусора, или ценнейшие данные так и останутся лежать в куче.
     
Загрузка...

Поделиться этой страницей