
Недавно один из моих анонимных :) читателей попросил меня помочь написать программу для шифрования отдельных тегов в xml документе для скрытия от “лишних глаз”.
Чтоб понять что именно требуется сделать можете посмотрeте нашу переписку здесь.
Ну в принципе ничего сложного нет, но так как я хороший человек то помогу :)
Код программы получился (как не странно) доволи таки большой, и каждую строчку описывать мне не хочется, то я его просто вставлю сюда, да и почти все прокомментировано.
public MainForm()До идеала конечно недотягивает, но на скорую руку сойдет ;)
{
InitializeComponent();
// Проверка на наличие БД
// если нет, то создать
if (!File.Exists("DB.xml"))
CreateXmlDocument("DB.xml");
}
// Создать БД
private void CreateXmlDocument(string filename)
{
var xmlTextWriter = new XmlTextWriter(filename, Encoding.UTF32);
xmlTextWriter.WriteStartDocument();
xmlTextWriter.WriteStartElement("DBInfo");
xmlTextWriter.WriteEndDocument();
xmlTextWriter.Close();
}
// Запись в БД
private void WriteToXmlDocument(string filename, string name, string pasPd,
string number, string myText)
{
try
{
var xmlDocument = new XmlDocument();
var fileStream = new FileStream(filename, FileMode.Open);
xmlDocument.Load(fileStream);
// Создаем новую запись USER c атрибутом дд/мм/гг/ + время
var user = xmlDocument.CreateElement("user");
user.SetAttribute("count", DateTime.Now.ToString(CultureInfo.InvariantCulture));
// Создаем поля для данных о пользователе
var login = xmlDocument.CreateElement("login");
var pass = xmlDocument.CreateElement("password");
var id = xmlDocument.CreateElement("id");
var content = xmlDocument.CreateElement("content");
string passCrypto = Encrypt(pasPd); // Зашифровали пароль
// Создаем записи для данных о пользователе
var tLogin = xmlDocument.CreateTextNode(name);
var tPassword = xmlDocument.CreateTextNode(passCrypto);
var tId = xmlDocument.CreateTextNode(number);
var tContent = xmlDocument.CreateTextNode(myText);
login.AppendChild(tLogin); // Заносим значение логина в поле LOGIN
pass.AppendChild(tPassword); // Заносим значение пароля в поле PASSWORD
id.AppendChild(tId); // Заносим значение id в поле ID
content.AppendChild(tContent); // Заносим контента пароля в поле CONTENT
// Запись информации в блок USER
user.AppendChild(login);
user.AppendChild(pass);
user.AppendChild(id);
user.AppendChild(content);
// Заносим запись в документ
if (xmlDocument.DocumentElement != null)
xmlDocument.DocumentElement.AppendChild(user);
fileStream.Close(); // Закрываем поток
xmlDocument.Save(filename); // Сохраняем файл
MessageBox.Show(@"Данные успешно занесены в базу.", @"Сообщение",
MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
catch (Exception)
{
MessageBox.Show(@"Что та пошло не так ;(", @"Опаньки",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
// Поиск по БД
private void ReadXmlDocument(string filename, string logId)
{
try
{
// Загрузка БД
var xmlDocument = new XmlDocument();
var fileStream = new FileStream(filename, FileMode.Open);
xmlDocument.Load(fileStream);
var list = xmlDocument.GetElementsByTagName("user"); // Создаем и заполняем лист по тегу "user"
int i = 0; //создание счетчика
foreach (XmlNode node in list)
{
var id = (XmlElement)xmlDocument.GetElementsByTagName("id")[i]; // поместить id в переменную
var pass = (XmlElement)xmlDocument.GetElementsByTagName("password")[i]; // поместить password в переменную
var info = (XmlElement)xmlDocument.GetElementsByTagName("content")[i]; // поместить content в переменную
if (node.ChildNodes[0].InnerText == logId)
{
// Вставляем в переменные текст из тегов
string content = info.InnerText;
string passWd = pass.InnerText;
string userId = id.InnerText;
// Заполняем поля на форме
tbPassSearch.Text = Decrypt(passWd); // Расшифровали пароль
tbIDSearch.Text = userId;
tbTextSearch.Text = content;
MessageBox.Show(@"Нашелся все такти ;)",
@"Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
break;
}
//Ели ничего нет очистим все поля
tbPassSearch.Text = "";
tbIDSearch.Text = "";
tbTextSearch.Text = "";
i++; //инкрементация счетчика
}
if (tbPassSearch.Text == "" && tbIDSearch.Text == "" &&
tbTextSearch.Text == "")
MessageBox.Show(@"В базе данных нет пользователя с таким логином.",
@"Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Error);
// Закрываем поток
fileStream.Close();
}
catch (Exception)
{
MessageBox.Show(@"Что та пошло не так ;(", @"Опаньки",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
// --- Begin Crypto --- //
// Использовал алгоритм шифрования Data Encryption Standard
// http://ru.wikipedia.org/wiki/DES
static readonly byte[] Bytes = Encoding.ASCII.GetBytes("ZeroCool");
public static string Encrypt(string originalString)
{
if (String.IsNullOrEmpty(originalString))
{
throw new ArgumentNullException("originalString");
}
var cryptoProvider = new DESCryptoServiceProvider();
var memoryStream = new MemoryStream();
var cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateEncryptor(Bytes, Bytes), CryptoStreamMode.Write);
var writer = new StreamWriter(cryptoStream);
writer.Write(originalString);
writer.Flush();
cryptoStream.FlushFinalBlock();
writer.Flush();
return Convert.ToBase64String(memoryStream.GetBuffer(), 0, (int)memoryStream.Length);
}
public static string Decrypt(string decryptedString)
{
if (String.IsNullOrEmpty(decryptedString))
{
throw new ArgumentNullException("decryptedString");
}
var cryptoProvider = new DESCryptoServiceProvider();
var memoryStream = new MemoryStream(Convert.FromBase64String(decryptedString));
var cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateDecryptor(Bytes, Bytes), CryptoStreamMode.Read);
var reader = new StreamReader(cryptoStream);
return reader.ReadToEnd();
}
// --- End Crypto --- //
private void butWrite_Click(object sender, EventArgs e)
{
WriteToXmlDocument("DB.xml", logBox.Text, passBox.Text, idBox.Text, textBox.Text);
}
private void butSearch_Click(object sender, EventArgs e)
{
ReadXmlDocument("DB.xml", tbSearchLog.Text);
}
Как все работает:

Ну надеюсь я правильно все сделал :)
Уважаемый анонимный читатель если что та будет не понятно пишите в комментариях к статье, не стесняйтесь. ;)
P.S. Помните, чтоб чему либо обучится и понимать как все это работает не используйте тупой копипаст, а анализируйте каждую строчку.

Недавно один из моих анонимных :) читателей попросил меня помочь написать программу для шифрования отдельных тегов в xml документе для скрытия от “лишних глаз”.
Чтоб понять что именно требуется сделать можете посмотрeте нашу переписку здесь.
Ну в принципе ничего сложного нет, но так как я хороший человек то помогу :)
Код программы получился (как не странно) доволи таки большой, и каждую строчку описывать мне не хочется, то я его просто вставлю сюда, да и почти все прокомментировано.
public MainForm()До идеала конечно недотягивает, но на скорую руку сойдет ;)
{
InitializeComponent();
// Проверка на наличие БД
// если нет, то создать
if (!File.Exists("DB.xml"))
CreateXmlDocument("DB.xml");
}
// Создать БД
private void CreateXmlDocument(string filename)
{
var xmlTextWriter = new XmlTextWriter(filename, Encoding.UTF32);
xmlTextWriter.WriteStartDocument();
xmlTextWriter.WriteStartElement("DBInfo");
xmlTextWriter.WriteEndDocument();
xmlTextWriter.Close();
}
// Запись в БД
private void WriteToXmlDocument(string filename, string name, string pasPd,
string number, string myText)
{
try
{
var xmlDocument = new XmlDocument();
var fileStream = new FileStream(filename, FileMode.Open);
xmlDocument.Load(fileStream);
// Создаем новую запись USER c атрибутом дд/мм/гг/ + время
var user = xmlDocument.CreateElement("user");
user.SetAttribute("count", DateTime.Now.ToString(CultureInfo.InvariantCulture));
// Создаем поля для данных о пользователе
var login = xmlDocument.CreateElement("login");
var pass = xmlDocument.CreateElement("password");
var id = xmlDocument.CreateElement("id");
var content = xmlDocument.CreateElement("content");
string passCrypto = Encrypt(pasPd); // Зашифровали пароль
// Создаем записи для данных о пользователе
var tLogin = xmlDocument.CreateTextNode(name);
var tPassword = xmlDocument.CreateTextNode(passCrypto);
var tId = xmlDocument.CreateTextNode(number);
var tContent = xmlDocument.CreateTextNode(myText);
login.AppendChild(tLogin); // Заносим значение логина в поле LOGIN
pass.AppendChild(tPassword); // Заносим значение пароля в поле PASSWORD
id.AppendChild(tId); // Заносим значение id в поле ID
content.AppendChild(tContent); // Заносим контента пароля в поле CONTENT
// Запись информации в блок USER
user.AppendChild(login);
user.AppendChild(pass);
user.AppendChild(id);
user.AppendChild(content);
// Заносим запись в документ
if (xmlDocument.DocumentElement != null)
xmlDocument.DocumentElement.AppendChild(user);
fileStream.Close(); // Закрываем поток
xmlDocument.Save(filename); // Сохраняем файл
MessageBox.Show(@"Данные успешно занесены в базу.", @"Сообщение",
MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
catch (Exception)
{
MessageBox.Show(@"Что та пошло не так ;(", @"Опаньки",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
// Поиск по БД
private void ReadXmlDocument(string filename, string logId)
{
try
{
// Загрузка БД
var xmlDocument = new XmlDocument();
var fileStream = new FileStream(filename, FileMode.Open);
xmlDocument.Load(fileStream);
var list = xmlDocument.GetElementsByTagName("user"); // Создаем и заполняем лист по тегу "user"
int i = 0; //создание счетчика
foreach (XmlNode node in list)
{
var id = (XmlElement)xmlDocument.GetElementsByTagName("id")[i]; // поместить id в переменную
var pass = (XmlElement)xmlDocument.GetElementsByTagName("password")[i]; // поместить password в переменную
var info = (XmlElement)xmlDocument.GetElementsByTagName("content")[i]; // поместить content в переменную
if (node.ChildNodes[0].InnerText == logId)
{
// Вставляем в переменные текст из тегов
string content = info.InnerText;
string passWd = pass.InnerText;
string userId = id.InnerText;
// Заполняем поля на форме
tbPassSearch.Text = Decrypt(passWd); // Расшифровали пароль
tbIDSearch.Text = userId;
tbTextSearch.Text = content;
MessageBox.Show(@"Нашелся все такти ;)",
@"Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
break;
}
//Ели ничего нет очистим все поля
tbPassSearch.Text = "";
tbIDSearch.Text = "";
tbTextSearch.Text = "";
i++; //инкрементация счетчика
}
if (tbPassSearch.Text == "" && tbIDSearch.Text == "" &&
tbTextSearch.Text == "")
MessageBox.Show(@"В базе данных нет пользователя с таким логином.",
@"Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Error);
// Закрываем поток
fileStream.Close();
}
catch (Exception)
{
MessageBox.Show(@"Что та пошло не так ;(", @"Опаньки",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
// --- Begin Crypto --- //
// Использовал алгоритм шифрования Data Encryption Standard
// http://ru.wikipedia.org/wiki/DES
static readonly byte[] Bytes = Encoding.ASCII.GetBytes("ZeroCool");
public static string Encrypt(string originalString)
{
if (String.IsNullOrEmpty(originalString))
{
throw new ArgumentNullException("originalString");
}
var cryptoProvider = new DESCryptoServiceProvider();
var memoryStream = new MemoryStream();
var cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateEncryptor(Bytes, Bytes), CryptoStreamMode.Write);
var writer = new StreamWriter(cryptoStream);
writer.Write(originalString);
writer.Flush();
cryptoStream.FlushFinalBlock();
writer.Flush();
return Convert.ToBase64String(memoryStream.GetBuffer(), 0, (int)memoryStream.Length);
}
public static string Decrypt(string decryptedString)
{
if (String.IsNullOrEmpty(decryptedString))
{
throw new ArgumentNullException("decryptedString");
}
var cryptoProvider = new DESCryptoServiceProvider();
var memoryStream = new MemoryStream(Convert.FromBase64String(decryptedString));
var cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateDecryptor(Bytes, Bytes), CryptoStreamMode.Read);
var reader = new StreamReader(cryptoStream);
return reader.ReadToEnd();
}
// --- End Crypto --- //
private void butWrite_Click(object sender, EventArgs e)
{
WriteToXmlDocument("DB.xml", logBox.Text, passBox.Text, idBox.Text, textBox.Text);
}
private void butSearch_Click(object sender, EventArgs e)
{
ReadXmlDocument("DB.xml", tbSearchLog.Text);
}
Как все работает:

Ну надеюсь я правильно все сделал :)
Уважаемый анонимный читатель если что та будет не понятно пишите в комментариях к статье, не стесняйтесь. ;)
P.S. Помните, чтоб чему либо обучится и понимать как все это работает не используйте тупой копипаст, а анализируйте каждую строчку.
0 коммент.:
Отправить комментарий