Наковырял в нете исходник по шифрованию, но консольную версию и как я понял под линух(хотя разницы нет). Переделал его в то что мне нужно всё получилось я рад. Но опять но!!! Половину из кода я не понял, не смотря на то что сам ковырял. Вот и прошу рассказать что да как в нем происходи(построчно). Частитно сам дописал инфо, а там где его нет я тупо понимаю но что именно там происходит ни ку-ку.
Код | using System; using System.IO; using System.Security.Cryptography; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;
namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
const int READ_BUF_SIZE = 512; TripleDES des = TripleDES.Create();
private void CreateOpenKeyFile() { //С диалогом все ясно string message = "Создать новый ключь?\n\nПри нажатии на кнопку 'Да' будет создан новый ключль.\nПри нажатии на кнопку 'Нет' будет предложено выбрать уже имеющийся ключь."; string caption = "Новый ключ."; MessageBoxButtons buttons = MessageBoxButtons.YesNo; DialogResult result;
result = MessageBox.Show(this, message, caption, buttons, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);
if (result == DialogResult.Yes) { saveFileDialog1.FileName = "*.key"; //Если в диалоге нажали да то создаем новый если нет, то открываем старый if (saveFileDialog1.ShowDialog() == DialogResult.OK) { //Тут темный лес. Что то генерируется и записуется в выйл ключ. des.GenerateKey(); des.GenerateIV(); BinaryWriter key_writer = new BinaryWriter(File.OpenWrite(saveFileDialog1.FileName)); key_writer.Write((int)(des.KeySize / 8)); key_writer.Write(des.Key); key_writer.Write(des.IV); key_writer.Close(); this.tbKey.Text = saveFileDialog1.FileName; }
} else { //Выбираем ранее созданый ключ. openFileDialog1.FileName = "*.key"; if (openFileDialog1.ShowDialog() == DialogResult.OK) { this.tbKey.Text = openFileDialog1.FileName; } } } private void EncryptFileDES() { //тут только догадки FileStream key_stream = File.OpenRead(tbKey.Text); BinaryReader key_reader = new BinaryReader(key_stream); int key_size = key_reader.ReadInt32(); des.Key = key_reader.ReadBytes(key_size); des.IV = key_reader.ReadBytes((int)(key_stream.Length - key_size)); key_reader.Close(); BinaryReader raw_reader = new BinaryReader(File.OpenRead(tbfile.Text));
FileStream crypt_file_stream = File.OpenWrite(tbfile.Text+"x"); crypt_file_stream.SetLength(0);
CryptoStream crypt_stream = new CryptoStream(crypt_file_stream, des.CreateEncryptor(), CryptoStreamMode.Write); BinaryWriter crypt_writer = new BinaryWriter(crypt_stream);
byte[] block = new byte[READ_BUF_SIZE]; int read_count = 0; while ((read_count = raw_reader.Read(block, 0, READ_BUF_SIZE)) != 0) { crypt_writer.Write(block, 0, read_count); } crypt_writer.Close(); raw_reader.Close(); MessageBox.Show("Файл зашифрован.");
}
private void DeEncryptFileDES() { //те же самые догадки FileStream key_stream = File.OpenRead(tbKey.Text); BinaryReader key_reader = new BinaryReader(key_stream); int key_size = key_reader.ReadInt32(); des.Key = key_reader.ReadBytes(key_size); des.IV = key_reader.ReadBytes((int)(key_stream.Length - key_size)); key_reader.Close();
CryptoStream crypt_stream = new CryptoStream(File.OpenRead(tbfilecrypt.Text), des.CreateDecryptor(), CryptoStreamMode.Read); BinaryReader crypt_reader = new BinaryReader(crypt_stream);
FileStream raw_stream = File.OpenWrite(tbfilecrypt.Text+"c"); raw_stream.SetLength(0);
BinaryWriter raw_writer = new BinaryWriter(raw_stream);
byte[] block = new byte[READ_BUF_SIZE]; int read_count = 0; while ((read_count = crypt_reader.Read(block, 0, READ_BUF_SIZE)) != 0) { raw_writer.Write(block, 0, read_count); }
raw_writer.Close(); crypt_reader.Close(); MessageBox.Show("Файл разшифрован."); }
private void button1_Click(object sender, EventArgs e) { //Вызываю функцию создания или открытия ключа. this.CreateOpenKeyFile(); }
private void button2_Click(object sender, EventArgs e) { //Заполняю textbox в котором содежится имя файла для шифрования openFileDialog1.FileName = "*.*"; if (openFileDialog1.ShowDialog() == DialogResult.OK) { this.tbfile.Text = openFileDialog1.FileName; } }
private void button3_Click(object sender, EventArgs e) { //Заполняю textbox в котором содежится имя файла для дешифрования openFileDialog1.FileName = "*.*"; if (openFileDialog1.ShowDialog() == DialogResult.OK) { this.tbfilecrypt.Text = openFileDialog1.FileName; } }
private void button4_Click(object sender, EventArgs e) { //Тут я тупо сделал проверку на существование файлов с которыми будем работать. if ((tbKey.Text != "") & (File.Exists(tbKey.Text)) & (tbfile.Text != "") & (File.Exists(tbfile.Text))) EncryptFileDES(); else MessageBox.Show("Не указаны или не существует файл с ключем и/или кодируемый файл."); }
private void button5_Click(object sender, EventArgs e) { //тут понятно тоже что и перед этим. if ((tbKey.Text != "") & (File.Exists(tbKey.Text)) & (tbfilecrypt.Text != "") & (File.Exists(tbfilecrypt.Text))) DeEncryptFileDES(); else MessageBox.Show("Не указаны или не существует файл с ключем и/или декодируемый файл."); } } }
|
На всяки случай прикреплю и сам "проект".
И еще один вопросик. Я сделал так что бы зашифрованный фал в расширении получал дополнительный символ X А расшифрованный получал дополнительно C. Так и получается у меня. Пример: Изночально 1.jpg, шифруем и он уже 1.jpgx, дешифруем и он становиться 1.jpgxc. Тупо не правда ли. Как сделать что бы при дешифровки убирался X? |