background img

The New Stuff

Работа с XML + шифрование отдельных тегов

crypto
Недавно один из моих анонимных :) читателей попросил меня помочь написать программу для шифрования отдельных тегов в 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);
}
До идеала конечно недотягивает, но на скорую руку сойдет ;)
Как все работает:
12На картинке видно как записываются данные о пользователях в xml файл и как по логину можно их найти и просмотреть (при чем пароль в читабельному виде), и показано как отображается xml документ в браузере для посторонних лиц (без нашей программы).
Ну надеюсь я правильно все сделал :)
Уважаемый анонимный читатель если что та будет не понятно пишите в комментариях к статье, не стесняйтесь. ;)
P.S. Помните, чтоб чему либо обучится и понимать как все это работает не используйте тупой копипаст, а анализируйте каждую строчку.
crypto
Недавно один из моих анонимных :) читателей попросил меня помочь написать программу для шифрования отдельных тегов в 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);
}
До идеала конечно недотягивает, но на скорую руку сойдет ;)
Как все работает:
12На картинке видно как записываются данные о пользователях в xml файл и как по логину можно их найти и просмотреть (при чем пароль в читабельному виде), и показано как отображается xml документ в браузере для посторонних лиц (без нашей программы).
Ну надеюсь я правильно все сделал :)
Уважаемый анонимный читатель если что та будет не понятно пишите в комментариях к статье, не стесняйтесь. ;)
P.S. Помните, чтоб чему либо обучится и понимать как все это работает не используйте тупой копипаст, а анализируйте каждую строчку.

0 коммент.:

Отправить комментарий

Popular Posts