//Переводим документ в бинарный файл private void button6_Click(object sender, EventArgs e) { // определяем, какой заказ следует сериализовать // код создания объекта (Zakaz c) аналогичен предыдущему примеру // определяем, какой заказ выбран для генерации документа if (dataGridView1.SelectedRows.Count == 0) { return; } //получение номера текущего выбранного заказа nom = (int)dataGridView1.SelectedRows[0].Cells["НомерЗаказа"].Value; //получение даты текущего выбранного заказа date = (DateTime)dataGridView1.SelectedRows[0].Cells["ДатаЗаказа"].Value; // поиск заказа по ключу DataRow dr = ds.Tables["Заказы"].Rows.Find(new object[] { (object)nom, (object)date }); // создаем объект заказа для последующей сериализации Zakaz c = new Zakaz((int)dr["IDЗаказчика"], (int)dr["IDИсполнителя"], (int)dr["НомерЗаказа"], (DateTime)dr["ДатаЗаказа"], (string)dr["Предмет/Тема"], (int)dr["Стоимость"]); // создание объекта стандартного диалогового окна // выбора файла для сохранения SaveFileDialog dlg = new SaveFileDialog(); // показ диалогового окна на экране и проверка, по какой кнопке // (ОК или Отмена) было произведено его закрытие if (dlg.ShowDialog() == DialogResult.OK) { // создание файлового потока, в который будет // сериализоваться информация о заказе - создание файла // имя файла поставляется свойством диалога сохранения файла FileName FileStream fs = new FileStream(dlg.FileName, FileMode.Create); // создание форматера типа Binary // SOAP НЕ ПОДДЕРЖИВАЛСЯ! BinaryFormatter bin = new BinaryFormatter(); // сериализация объекта-чека c. Первый параметр – файловый поток, // второй параметр – сериализованный объект bin.Serialize(fs, c); // закрытие файла fs.Close(); MessageBox.Show("Файл сформирован!"); } }
//Верифицируем - проверяем документ private void button7_Click(object sender, EventArgs e) { // создаем объект выбранного заказа // определяем, выбран ли хотя бы один заказ if (dataGridView1.SelectedRows.Count == 0) { return; } else { //получение номера текущего выбранного заказа nom = (int)dataGridView1.SelectedRows[0].Cells["НомерЗаказа"].Value; // проверка, имеется ли цифровая подпись выбранного чека, // т.е. имеется ли соответствующий файл if (!File.Exists("Zakaz" + nom + ".dat")) { MessageBox.Show("Ещё не создана цифровая подпись!"); return; } else { // создаем объект выбранного заказа аналогично предыдущей функции // (объект с класса Zakaz) MessageBox.Show(nom.ToString()); //получение номера текущего выбранного заказа date = (DateTime)dataGridView1.SelectedRows[0].Cells["ДатаЗаказа"].Value; // поиск заказа по ключу DataRow dr = ds.Tables["Заказы"].Rows.Find(new object[] { (object)nom, (object)date }); // создаем объект заказа для последующей сериализации Zakaz c = new Zakaz((int)dr["IDЗаказчика"], (int)dr["IDИсполнителя"], (int)dr["НомерЗаказа"], (DateTime)dr["ДатаЗаказа"], (string)dr["Предмет/Тема"], (int)dr["Стоимость"]); // проводим генерацию хэш-значения для объекта c // бинарная сериализация объекта для формирования цифровой подписи BinaryFormatter ser = new BinaryFormatter(); // создаем поток для сериализации объекта в оперативной памяти MemoryStream ms = new MemoryStream(); ser.Serialize(ms, c); // получаем массив байт, определяющий объект чека byte[] message = new byte[ms.Length]; ms.Read(message, 0, (int)ms.Length); // создаем провайдер для хэширования SHA1 sha1 = new SHA1CryptoServiceProvider(); // проводим хэширование byte[] hashMessage = sha1.ComputeHash(message); // работа с цифровой подписью - считываем подпись и // ключ из файла и осуществляем верификацию // читаем данные из файла-подписи BinaryReader br = new BinaryReader(new FileStream("Zakaz" + nom + ".dat", FileMode.Open)); // читаем ключ для шифрования string key = br.ReadString(); // читаем данные подписи int n_sign = br.ReadInt32(); byte[] b_sign = br.ReadBytes(n_sign); br.Close(); // импортируем параметры в провайдер шифрования DSACryptoServiceProvider dsa = new DSACryptoServiceProvider(); dsa.FromXmlString(key); // проводим верификацию подписей // первый параметр - сгенерированный хэш объекта // второй параметр - ключ // третий параметр - цифровая подпись if (dsa.VerifyHash(hashMessage, "1.3.14.3.2.26", b_sign)) { MessageBox.Show("Успешная верификация!"); } else { MessageBox.Show("Заказ был изменен. Ошибка верификации!"); } } } }
//Формируем цифровую подпись private void button8_Click(object sender, EventArgs e) { // создаем объект выбранного заказа // как и в примере из предыдущего раздела // В результате имеем заполненный объект класса Заказ с именем с // определяем, какой заказ следует сериализовать // код создания объекта (Zakaz c) аналогичен предыдущему примеру // определяем, какой заказ выбран для генерации документа if (dataGridView1.SelectedRows.Count == 0) { return; } //получение номера текущего выбранного заказа nom = (int)dataGridView1.SelectedRows[0].Cells["НомерЗаказа"].Value; //получение даты текущего выбранного заказа date = (DateTime)dataGridView1.SelectedRows[0].Cells["ДатаЗаказа"].Value; // поиск заказа по ключу DataRow dr = ds.Tables["Заказы"].Rows.Find(new object[] { (object)nom, (object)date }); // создаем объект заказа для последующей сериализации Zakaz c = new Zakaz((int)dr["IDЗаказчика"], (int)dr["IDИсполнителя"], (int)dr["НомерЗаказа"], (DateTime)dr["ДатаЗаказа"], (string)dr["Предмет/Тема"], (int)dr["Стоимость"]); // хэшировать будем по двоичному коду объекта класса Zakaz // проводим бинарную сериализацию объекта c // создаем объект-форматер BinaryFormatter ser = new BinaryFormatter(); // создаем поток для сериализации объекта в оперативной памяти MemoryStream ms = new MemoryStream(); // проводим сериализацию в память ser.Serialize(ms, c); // получаем массив байт, определяющий объект заказа, // считывая из потока в памяти byte[] message = new byte[ms.Length]; ms.Read(message, 0, (int)ms.Length); // хэшируем заказ // создаем провайдер для хэширования SHA1 sha1 = new SHA1CryptoServiceProvider(); // проводим хэширование byte[] hashMessage = sha1.ComputeHash(message); // получаем цифровую подпись с помощью алгоритма DSA DSACryptoServiceProvider dsa = new DSACryptoServiceProvider(); // цифровая подпись – это также набор байт. // Второй параметр метода – своеобразный ключ byte[] signature = dsa.SignHash(hashMessage, "1.3.14.3.2.26"); // сохраняем параметры ключа в виде структурированной строки string key = dsa.ToXmlString(true); // сохраним подпись данного документа в бинарном файле, // имя которого зависит от номера Заказа BinaryWriter br = new BinaryWriter(new FileStream("Zakaz" + c.НомерЗаказа + ".dat", FileMode.Create)); // сохраняем ключ в созданный файл br.Write(key); // сохраняем в файл цифровую подпись // сначала количество байт br.Write(signature.Length); // затем саму подпись br.Write(signature); // закрываем файл с подписью br.Close(); MessageBox.Show("Создана цифровая подпись!"); }
//Генерация заказа в Word-файл private void button5_Click(object sender, EventArgs e) { // определяем, какой заказ выбран для генерации документа if (dataGridView1.SelectedRows.Count == 0) { return; } //получение номера текущего выбранного заказа nom = (int)dataGridView1.SelectedRows[0].Cells["НомерЗаказа"].Value; //получение даты текущего выбранного заказа date = (DateTime)dataGridView1.SelectedRows[0].Cells["ДатаЗаказа"].Value; // поиск заказа по ключу DataRow dr = ds.Tables["Заказы"].Rows.Find(new object[] { (object)nom, (object)date }); // создаем объект заказа для последующей сериализации Zakaz c = new Zakaz((int)dr["IDЗаказчика"], (int)dr["IDИсполнителя"], (int)dr["НомерЗаказа"], (DateTime)dr["ДатаЗаказа"], (string)dr["Предмет/Тема"], (int)dr["Стоимость"]); // выбираем все ЗаписьОплаты, соответствующие выбранному Заказу DataRow[] drs = ds.Tables["ЗаписьОплаты"].Select("НомерЗаказа=" + nom + " and ДатаЗаказа='" + date + "'"); // добавляем информацию в объект заказа foreach (DataRow d in drs) { Oplata z = new Oplata((int)d["НомерЗаказа"], (int)d["Предоплата"], (bool)d["Оплачено/НеОплачено"], (DateTime)d["ДатаОплаты"]); c.AddOplata(z); } // работа с документами Word // создание объекта-приложения Word.Application app = new Word.Application(); // создание и добавление объекта-документа MS Word Word.Document doc = app.Documents.Add(); // создание параграфа с заголовком (указание номера и даты заказа) Word.Paragraph p = doc.Content.Paragraphs.Add(); // задание текста параграфа p.Range.Text = "Заказ №" + c.НомерЗаказа + " от " + c.ДатаЗаказа; // указание, что шрифт должен быть полужирным p.Range.Font.Bold = 1; // центрирование абзаца p.Format.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter; // устанавливаем межабзацный отступ p.Format.SpaceAfter = 20; p.Range.InsertParagraphAfter(); // вставка параграфа с указанием Заказчика p = doc.Content.Paragraphs.Add(); p.Range.Text = "ID Заказчика: " + c.IDЗаказчика; p.Format.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft; p.Format.SpaceAfter = 20; p.Range.InsertParagraphAfter(); // вставка параграфа с указанием Исполнителя p = doc.Content.Paragraphs.Add(); p.Range.Text = "ID Исполнителя: " + c.IDИсполнителя; p.Format.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft; p.Format.SpaceAfter = 20; p.Range.InsertParagraphAfter(); // вставка параграфа с указанием ПредметаТемы p = doc.Content.Paragraphs.Add(); p.Range.Text = "Предмет/Тема: " + c.ПредметТема; p.Format.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft; p.Format.SpaceAfter = 20; p.Range.InsertParagraphAfter(); // вставка параграфа с указанием общей суммы по Заказу p = doc.Content.Paragraphs.Add(); p.Range.Text = "Сумма: " + c.Стоимость; p.Format.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft; p.Range.Font.Size = 20; p.Format.SpaceAfter = 20; p.Range.InsertParagraphAfter(); // вставка параграфа с таблицей, в которой указана детальная // информация об оплате заказа p = doc.Content.Paragraphs.Add(); // при создании таблицы указывается ее // количество строк и столбцов (2 и 3 параметры) Word.Table tab = doc.Tables.Add(p.Range, 1 + c.Список.Count, 4); // указание, что таблица должна иметь рамку tab.Borders.Enable = 1; // заполняем ячейки таблицы – обращение к таблице осуществляется // с помощью функции Cell(номер строки, номер столбца) // отметим, что нумерация строк и столбцов начинается с 1 tab.Cell(1, 1).Range.Text = "НомерЗаказа"; tab.Cell(1, 2).Range.Text = "Предоплата"; tab.Cell(1, 3).Range.Text = "Оплачено Да/Нет"; tab.Cell(1, 4).Range.Text = "Дата оплаты"; // просматриваем список купленных товаров и заполняем остальные строки таблицы for (int i = 0; i < c.Список.Count; i++) { tab.Cell(i + 2, 1).Range.Text = "" + (c.Список[i] as Oplata).НомерЗаказа; tab.Cell(i + 2, 2).Range.Text = "" + (c.Список[i] as Oplata).Предоплата; tab.Cell(i + 2, 3).Range.Text = "" + (c.Список[i] as Oplata).Оплаченность; tab.Cell(i + 2, 4).Range.Text = "" + (c.Список[i] as Oplata).ДатаОплаты; } // сохранение документа doc.Save(); // активируем окно MS Word для просмотра сгенерированного документа app.Visible = true; }
//Верифицируем - проверяем документ private void button7_Click(object sender, EventArgs e) { // создаем объект выбранного заказа // определяем, выбран ли хотя бы один заказ if (dataGridView1.SelectedRows.Count == 0) return; else { //получение номера текущего выбранного заказа nom = (int)dataGridView1.SelectedRows[0].Cells["НомерЗаказа"].Value; // проверка, имеется ли цифровая подпись выбранного чека, // т.е. имеется ли соответствующий файл if (!File.Exists("Zakaz" + nom + ".dat")) { MessageBox.Show("Ещё не создана цифровая подпись!"); return; } else { // создаем объект выбранного заказа аналогично предыдущей функции // (объект с класса Zakaz) MessageBox.Show(nom.ToString()); //получение номера текущего выбранного заказа date = (DateTime)dataGridView1.SelectedRows[0].Cells["ДатаЗаказа"].Value; // поиск заказа по ключу DataRow dr = ds.Tables["Заказы"].Rows.Find(new object[] { (object)nom, (object)date }); // создаем объект заказа для последующей сериализации Zakaz c = new Zakaz((int)dr["IDЗаказчика"], (int)dr["IDИсполнителя"], (int)dr["НомерЗаказа"], (DateTime)dr["ДатаЗаказа"], (string)dr["Предмет/Тема"], (int)dr["Стоимость"]); // проводим генерацию хэш-значения для объекта c // бинарная сериализация объекта для формирования цифровой подписи BinaryFormatter ser = new BinaryFormatter(); // создаем поток для сериализации объекта в оперативной памяти MemoryStream ms = new MemoryStream(); ser.Serialize(ms, c); // получаем массив байт, определяющий объект чека byte[] message = new byte[ms.Length]; ms.Read(message, 0, (int)ms.Length); // создаем провайдер для хэширования SHA1 sha1 = new SHA1CryptoServiceProvider(); // проводим хэширование byte[] hashMessage = sha1.ComputeHash(message); // работа с цифровой подписью - считываем подпись и // ключ из файла и осуществляем верификацию // читаем данные из файла-подписи BinaryReader br = new BinaryReader(new FileStream("Zakaz" + nom + ".dat", FileMode.Open)); // читаем ключ для шифрования string key = br.ReadString(); // читаем данные подписи int n_sign = br.ReadInt32(); byte[] b_sign = br.ReadBytes(n_sign); br.Close(); // импортируем параметры в провайдер шифрования DSACryptoServiceProvider dsa = new DSACryptoServiceProvider(); dsa.FromXmlString(key); // проводим верификацию подписей // первый параметр - сгенерированный хэш объекта // второй параметр - ключ // третий параметр - цифровая подпись if (dsa.VerifyHash(hashMessage, "1.3.14.3.2.26", b_sign)) { MessageBox.Show("Успешная верификация!"); } else { MessageBox.Show("Заказ был изменен. Ошибка верификации!"); } } } }
//Формируем цифровую подпись private void button8_Click(object sender, EventArgs e) { // создаем объект выбранного заказа // как и в примере из предыдущего раздела // В результате имеем заполненный объект класса Заказ с именем с // определяем, какой заказ следует сериализовать // код создания объекта (Zakaz c) аналогичен предыдущему примеру // определяем, какой заказ выбран для генерации документа if (dataGridView1.SelectedRows.Count == 0) return; //получение номера текущего выбранного заказа nom = (int)dataGridView1.SelectedRows[0].Cells["НомерЗаказа"].Value; //получение даты текущего выбранного заказа date = (DateTime)dataGridView1.SelectedRows[0].Cells["ДатаЗаказа"].Value; // поиск заказа по ключу DataRow dr = ds.Tables["Заказы"].Rows.Find(new object[] { (object)nom, (object)date }); // создаем объект заказа для последующей сериализации Zakaz c = new Zakaz((int)dr["IDЗаказчика"], (int)dr["IDИсполнителя"], (int)dr["НомерЗаказа"], (DateTime)dr["ДатаЗаказа"], (string)dr["Предмет/Тема"], (int)dr["Стоимость"]); // хэшировать будем по двоичному коду объекта класса Zakaz // проводим бинарную сериализацию объекта c // создаем объект-форматер BinaryFormatter ser = new BinaryFormatter(); // создаем поток для сериализации объекта в оперативной памяти MemoryStream ms = new MemoryStream(); // проводим сериализацию в память ser.Serialize(ms, c); // получаем массив байт, определяющий объект заказа, // считывая из потока в памяти byte[] message = new byte[ms.Length]; ms.Read(message, 0, (int)ms.Length); // хэшируем заказ // создаем провайдер для хэширования SHA1 sha1 = new SHA1CryptoServiceProvider(); // проводим хэширование byte[] hashMessage = sha1.ComputeHash(message); // получаем цифровую подпись с помощью алгоритма DSA DSACryptoServiceProvider dsa = new DSACryptoServiceProvider(); // цифровая подпись – это также набор байт. // Второй параметр метода – своеобразный ключ byte[] signature = dsa.SignHash(hashMessage, "1.3.14.3.2.26"); // сохраняем параметры ключа в виде структурированной строки string key = dsa.ToXmlString(true); // сохраним подпись данного документа в бинарном файле, // имя которого зависит от номера Заказа BinaryWriter br = new BinaryWriter(new FileStream("Zakaz"+c.НомерЗаказа+".dat", FileMode.Create)); // сохраняем ключ в созданный файл br.Write(key); // сохраняем в файл цифровую подпись // сначала количество байт br.Write(signature.Length); // затем саму подпись br.Write(signature); // закрываем файл с подписью br.Close(); MessageBox.Show("Создана цифровая подпись!"); }
//Переводим документ в бинарный файл private void button6_Click(object sender, EventArgs e) { // определяем, какой заказ следует сериализовать // код создания объекта (Zakaz c) аналогичен предыдущему примеру // определяем, какой заказ выбран для генерации документа if (dataGridView1.SelectedRows.Count == 0) return; //получение номера текущего выбранного заказа nom = (int)dataGridView1.SelectedRows[0].Cells["НомерЗаказа"].Value; //получение даты текущего выбранного заказа date = (DateTime)dataGridView1.SelectedRows[0].Cells["ДатаЗаказа"].Value; // поиск заказа по ключу DataRow dr = ds.Tables["Заказы"].Rows.Find(new object[] { (object)nom, (object)date }); // создаем объект заказа для последующей сериализации Zakaz c = new Zakaz((int)dr["IDЗаказчика"], (int)dr["IDИсполнителя"], (int)dr["НомерЗаказа"], (DateTime)dr["ДатаЗаказа"], (string)dr["Предмет/Тема"], (int)dr["Стоимость"]); // создание объекта стандартного диалогового окна // выбора файла для сохранения SaveFileDialog dlg = new SaveFileDialog(); // показ диалогового окна на экране и проверка, по какой кнопке // (ОК или Отмена) было произведено его закрытие if (dlg.ShowDialog() == DialogResult.OK) { // создание файлового потока, в который будет // сериализоваться информация о заказе - создание файла // имя файла поставляется свойством диалога сохранения файла FileName FileStream fs = new FileStream(dlg.FileName, FileMode.Create); // создание форматера типа Binary // SOAP НЕ ПОДДЕРЖИВАЛСЯ! BinaryFormatter bin=new BinaryFormatter(); // сериализация объекта-чека c. Первый параметр – файловый поток, // второй параметр – сериализованный объект bin.Serialize(fs, c); // закрытие файла fs.Close(); MessageBox.Show("Файл сформирован!"); } }
//Генерация заказа в Word-файл private void button5_Click(object sender, EventArgs e) { // определяем, какой заказ выбран для генерации документа if (dataGridView1.SelectedRows.Count == 0) return; //получение номера текущего выбранного заказа nom = (int)dataGridView1.SelectedRows[0].Cells["НомерЗаказа"].Value; //получение даты текущего выбранного заказа date = (DateTime)dataGridView1.SelectedRows[0].Cells["ДатаЗаказа"].Value; // поиск заказа по ключу DataRow dr = ds.Tables["Заказы"].Rows.Find(new object[] { (object)nom, (object)date }); // создаем объект заказа для последующей сериализации Zakaz c = new Zakaz((int)dr["IDЗаказчика"],(int)dr["IDИсполнителя"],(int)dr["НомерЗаказа"],(DateTime)dr["ДатаЗаказа"],(string)dr["Предмет/Тема"],(int)dr["Стоимость"]); // выбираем все ЗаписьОплаты, соответствующие выбранному Заказу DataRow[] drs = ds.Tables["ЗаписьОплаты"].Select("НомерЗаказа=" + nom + " and ДатаЗаказа='" + date + "'"); // добавляем информацию в объект заказа foreach (DataRow d in drs) { Oplata z = new Oplata((int)d["НомерЗаказа"], (int)d["Предоплата"], (bool)d["Оплачено/НеОплачено"], (DateTime)d["ДатаОплаты"]); c.AddOplata(z); } // работа с документами Word // создание объекта-приложения Word.Application app = new Word.Application(); // создание и добавление объекта-документа MS Word Word.Document doc = app.Documents.Add(); // создание параграфа с заголовком (указание номера и даты заказа) Word.Paragraph p = doc.Content.Paragraphs.Add(); // задание текста параграфа p.Range.Text = "Заказ №" + c.НомерЗаказа + " от " + c.ДатаЗаказа; // указание, что шрифт должен быть полужирным p.Range.Font.Bold = 1; // центрирование абзаца p.Format.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter; // устанавливаем межабзацный отступ p.Format.SpaceAfter = 20; p.Range.InsertParagraphAfter(); // вставка параграфа с указанием Заказчика p = doc.Content.Paragraphs.Add(); p.Range.Text = "ID Заказчика: " + c.IDЗаказчика; p.Format.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft; p.Format.SpaceAfter = 20; p.Range.InsertParagraphAfter(); // вставка параграфа с указанием Исполнителя p = doc.Content.Paragraphs.Add(); p.Range.Text = "ID Исполнителя: " + c.IDИсполнителя; p.Format.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft; p.Format.SpaceAfter = 20; p.Range.InsertParagraphAfter(); // вставка параграфа с указанием ПредметаТемы p = doc.Content.Paragraphs.Add(); p.Range.Text = "Предмет/Тема: " + c.ПредметТема; p.Format.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft; p.Format.SpaceAfter = 20; p.Range.InsertParagraphAfter(); // вставка параграфа с указанием общей суммы по Заказу p = doc.Content.Paragraphs.Add(); p.Range.Text = "Сумма: " + c.Стоимость; p.Format.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft; p.Range.Font.Size = 20; p.Format.SpaceAfter = 20; p.Range.InsertParagraphAfter(); // вставка параграфа с таблицей, в которой указана детальная // информация об оплате заказа p = doc.Content.Paragraphs.Add(); // при создании таблицы указывается ее // количество строк и столбцов (2 и 3 параметры) Word.Table tab = doc.Tables.Add(p.Range, 1 + c.Список.Count, 4); // указание, что таблица должна иметь рамку tab.Borders.Enable = 1; // заполняем ячейки таблицы – обращение к таблице осуществляется // с помощью функции Cell(номер строки, номер столбца) // отметим, что нумерация строк и столбцов начинается с 1 tab.Cell(1, 1).Range.Text = "НомерЗаказа"; tab.Cell(1, 2).Range.Text = "Предоплата"; tab.Cell(1, 3).Range.Text = "Оплачено Да/Нет"; tab.Cell(1, 4).Range.Text = "Дата оплаты"; // просматриваем список купленных товаров и заполняем остальные строки таблицы for (int i = 0; i < c.Список.Count; i++) { tab.Cell(i + 2, 1).Range.Text = "" + (c.Список[i] as Oplata).НомерЗаказа; tab.Cell(i + 2, 2).Range.Text = "" + (c.Список[i] as Oplata).Предоплата; tab.Cell(i + 2, 3).Range.Text = "" + (c.Список[i] as Oplata).Оплаченность; tab.Cell(i + 2, 4).Range.Text = "" + (c.Список[i] as Oplata).ДатаОплаты; } // сохранение документа doc.Save(); // активируем окно MS Word для просмотра сгенерированного документа app.Visible = true; }