Расшифровка XML без создания новых файлов (в память) - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток! У меня есть рабочий код, который шифрует xml документ и расшифровывает его. Но дело в том, что в данном случае создаются новые файлы. Мне же нужно, чтобы документ один раз зашифровался, а затем при открытии программы он расшифровывался и лежал в памяти, пока я с ним работаю, а когда нужно будет сохранить изменения он просто шифровался и сохранялся в то же имя. То есть вся работа с документом происходила бы в памяти, и в любое время данный файл в папке лежал зашифрованным. Как мне это сделать? Рабочий код:
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Windows.Forms;
  5. using System.IO;
  6. using System.Text;
  7. using System.Security.Cryptography;
  8. using System.Xml.Linq;
  9. namespace EDS_File
  10. {
  11. public partial class MainForm : Form
  12. {
  13. OpenFileDialog openfile = new OpenFileDialog();
  14. SaveFileDialog save_encrypt = new SaveFileDialog();
  15. string ext1,ext2;
  16. string fName_enc, fName_dec;
  17. public MainForm ( )
  18. {
  19. InitializeComponent();
  20. }
  21. void Button1Click ( object sender, EventArgs e )
  22. {
  23. string dest = Path.Combine(Application.StartupPath,"keys");
  24. Directory.CreateDirectory( dest );
  25. dest = Path.Combine(dest,Path.GetFileNameWithoutExtension( textBox1.Text ) +".key");
  26. using ( var fs = File.Open( dest, FileMode.Create, FileAccess.Write ) )
  27. using ( var aes = new AesCryptoServiceProvider() )
  28. {
  29. var rnd = RNGCryptoServiceProvider.Create();
  30. byte[] buff0 = new byte[aes.KeySize / 8], buff1 = new byte[16];
  31. rnd.GetNonZeroBytes( buff0 );
  32. rnd.GetNonZeroBytes( buff1 );
  33. fs.Write( buff0, 0, buff0.Length );
  34. fs.Write( buff1, 0, buff1.Length );
  35. CryptFile(textBox1.Text,textBox1.Text,aes, buff0, buff1);
  36. }
  37. }
  38. void Button3Click ( object sender, EventArgs e )
  39. {
  40. if ( openfile.ShowDialog() == DialogResult.OK )
  41. {
  42. textBox1.Text = openfile.FileName;
  43. ext1 = Path.GetExtension( textBox1.Text );
  44. fName_enc = Path.GetFileNameWithoutExtension( openfile.FileName );
  45. }
  46. }
  47. void Button4Click ( object sender, EventArgs e )
  48. {
  49. if ( openfile.ShowDialog() == DialogResult.OK )
  50. {
  51. textBox2.Text = openfile.FileName;
  52. ext2 = Path.GetExtension( textBox2.Text );
  53. fName_dec = Path.GetFileNameWithoutExtension( openfile.FileName );
  54. }
  55. }
  56. void Button2Click ( object sender, EventArgs e )
  57. {
  58. string dest = Path.Combine(Application.StartupPath,"keys",
  59. "sss"/*Path.GetFileNameWithoutExtension( textBox2.Text )*/ +".key");
  60. using ( var fs = File.Open( dest, FileMode.Open, FileAccess.Read ) )
  61. using ( var aes = new AesCryptoServiceProvider() )
  62. {
  63. byte[] buff0 = new byte[aes.KeySize / 8],buff1 = new byte[16];
  64. fs.Read( buff0, 0, buff0.Length );
  65. fs.Read( buff1, 0, buff1.Length );
  66. DecryptFile(textBox2.Text,Path.Combine(Path.GetDirectoryName( textBox2.Text ),
  67. Path.GetFileNameWithoutExtension( textBox2.Text )),aes, buff0, buff1);
  68. }
  69. }
  70. static void CryptFile ( string fileIn, string fileOut, SymmetricAlgorithm algo, byte[] rgbKey, byte[] rgbIV ) {
  71. if ( string.IsNullOrEmpty( fileIn ) )
  72. throw new FileNotFoundException( string.Format( "Неверный путь к файлу: {0}.", fileIn ) );
  73. if ( !File.Exists( fileIn ) )
  74. throw new FileNotFoundException( string.Format( "Файл '{0}' не найден.", fileIn ) );
  75. byte[] buff = null;
  76. const string CRYPT_EXT = ".xml.crypto";
  77. using ( var sa = algo )
  78. // Создаем поток для записи зашифрованных данных
  79. using ( var fsw = File.Open( fileOut + CRYPT_EXT, FileMode.Create, FileAccess.Write ) )
  80. // Создаем крипто-поток для записи
  81. using ( var cs = new CryptoStream( fsw,
  82. sa.CreateEncryptor( rgbKey, rgbIV ), CryptoStreamMode.Write ))
  83. {
  84. // Читаем исходный файл
  85. using ( var fs = File.Open( fileIn, FileMode.Open, FileAccess.Read ) )
  86. {
  87. buff = new byte[fs.Length + sizeof( long )];
  88. fs.Read( buff, sizeof( long ), buff.Length - sizeof( long ) );
  89. /* Записываем в первые 8 байт длину исходного файла
  90. * нужно это для того чтобы, после дешифровки не было
  91. * лишних данных
  92. */
  93. int i = 0;
  94. foreach ( byte @byte in BitConverter.GetBytes( fs.Length ) )
  95. buff[i++] = @byte;
  96. }
  97. cs.Write( buff, 0, buff.Length );
  98. cs.Flush();
  99. }
  100. Array.Clear( rgbKey, 0, rgbKey.Length );
  101. Array.Clear( rgbIV, 0, rgbIV.Length );
  102. MessageBox.Show("Зашифровано");
  103. }
  104. static void DecryptFile ( string fileIn, string fileOut, SymmetricAlgorithm algo, byte[] rgbKey, byte[] rgbIV )
  105. {
  106. if ( string.IsNullOrEmpty( fileIn ) )
  107. throw new FileNotFoundException( string.Format( "Неверный путь к файлу: {0}.", fileIn ) );
  108. if ( !File.Exists( fileIn ) )
  109. throw new FileNotFoundException( string.Format( "Файл '{0}' не найден.", fileIn ) );
  110. byte[] buff = null;
  111. const string DECRYPT_EXT = ".decrypto";
  112. using ( var sa = algo )
  113. // Создаем поток для чтения шифрованных данных
  114. using ( var fsr = File.Open( fileIn, FileMode.Open, FileAccess.Read ) )
  115. // Создаем крипто-поток для чтения
  116. using ( var cs = new CryptoStream( fsr,
  117. sa.CreateDecryptor( rgbKey, rgbIV ), CryptoStreamMode.Read ))
  118. {
  119. // Дешифровываем исходный поток данных
  120. buff = new byte[fsr.Length];
  121. cs.Read( buff, 0, buff.Length );
  122. // Пишем дешифрованные данные
  123. using ( var fsw = File.Open( fileOut + DECRYPT_EXT, FileMode.Create, FileAccess.Write ) )
  124. {
  125. // Читаем записанную длину исходного файла
  126. int len = (int)BitConverter.ToInt64( buff, 0 );
  127. // Пишем только ту часть дешифрованных данных,
  128. // которая представляет исходный файл
  129. fsw.Write( buff, sizeof( long ), len );
  130. XDocument ff=new XDocument();
  131. ff.Add(new XElement("ff"));
  132. fsw.Flush();
  133. }
  134. }
  135. Array.Clear( rgbKey, 0, rgbKey.Length );
  136. Array.Clear( rgbIV, 0, rgbIV.Length );
  137. MessageBox.Show("Расшифровано");
  138. }
  139. }
  140. }

Решение задачи: «Расшифровка XML без создания новых файлов (в память)»

textual
Листинг программы
  1. using ( var fs = File.Open( dest, FileMode.Create, FileAccess.Write ) )

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


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

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

11   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы