Шифрование и дешифрование 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("Зашифровано");
            }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.067 из 5
Похожие ответы