Шифрование и дешифрование 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"); //MemoryStream dgf=new MemoryStream(dest); 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"; FileStream SG=new FileStream(fileIn, FileMode.Open, FileAccess.Read ); using ( var sa = algo ) // Создаем поток для чтения шифрованных данных using ( var fsr = SG ) // Создаем крипто-поток для чтения using ( var cs = new CryptoStream( fsr, sa.CreateDecryptor( rgbKey, rgbIV ), CryptoStreamMode.Read )) { // Дешифровываем исходный поток данных buff = new byte[fsr.Length]; cs.Read( buff, 0, buff.Length ); // Пишем дешифрованные данные int len = (int)BitConverter.ToInt64( buff, 0 ); // using ( var fsw = File.Open( fileOut + DECRYPT_EXT, FileMode.Create, FileAccess.Write ) ) using(MemoryStream ggg=new MemoryStream(buff, sizeof( long ), len)) { XDocument ff=new XDocument(); ff=XDocument.Load(ggg); MessageBox.Show(ff.Element("fff").Value.ToString()); } } Array.Clear( rgbKey, 0, rgbKey.Length ); Array.Clear( rgbIV, 0, rgbIV.Length ); MessageBox.Show("Расшифровано"); } } }
Решение задачи: «Шифрование и дешифрование XML в одном и том же файле»
textual
Листинг программы
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( fileIn, FileMode.Open, FileAccess.ReadWrite ) ) { buff = new byte[fsw.Length + sizeof( long )]; fsw.Read( buff, sizeof( long ), buff.Length - sizeof( long ) ); /* Записываем в первые 8 байт длину исходного файла * нужно это для того чтобы, после дешифровки не было * лишних данных */ int i = 0; foreach ( byte @byte in BitConverter.GetBytes( fsw.Length ) ) buff[i++] = @byte; // Создаем крипто-поток для записи using ( var cs = new CryptoStream( fsw, sa.CreateEncryptor( rgbKey, rgbIV ), CryptoStreamMode.Write )) { // Читаем исходный файл // using ( var fs = File.Open( fileIn, FileMode.Open, FileAccess.Read ) ) // { //using (var fs=fsw) //{ /* 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("Зашифровано"); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д