Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Шифрование


Автор: WERITAS 25.12.2007, 19:46
Доброго времени суток! Помогите пожалуйста с шифрованием в NET. Вот-с накидал такой вот код:
Код

using System.IO;
using System.Security.Cryptography;
namespace WinAppCryptoExample
{
    public partial class Form1 : Form
    {
        public RijndaelManaged des = new RijndaelManaged();

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            FileStream fs = new FileStream(Application.StartupPath + "\\pass.dat", FileMode.Create, FileAccess.Write);
            CryptoStream cs = new CryptoStream(fs, des.CreateEncryptor(), CryptoStreamMode.Write);
            byte[] mass = Encoding.ASCII.GetBytes(textBox1.Text);
            cs.Write(mass, 0, mass.Length);
            cs.Close();
            fs.Close();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            string result = null;
            FileStream fs = new FileStream(Application.StartupPath + "\\pass.dat", FileMode.Open, FileAccess.ReadWrite);
            CryptoStream cs = new CryptoStream(fs, des.CreateDecryptor(), CryptoStreamMode.Read);
            if (fs.Length > 0)
            {
                byte[] mass = new byte[fs.Length];
                cs.Read(mass, 0, (int)fs.Length);
                result = Encoding.ASCII.GetString(mass);
            }
            else result = "";
            cs.Close();
            fs.Close();
            textBox2.Text = result;
        }
    }
}

Если последовательно нажимать кнопки 1 и 2, то всё работает. А вот когда нужно просто дешифровать из файла: нажимаю кнопку 2 и приложение вылетает. Как такое исправить?

Автор: tol05 25.12.2007, 20:00
а ты мануал по RijndaelManaged почитай smile

метод CreateDecryptor() без параметров требует, чтобы свойства уже были установлены. 
Цитата

Creates a symmetric decryptor object with the current Key property and initialization vector (IV). 

а где ты их устанавливаешь? Нигде. Поэтому и не работает. Выход - в конструкторе их создать и запомнить как поля класса, например.

а почему работает
Цитата(WERITAS @  25.12.2007,  18:46 Найти цитируемый пост)
Если последовательно нажимать кнопки 1 и 2

опять читаем мануал, но уже про CreateEncryptor() 
Цитата

Creates a symmetric encryptor object with the current Key property and initialization vector (IV). 

Цитата

If the current Key property is a null reference (Nothing in Visual Basic), the GenerateKey method is called to create a new random Key. If the current IV property is a null reference (Nothing in Visual Basic), the GenerateIV method is called to create a new random IV.

т.е. при создании Encryptor-а поля твоего des инициализируются и используются позднее, при работе CreateDecryptor()

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)