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