Расшифровка XML без создания новых файлов (в память) - C#
Формулировка задачи:
Доброго времени суток! У меня есть рабочий код, который шифрует xml документ и расшифровывает его. Но дело в том, что в данном случае создаются новые файлы. Мне же нужно, чтобы документ один раз зашифровался, а затем при открытии программы он расшифровывался и лежал в памяти, пока я с ним работаю, а когда нужно будет сохранить изменения он просто шифровался и сохранялся в то же имя. То есть вся работа с документом происходила бы в памяти, и в любое время данный файл в папке лежал зашифрованным. Как мне это сделать?
Рабочий код:
Листинг программы
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.Windows.Forms;
- using System.IO;
- using System.Text;
- using System.Security.Cryptography;
- using System.Xml.Linq;
- namespace EDS_File
- {
- public partial class MainForm : Form
- {
- OpenFileDialog openfile = new OpenFileDialog();
- SaveFileDialog save_encrypt = new SaveFileDialog();
- string ext1,ext2;
- string fName_enc, fName_dec;
- public MainForm ( )
- {
- InitializeComponent();
- }
- void Button1Click ( object sender, EventArgs e )
- {
- string dest = Path.Combine(Application.StartupPath,"keys");
- Directory.CreateDirectory( dest );
- dest = Path.Combine(dest,Path.GetFileNameWithoutExtension( textBox1.Text ) +".key");
- using ( var fs = File.Open( dest, FileMode.Create, FileAccess.Write ) )
- using ( var aes = new AesCryptoServiceProvider() )
- {
- var rnd = RNGCryptoServiceProvider.Create();
- byte[] buff0 = new byte[aes.KeySize / 8], buff1 = new byte[16];
- rnd.GetNonZeroBytes( buff0 );
- rnd.GetNonZeroBytes( buff1 );
- fs.Write( buff0, 0, buff0.Length );
- fs.Write( buff1, 0, buff1.Length );
- CryptFile(textBox1.Text,textBox1.Text,aes, buff0, buff1);
- }
- }
- void Button3Click ( object sender, EventArgs e )
- {
- if ( openfile.ShowDialog() == DialogResult.OK )
- {
- textBox1.Text = openfile.FileName;
- ext1 = Path.GetExtension( textBox1.Text );
- fName_enc = Path.GetFileNameWithoutExtension( openfile.FileName );
- }
- }
- void Button4Click ( object sender, EventArgs e )
- {
- if ( openfile.ShowDialog() == DialogResult.OK )
- {
- textBox2.Text = openfile.FileName;
- ext2 = Path.GetExtension( textBox2.Text );
- fName_dec = Path.GetFileNameWithoutExtension( openfile.FileName );
- }
- }
- void Button2Click ( object sender, EventArgs e )
- {
- string dest = Path.Combine(Application.StartupPath,"keys",
- "sss"/*Path.GetFileNameWithoutExtension( textBox2.Text )*/ +".key");
- using ( var fs = File.Open( dest, FileMode.Open, FileAccess.Read ) )
- using ( var aes = new AesCryptoServiceProvider() )
- {
- byte[] buff0 = new byte[aes.KeySize / 8],buff1 = new byte[16];
- fs.Read( buff0, 0, buff0.Length );
- fs.Read( buff1, 0, buff1.Length );
- DecryptFile(textBox2.Text,Path.Combine(Path.GetDirectoryName( textBox2.Text ),
- Path.GetFileNameWithoutExtension( textBox2.Text )),aes, buff0, buff1);
- }
- }
- static void CryptFile ( string fileIn, string fileOut, SymmetricAlgorithm algo, byte[] rgbKey, byte[] rgbIV ) {
- if ( string.IsNullOrEmpty( fileIn ) )
- throw new FileNotFoundException( string.Format( "Неверный путь к файлу: {0}.", fileIn ) );
- if ( !File.Exists( fileIn ) )
- throw new FileNotFoundException( string.Format( "Файл '{0}' не найден.", fileIn ) );
- byte[] buff = null;
- const string CRYPT_EXT = ".xml.crypto";
- using ( var sa = algo )
- // Создаем поток для записи зашифрованных данных
- using ( var fsw = File.Open( fileOut + CRYPT_EXT, FileMode.Create, FileAccess.Write ) )
- // Создаем крипто-поток для записи
- using ( var cs = new CryptoStream( fsw,
- sa.CreateEncryptor( rgbKey, rgbIV ), CryptoStreamMode.Write ))
- {
- // Читаем исходный файл
- using ( var fs = File.Open( fileIn, FileMode.Open, FileAccess.Read ) )
- {
- buff = new byte[fs.Length + sizeof( long )];
- fs.Read( buff, sizeof( long ), buff.Length - sizeof( long ) );
- /* Записываем в первые 8 байт длину исходного файла
- * нужно это для того чтобы, после дешифровки не было
- * лишних данных
- */
- int i = 0;
- foreach ( byte @byte in BitConverter.GetBytes( fs.Length ) )
- buff[i++] = @byte;
- }
- cs.Write( buff, 0, buff.Length );
- cs.Flush();
- }
- Array.Clear( rgbKey, 0, rgbKey.Length );
- Array.Clear( rgbIV, 0, rgbIV.Length );
- MessageBox.Show("Зашифровано");
- }
- static void DecryptFile ( string fileIn, string fileOut, SymmetricAlgorithm algo, byte[] rgbKey, byte[] rgbIV )
- {
- if ( string.IsNullOrEmpty( fileIn ) )
- throw new FileNotFoundException( string.Format( "Неверный путь к файлу: {0}.", fileIn ) );
- if ( !File.Exists( fileIn ) )
- throw new FileNotFoundException( string.Format( "Файл '{0}' не найден.", fileIn ) );
- byte[] buff = null;
- const string DECRYPT_EXT = ".decrypto";
- using ( var sa = algo )
- // Создаем поток для чтения шифрованных данных
- using ( var fsr = File.Open( fileIn, FileMode.Open, FileAccess.Read ) )
- // Создаем крипто-поток для чтения
- using ( var cs = new CryptoStream( fsr,
- sa.CreateDecryptor( rgbKey, rgbIV ), CryptoStreamMode.Read ))
- {
- // Дешифровываем исходный поток данных
- buff = new byte[fsr.Length];
- cs.Read( buff, 0, buff.Length );
- // Пишем дешифрованные данные
- using ( var fsw = File.Open( fileOut + DECRYPT_EXT, FileMode.Create, FileAccess.Write ) )
- {
- // Читаем записанную длину исходного файла
- int len = (int)BitConverter.ToInt64( buff, 0 );
- // Пишем только ту часть дешифрованных данных,
- // которая представляет исходный файл
- fsw.Write( buff, sizeof( long ), len );
- XDocument ff=new XDocument();
- ff.Add(new XElement("ff"));
- fsw.Flush();
- }
- }
- Array.Clear( rgbKey, 0, rgbKey.Length );
- Array.Clear( rgbIV, 0, rgbIV.Length );
- MessageBox.Show("Расшифровано");
- }
- }
- }
Решение задачи: «Расшифровка XML без создания новых файлов (в память)»
textual
Листинг программы
- using ( var fs = File.Open( dest, FileMode.Create, FileAccess.Write ) )
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д