|
При выполнении в лабораторной работе упражнения №1 , а именно при выполнении нижеследующего кода: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using Microsoft.Xna.Framework.Graphics;
namespace Application1 { public partial class MainForm : Form { // Объявим поле графического устройства для видимости в методах GraphicsDevice device;
public MainForm() { InitializeComponent();
// Подпишемся на событие Load формы this.Load += new EventHandler(MainForm_Load);
// Попишемся на событие FormClosed формы this.FormClosed += new FormClosedEventHandler(MainForm_FormClosed); }
void MainForm_FormClosed(object sender, FormClosedEventArgs e) { // Удаляем (освобождаем) устройство device.Dispose(); // На всякий случай присваиваем ссылке на устройство значение null device = null; }
void MainForm_Load(object sender, EventArgs e) { // Создаем объект представления для настройки графического устройства PresentationParameters presentParams = new PresentationParameters(); // Настраиваем объект представления через его свойства presentParams.IsFullScreen = false; // Включаем оконный режим presentParams.BackBufferCount = 1; // Включаем задний буфер // для двойной буферизации // Переключение переднего и заднего буферов // должно осуществляться с максимальной эффективностью presentParams.SwapEffect = SwapEffect.Discard; // Устанавливаем размеры заднего буфера по клиентской области окна формы presentParams.BackBufferWidth = this.ClientSize.Width; presentParams.BackBufferHeight = this.ClientSize.Height;
// Создадим графическое устройство с заданными настройками device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, DeviceType.Hardware, this.Handle, presentParams); }
protected override void OnPaint(PaintEventArgs e) { device.Clear(Microsoft.Xna.Framework.Graphics.Color.CornflowerBlue);
base.OnPaint(e); } } } Выбрасывается исключение: Невозможно загрузить файл или сборку "Microsoft.Xna.Framework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d" или один из зависимых от них компонентов. Не удается найти указанный файл. Делаю все пунктуально. В чем может быть проблема? |
Работа с потоками данных
Пример 2. Поток CryptoStream и шифрование в файл
В данном примере мы разработаем диалоговое приложение Windows Forms, иллюстрирующее работу алгоритмов шифрования/дешифрования в файл. Вернее, приложение уже разработано и ниже приводятся его составляющие, с которыми нужно разобраться самостоятельно. Но прежде нужно собрать приложение полностью и только потом испытывать, иначе посыпятся ошибки! Итак, собираем...
-
Добавьте к решению CryptoStream новый проект с именем Demo2 и назначьте его стартовым
-
В панели Solution Explorer откройте интерфейсный файл Form1.Designer.cs и заполните его следующим кодом (приводится полностью)
namespace Demo2
{
partial class Form1
{
private System.ComponentModel.IContainer components = null;
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
private void InitializeComponent()
{
this.cmbCodec = new System.Windows.Forms.ComboBox();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.txtSourceFile = new System.Windows.Forms.TextBox();
this.btnSelectFile = new System.Windows.Forms.Button();
this.txtDestinationDir = new System.Windows.Forms.TextBox();
this.btnDestinationDir = new System.Windows.Forms.Button();
this.label4 = new System.Windows.Forms.Label();
this.txtKey = new System.Windows.Forms.TextBox();
this.btnClose = new System.Windows.Forms.Button();
this.numKeySize = new System.Windows.Forms.NumericUpDown();
this.numBlockSize = new System.Windows.Forms.NumericUpDown();
this.label5 = new System.Windows.Forms.Label();
this.label6 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.btnEncrypt = new System.Windows.Forms.Button();
this.btnDecrypt = new System.Windows.Forms.Button();
this.btnShowFile = new System.Windows.Forms.Button();
this.btnNewFile = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.numKeySize)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numBlockSize)).BeginInit();
this.SuspendLayout();
//
// cmbCodec
//
this.cmbCodec.FormattingEnabled = true;
this.cmbCodec.Location = new System.Drawing.Point(94, 21);
this.cmbCodec.Name = "cmbCodec";
this.cmbCodec.Size = new System.Drawing.Size(280, 24);
this.cmbCodec.TabIndex = 0;
this.cmbCodec.SelectedIndexChanged += new System.EventHandler(this.cmbCodec_SelectedIndexChanged);
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(17, 24);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(71, 17);
this.label1.TabIndex = 1;
this.label1.Text = "Algorithm:";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(5, 156);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(83, 17);
this.label2.TabIndex = 2;
this.label2.Text = "Source File:";
//
// txtSourceFile
//
this.txtSourceFile.Location = new System.Drawing.Point(94, 155);
this.txtSourceFile.Name = "txtSourceFile";
this.txtSourceFile.Size = new System.Drawing.Size(280, 22);
this.txtSourceFile.TabIndex = 3;
this.txtSourceFile.KeyDown += new System.Windows.Forms.KeyEventHandler(this.EditKeyDown);
this.txtSourceFile.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.EditKeyPress);
//
// btnSelectFile
//
this.btnSelectFile.Font = new System.Drawing.Font("Agency FB", 7.2F, System.Drawing.FontStyle.Bold,
System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.btnSelectFile.Location = new System.Drawing.Point(380, 155);
this.btnSelectFile.Name = "btnSelectFile";
this.btnSelectFile.Size = new System.Drawing.Size(25, 23);
this.btnSelectFile.TabIndex = 4;
this.btnSelectFile.Text = "...";
this.btnSelectFile.UseVisualStyleBackColor = true;
this.btnSelectFile.Click += new System.EventHandler(this.btnSelectFile_Click);
//
// txtDestinationDir
//
this.txtDestinationDir.Location = new System.Drawing.Point(94, 198);
this.txtDestinationDir.Name = "txtDestinationDir";
this.txtDestinationDir.Size = new System.Drawing.Size(280, 22);
this.txtDestinationDir.TabIndex = 6;
//
// btnDestinationDir
//
this.btnDestinationDir.Font = new System.Drawing.Font("Agency FB", 7.2F, System.Drawing.FontStyle.Bold,
System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.btnDestinationDir.Location = new System.Drawing.Point(380, 198);
this.btnDestinationDir.Name = "btnDestinationDir";
this.btnDestinationDir.Size = new System.Drawing.Size(25, 23);
this.btnDestinationDir.TabIndex = 7;
this.btnDestinationDir.Text = "...";
this.btnDestinationDir.UseVisualStyleBackColor = true;
this.btnDestinationDir.Click += new System.EventHandler(this.btnDestinationDir_Click);
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(52, 67);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(36, 17);
this.label4.TabIndex = 8;
this.label4.Text = "Key:";
//
// txtKey
//
this.txtKey.Location = new System.Drawing.Point(94, 66);
this.txtKey.Name = "txtKey";
this.txtKey.Size = new System.Drawing.Size(280, 22);
this.txtKey.TabIndex = 9;
//
// btnClose
//
this.btnClose.AutoSize = true;
this.btnClose.Location = new System.Drawing.Point(353, 256);
this.btnClose.Name = "btnClose";
this.btnClose.Size = new System.Drawing.Size(75, 27);
this.btnClose.TabIndex = 12;
this.btnClose.Text = "Close";
this.btnClose.UseVisualStyleBackColor = true;
this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
//
// numKeySize
//
this.numKeySize.Location = new System.Drawing.Point(111, 110);
this.numKeySize.Name = "numKeySize";
this.numKeySize.Size = new System.Drawing.Size(55, 22);
this.numKeySize.TabIndex = 13;
this.numKeySize.ValueChanged += new System.EventHandler(this.Numeric_ValueChanged);
this.numKeySize.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.EditKeyPress);
this.numKeySize.KeyDown += new System.Windows.Forms.KeyEventHandler(this.EditKeyDown);
//
// numBlockSize
//
this.numBlockSize.Location = new System.Drawing.Point(299, 110);
this.numBlockSize.Name = "numBlockSize";
this.numBlockSize.Size = new System.Drawing.Size(55, 22);
this.numBlockSize.TabIndex = 14;
this.numBlockSize.ValueChanged += new System.EventHandler(this.Numeric_ValueChanged);
this.numBlockSize.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.EditKeyPress);
this.numBlockSize.KeyDown += new System.Windows.Forms.KeyEventHandler(this.EditKeyDown);
//
// label5
//
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(38, 111);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(67, 17);
this.label5.TabIndex = 15;
this.label5.Text = "Key Size:";
//
// label6
//
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(216, 111);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(77, 17);
this.label6.TabIndex = 16;
this.label6.Text = "Block Size:";
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(8, 186);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(79, 34);
this.label3.TabIndex = 5;
this.label3.Text = "Destination\r\ndirectory:";
this.label3.TextAlign = System.Drawing.ContentAlignment.TopRight;
//
// btnEncrypt
//
this.btnEncrypt.AutoSize = true;
this.btnEncrypt.Location = new System.Drawing.Point(98, 256);
this.btnEncrypt.Name = "btnEncrypt";
this.btnEncrypt.Size = new System.Drawing.Size(75, 27);
this.btnEncrypt.TabIndex = 19;
this.btnEncrypt.Text = "Encrypt";
this.btnEncrypt.UseVisualStyleBackColor = true;
this.btnEncrypt.Click += new System.EventHandler(this.btnEncrypt_Click);
//
// btnDecrypt
//
this.btnDecrypt.AutoSize = true;
this.btnDecrypt.Location = new System.Drawing.Point(182, 256);
this.btnDecrypt.Name = "btnDecrypt";
this.btnDecrypt.Size = new System.Drawing.Size(75, 27);
this.btnDecrypt.TabIndex = 20;
this.btnDecrypt.Text = "Decrypt";
this.btnDecrypt.UseVisualStyleBackColor = true;
this.btnDecrypt.Click += new System.EventHandler(this.btnDecrypt_Click);
//
// btnShowFile
//
this.btnShowFile.AutoSize = true;
this.btnShowFile.Location = new System.Drawing.Point(266, 256);
this.btnShowFile.Name = "btnShowFile";
this.btnShowFile.Size = new System.Drawing.Size(78, 27);
this.btnShowFile.TabIndex = 21;
this.btnShowFile.Text = "Show File";
this.btnShowFile.UseVisualStyleBackColor = true;
this.btnShowFile.Click += new System.EventHandler(this.btnShowFile_Click);
//
// btnNewFile
//
this.btnNewFile.AutoSize = true;
this.btnNewFile.Location = new System.Drawing.Point(14, 256);
this.btnNewFile.Name = "btnNewFile";
this.btnNewFile.Size = new System.Drawing.Size(75, 27);
this.btnNewFile.TabIndex = 22;
this.btnNewFile.Text = "New File";
this.btnNewFile.UseVisualStyleBackColor = true;
this.btnNewFile.Click += new System.EventHandler(this.btnNewFile_Click);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(442, 296);
this.Controls.Add(this.btnNewFile);
this.Controls.Add(this.btnShowFile);
this.Controls.Add(this.btnDecrypt);
this.Controls.Add(this.btnEncrypt);
this.Controls.Add(this.label6);
this.Controls.Add(this.label5);
this.Controls.Add(this.numBlockSize);
this.Controls.Add(this.numKeySize);
this.Controls.Add(this.btnClose);
this.Controls.Add(this.txtKey);
this.Controls.Add(this.label4);
this.Controls.Add(this.btnDestinationDir);
this.Controls.Add(this.txtDestinationDir);
this.Controls.Add(this.label3);
this.Controls.Add(this.btnSelectFile);
this.Controls.Add(this.txtSourceFile);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.cmbCodec);
this.MaximizeBox = false;
this.Name = "Form1";
this.Text = "SymmetricAlgorithm with Files";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
((System.ComponentModel.ISupportInitialize)(this.numKeySize)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numBlockSize)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ComboBox cmbCodec;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox txtSourceFile;
private System.Windows.Forms.Button btnSelectFile;
private System.Windows.Forms.TextBox txtDestinationDir;
private System.Windows.Forms.Button btnDestinationDir;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.TextBox txtKey;
private System.Windows.Forms.Button btnClose;
private System.Windows.Forms.NumericUpDown numKeySize;
private System.Windows.Forms.NumericUpDown numBlockSize;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Button btnEncrypt;
private System.Windows.Forms.Button btnDecrypt;
private System.Windows.Forms.Button btnShowFile;
private System.Windows.Forms.Button btnNewFile;
}
}Этот код сразу определит интерфейс формы и мне не нужно будет писать (а вам - читать) таблицу свойств элементов.
-
Добавьте к текущему проекту командой Project/Add Class новый файл с именем MySettings.cs и заполните его следующим кодом (приводится полностью)
using System;
using System.Configuration;
namespace Demo2
{
// Класс для сохранения параметров приложения
class MySettings : ApplicationSettingsBase
{
[UserScopedSettingAttribute()] // Область действия - 'Пользователь'
[DefaultSettingValueAttribute("C:\\")] // Значение параметра по умолчанию
public String DestinationDir
{
get
{
return ((String)this["DestinationDir"]);
}
set
{
this["DestinationDir"] = (String)value;
}
}
[UserScopedSettingAttribute()] // Область действия - 'Пользователь'
[DefaultSettingValueAttribute("")] // Значение параметра по умолчанию
public String SourceFile
{
get
{
return ((String)this["SourceFile"]);
}
set
{
this["SourceFile"] = (String)value;
}
}
}
}-
Откройте файл Form1.cs в режиме View Code и заполните его следующим кодом (приводится полностью)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
// Дополнительные пространства имен
using System.Security.Cryptography;
using System.IO;
namespace Demo2
{
public partial class Form1 : Form
{
// Создаем объект симметричного шифрования
SymmetricAlgorithm codec = null;// Тип общего предка
// Создаем объект сохранения параметров
MySettings settings = new MySettings();// Это наш класс в файле MySettings.cs
public Form1()
{
InitializeComponent();
// Привязка именованных параметров к
// сохраняемым свойствам элементов управления
txtDestinationDir.DataBindings.Add(new Binding("Text", settings, "DestinationDir"));
txtSourceFile.DataBindings.Add(new Binding("Text", settings, "SourceFile"));
// Настраиваем ComboBox динамически
cmbCodec.Items.AddRange(
new string[]
{
"DESCryptoServiceProvider",
"RC2CryptoServiceProvider",
"RijndaelManaged",
"TripleDESCryptoServiceProvider",
"DefaultServiceProvider "
});
cmbCodec.SelectedIndex = 0;// Выделяем первый элемент
}
// Меняем алгоритм шифрования
private void cmbCodec_SelectedIndexChanged(object sender, EventArgs e)
{
// Блокируем обработчик Numeric_ValueChanged
initFlag = false;
ComboBox cmb = sender as ComboBox;
switch (cmb.SelectedIndex)
{
case 0:
codec = new DESCryptoServiceProvider();
break;
case 1:
codec = new RC2CryptoServiceProvider();
break;
case 2:
codec = new RijndaelManaged();
break;
case 3:
codec = new TripleDESCryptoServiceProvider();
break;
case 4:
codec = SymmetricAlgorithm.Create();
break;
}
// Заполняем NumericUpDown
foreach (KeySizes sizes in codec.LegalKeySizes)
{
numKeySize.Minimum = sizes.MinSize;
numKeySize.Maximum = sizes.MaxSize;
numKeySize.Increment = sizes.SkipSize;
break;
}
numKeySize.Value = codec.KeySize;
CorrectTextKey();
foreach (KeySizes sizes in codec.LegalBlockSizes)
{
numBlockSize.Minimum = sizes.MinSize;
numBlockSize.Maximum = sizes.MaxSize;
numBlockSize.Increment = sizes.SkipSize;
break;
}
numBlockSize.Value = codec.BlockSize;
// Разблокируем обработчик Numeric_ValueChanged
initFlag = true;
}
// Устанавливаем допустимую длину ввода
void CorrectTextKey()
{
// Корректируем длину поля ввода ключа
int lenKey = codec.KeySize / 8;
int lenTextBox= ASCIIEncoding.ASCII.GetByteCount(txtKey.Text);
if (lenTextBox > lenKey)// Убираем лишнее
txtKey.Text = txtKey.Text.Substring(0, lenKey);
txtKey.MaxLength = lenKey;
}
bool initFlag = false;
private void Numeric_ValueChanged(object sender, EventArgs e)
{
if (initFlag)
{
codec.KeySize = (int)numKeySize.Value;
codec.BlockSize = (int)numBlockSize.Value;
CorrectTextKey();
}
}
// Создать новый текстовый файл через блокнот
private void btnNewFile_Click(object sender, EventArgs e)
{
// Создаем новый текстовый файл через блокнот
System.Diagnostics.Process exe = new System.Diagnostics.Process();
exe.StartInfo.FileName = "Notepad.exe"; //Имя программы для запуска
//exe.StartInfo.Arguments = path; //Аргументы
exe.Start(); // Запускаем внешний процесс
//exe.WaitForExit();// Останавливаем наш процесс до закрытия блокнота
exe.Close(); // Освобождаем связанные с процессом ресурсы
}
// Посмотреть через блокнот результаты шифрования
private void btnShowFile_Click(object sender, EventArgs e)
{
// Покажем выбранный файл через блокнот
System.Diagnostics.Process exe = new System.Diagnostics.Process();
exe.StartInfo.FileName = "Notepad.exe"; //Имя программы для запуска
exe.StartInfo.Arguments = SelectFile(); //Выбрать файл через диалог
exe.Start(); // Запускаем внешний процесс
//exe.WaitForExit();// Останавливаем наш процесс до закрытия блокнота
exe.Close(); // Освобождаем связанные с процессом ресурсы
}
// Выполнить шифрование
private void btnEncrypt_Click(object sender, EventArgs e)
{
if (txtKey.Text == "")
{
MessageBox.Show(this, "Введите ключ для шифрования", "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Stop);
return;
}
string destinationFile = "";
if (Path.GetExtension(txtSourceFile.Text) != ".txt")
{
MessageBox.Show(this, "Выберите файл '*.txt' для шифрования", "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Stop);
return;
}
else
{
destinationFile = txtSourceFile.Text.Replace(".txt", String.Empty) + ".enc";
destinationFile = Path.GetFileName(destinationFile);// Укороченное имя
destinationFile = Path.Combine(txtDestinationDir.Text, destinationFile);
}
if (encryptData(txtSourceFile.Text, destinationFile, txtKey.Text))
MessageBox.Show(this, "Выполнено!", "Шифрование файла",
MessageBoxButtons.OK, MessageBoxIcon.Information);
else
MessageBox.Show(this, "Процесс шифрования закончился неудачей!", "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
// Выполнить дешифрование
private void btnDecrypt_Click(object sender, EventArgs e)
{
if (txtKey.Text == "")
{
MessageBox.Show(this, "Введите ключ для дешифрования", "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Stop);
return;
}
string destinationFile = "";
if (Path.GetExtension(txtSourceFile.Text) != ".enc")
{
MessageBox.Show(this, "Выберите файл '*.enc' для дешифрования", "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Stop);
return;
}
else
{
destinationFile = txtSourceFile.Text + ".txt";
destinationFile = Path.GetFileName(destinationFile);// Укороченное имя
destinationFile = Path.Combine(txtDestinationDir.Text, destinationFile);
}
if (decryptData(txtSourceFile.Text, destinationFile, txtKey.Text))
MessageBox.Show(this, "Выполнено!", "Дешифрование файла",
MessageBoxButtons.OK, MessageBoxIcon.Information);
else
MessageBox.Show(this, "Процесс дешифрования закончился неудачей!", "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
// Шифруем заданный файл
private bool encryptData(
string sourceFile, string destinationFile, string cryptoKey)
{
FileStream inFileStream = null, outFileStream = null;
CryptoStream cryptoStream = null;
// Заготавливаем пустой ключ полного размера
byte[] key = new byte[(int)numKeySize.Value / 8];
try
{
// Создаем и настраиваем кодировщик
ASCIIEncoding.ASCII.GetBytes(cryptoKey.Trim()).CopyTo(key, 0);// Заполняем ключ
codec.Key = key;
//codec.GenerateIV();
ICryptoTransform encryptor = codec.CreateEncryptor();
// Открываем исходный и результирующий файлы, используя файловый поток
inFileStream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read);
outFileStream = new FileStream(destinationFile, FileMode.Create, FileAccess.Write);
// Создаем оболочку CryptoStream для записи шифрованного файла
cryptoStream = new CryptoStream(outFileStream, encryptor, CryptoStreamMode.Write);
// Объявляем массив файлов с длиной входного файла
byte[] bytes = new byte[inFileStream.Length];
// Считываем входной файловый поток в массив байтов
// и записываем байты в CryptoStream
inFileStream.Read(bytes, 0, bytes.Length);
cryptoStream.Write(bytes, 0, bytes.Length);
inFileStream.Flush();
cryptoStream.FlushFinalBlock();
return true;
}
catch (Exception e)
{
MessageBox.Show(this, e.ToString(), "Encryption Error",
MessageBoxButtons.OK, MessageBoxIcon.Stop);
return false;
}
finally
{
// Освобождаем ресурсы в любом случае
if (cryptoStream != null) cryptoStream.Close();
if (inFileStream != null) inFileStream.Close();
if (outFileStream != null) outFileStream.Close();
}
}
// Расшифровываем указанный файл с тем же ключем и алгоритмом
private bool decryptData(
string sourceFile, string destinationFile, string cryptoKey)
{
CryptoStream cryptoStream = null;
StreamWriter decryptedOut = null;
FileStream decryptedFile = null;
StreamReader streamReader = null;
// Заготавливаем пустой ключ полного размера
byte[] key = new byte[(int)numKeySize.Value / 8];
try
{
// Создаем и настраиваем кодировщик
ASCIIEncoding.ASCII.GetBytes(cryptoKey.Trim()).CopyTo(key, 0);// Заполняем ключ
codec.Key = key;
//codec.GenerateIV();
ICryptoTransform decryptor = codec.CreateDecryptor();
// Открываем исходный и результирующий файлы, используя файловый поток
decryptedFile = new FileStream(sourceFile, FileMode.Open, FileAccess.Read);
// Создаем оболочку CryptoStream для записи шифрованного файла
cryptoStream = new CryptoStream(decryptedFile, decryptor, CryptoStreamMode.Read);
decryptedOut = new StreamWriter(destinationFile);
streamReader = new StreamReader(cryptoStream, Encoding.GetEncoding("windows-1251"));
decryptedOut.Write(streamReader.ReadToEnd());
return true;
}
catch (Exception e)
{
MessageBox.Show(this, e.ToString(), "Decryption Error",
MessageBoxButtons.OK, MessageBoxIcon.Stop);
return false;
}
finally
{
// Освобождаем ресурсы в любом случае
if (streamReader != null) streamReader.Close();
if (cryptoStream != null) cryptoStream.Close();
if (decryptedOut != null) decryptedOut.Close();
if (decryptedFile != null) decryptedFile.Close();
}
}
// Диалог выбора файла для обработки
OpenFileDialog openFileDialog = new OpenFileDialog();
String SelectFile()
{
// Настраиваем диалог выбора файла
if (txtSourceFile.Text == String.Empty)
openFileDialog.InitialDirectory = txtDestinationDir.Text;
else
openFileDialog.InitialDirectory = Path.GetDirectoryName(txtSourceFile.Text);
openFileDialog.FileName = "";
openFileDialog.Filter = "Source Files(*.txt;*.enc)|*.txt;*.enc";
DialogResult result = openFileDialog.ShowDialog();
if (result != DialogResult.Cancel)
return openFileDialog.FileName; // Полное имя
else
return txtSourceFile.Text;
}
// Запуск диалога выбора файла
private void btnSelectFile_Click(object sender, EventArgs e)
{
txtSourceFile.Text = SelectFile();
txtSourceFile.Focus();// Без этого не сохранится в установках приложения
}
// Запуск диалога выбора папки назначения
FolderBrowserDialog dialogFolder = new FolderBrowserDialog();
private void btnDestinationDir_Click(object sender, EventArgs e)
{
if (txtDestinationDir.Text == String.Empty ||
Directory.Exists(txtDestinationDir.Text) == false)
{
dialogFolder.RootFolder =
System.Environment.SpecialFolder.MyComputer;
dialogFolder.SelectedPath = "";
txtDestinationDir.Text = String.Empty;
}
else
{
dialogFolder.SelectedPath = txtDestinationDir.Text;
}
dialogFolder.Description =
"Выберите место размещения целевого файла";
dialogFolder.ShowDialog();
txtDestinationDir.Text = dialogFolder.SelectedPath;
txtDestinationDir.Focus();
}
// Блокировка редактирования TextBox и NumericUpDown вручную
private void EditKeyDown(object sender, KeyEventArgs e)
{
e.Handled = true;
}
private void EditKeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = true;
}
// При закрытии формы сохраняем параметры
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
settings.Save();
}
// Закрываем форму
private void btnClose_Click(object sender, EventArgs e)
{
this.Close();
}
}
}Каждый используемый алгоритм шифрования имеет свой фиксированный размер ключа, нарушение которого генерирует исключение. Поэтому мы вначале создаем байтовый массив фиксированного размера, а потом копируем в него содержимое пользовательского ключа, не превышающего по размеру допустимого. Незаполненные байты массива остаются нулевыми, зато этот прием позволяет принимать от пользователя ключи любой длины, не превышающей допустимую. В дополнение к этому на поле ввода ключа txtKey наложено ограничение по максимальной длине текста.
-
Запустите приложение Demo2 - оно вполне работоспособно и справляется с шифрованием при правильном обращении с ним -
Разберитесь с кодом ( кому надо!), да простят меня классики
Внешний вид окна будет таким
Естественно, что при шифровании и дешифровании одного и того же документа алгоритм, ключ и его размер, а также размер блока шифрования должны быть одинаковыми.

