"Оцифровка" бизнес-процессов.

   
     +7 (910) 778-05-31, romanb@nxt.ru
Коснитесь для звонка

Пример использования электронной цифровой подписи(RSA) 1С:Предприятие 8

Внимание! Приведенная информация распространяется исключительно в ознакомительных целях. Перед использованием данных материалов рекомендуется ознакомиться с ФЗ Российской Федерации от 4 мая 2011 г. N 99-ФЗ "О лицензировании отдельных видов деятельности".

Обработка является примером работы с RSA(одним из алгоритмов ЭЦП) из 1С:Предприятие: создает и проверяет электронную цифровую подпись.

Поскольку это просто демо-пример, то ключи генерируются каждый раз новые.

Скачать обработку можно по ссылке внизу страницы.

 //**************************************************************************************
Функция СтрокаВДвоичныйВид(ВходнаяСтрока) Экспорт

	Поток = Новый COMОбъект("ADODB.Stream");
	Поток.Open();
	Поток.Type = 2;
	Поток.Charset = "utf-8";
	Поток.WriteText(ВходнаяСтрока);

	Поток.Position = 0;
	Поток.Type = 1;

	ДвоичныеДанные = Поток.Read(-1);

	Поток.Close();
	Поток = Неопределено;

	Возврат ДвоичныеДанные;
	
КонецФункции

//**************************************************************************************
Функция ДвоичныеДанныеВстроку(ДвоичныеДанные) Экспорт

	Поток = Новый COMОбъект("ADODB.Stream");
	Поток.Open();
	Поток.Type = 1;
	Поток.Write(ДвоичныеДанные);

	Поток.Position = 0;
	Поток.Type = 2;
	Поток.Charset = "utf-8";

	ВыхСтр = Поток.ReadText(-1);

	Поток.Close();
	Поток = Неопределено;

	Возврат ВыхСтр;
	
КонецФункции

//**************************************************************************************
Функция ДвоичныеДанныеВBase64(bin) Экспорт
	
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла();

	Поток = Новый COMОбъект("ADODB.Stream");
	Поток.Open();
	Поток.Type = 1;
	Поток.Write(bin);
	Поток.SaveToFile(ИмяВременногоФайла, 1);
	Поток.Close();
	Поток = Неопределено;

	ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
	УдалитьФайлы(ИмяВременногоФайла);

	Возврат Base64Строка(ДвоичныеДанные);
	
КонецФункции

//**************************************************************************************
Функция Base64ВДвоичныеДанные(ВхСтрока) Экспорт
	
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
	ДвоичныеДанные = Base64Значение(ВхСтрока);
	ДвоичныеДанные.Записать(ИмяВременногоФайла);

	Поток = Новый COMОбъект("ADODB.Stream");
	Поток.Open();
	Поток.Type = 1;
	Поток.LoadFromFile(ИмяВременногоФайла);
	ДвоичныеДанные = Поток.Read(-1);
	Поток.Close();
	Поток = Неопределено;

	УдалитьФайлы(ИмяВременногоФайла);
	Возврат ДвоичныеДанные;
	
КонецФункции

//******************************************************************
Процедура RSAСоздатьКлючи(КлючШифрования, КлючШифрованияИРасшифрования) Экспорт
	
	//http://msdn.microsoft.com/ru-ru/library/system.security.cryptography.rsa.toxmlstring.aspx
	
	ОбъектКриптографии = Новый COMОбъект("System.Security.Cryptography.RSACryptoServiceProvider");
	КлючШифрования = ОбъектКриптографии.ToXmlString(False);
	КлючШифрованияИРасшифрования = ОбъектКриптографии.ToXmlString(True);
	ОбъектКриптографии = Неопределено;
	
КонецПроцедуры

////******************************************************************
Функция RSAПодписать(ЗакрытыйИОткрытыйКлючОтправителя, ИсходныеДвоичныеДанные) Экспорт
	
	ОбъектКриптографии = Новый COMОбъект("System.Security.Cryptography.RSACryptoServiceProvider");
	ОбъектКриптографии.FromXmlString(ЗакрытыйИОткрытыйКлючОтправителя);

	ОбъектХеша = Новый COMОбъект("System.Security.Cryptography.SHA1CryptoServiceProvider");
	Хеш = ОбъектХеша.ComputeHash_2(ИсходныеДвоичныеДанные);

	ДвоичныйВидХеша = ОбъектКриптографии.SignHash(Хеш, "SHA1");

	ОбъектКриптографии = Неопределено;
	ОбъектХеша = Неопределено;

	Возврат ДвоичныйВидХеша;
	
КонецФункции

////******************************************************************
Функция RSAПроверитьПодпись(ОткрытыйКлючОтправителя, ИсходныеДвоичныеДанные, ДвоичныйВидПодписи) Экспорт
	
	ОбъектКриптографии = Новый COMОбъект("System.Security.Cryptography.RSACryptoServiceProvider");
	ОбъектКриптографии.FromXmlString(ОткрытыйКлючОтправителя);

	ОбъектХеша = Новый COMОбъект("System.Security.Cryptography.SHA1CryptoServiceProvider");
	Хеш = ОбъектХеша.ComputeHash_2(ИсходныеДвоичныеДанные);

	Результат = ОбъектКриптографии.VerifyHash(Хеш, "SHA1", ДвоичныйВидПодписи);

	ОбъектКриптографии = Неопределено;
	ОбъектХеша = Неопределено;

	Возврат Результат;
	
КонецФункции

//**************************************************************************************
Процедура ПодписатьПроверитьПодписьНажатие(Элемент)
		
	ДвочиныйВидСтроки = СтрокаВДвоичныйВид(ИсхТекстСтрока);

	ОткрытыйКлючОтправителя = "";
	ЗакрытыйИОткрытыйКлючОтправителя = "";
	RSAСоздатьКлючи(ОткрытыйКлючОтправителя, ЗакрытыйИОткрытыйКлючОтправителя);
	
	Сообщить("XML-представление открытого ключа отправителя:");
	Сообщить(ОткрытыйКлючОтправителя);
	Сообщить("XML-представление закрытого и открытого ключа отправителя:");
	Сообщить(ЗакрытыйИОткрытыйКлючОтправителя);

	ДвоичныйВидПодписи = RSAПодписать(ЗакрытыйИОткрытыйКлючОтправителя, ДвочиныйВидСтроки);
    Base64ВидПодписи = ДвоичныеДанныеВBase64(ДвоичныйВидПодписи);
	Сообщить("Base64 вид подписи:");
	Сообщить(Base64ВидПодписи);
	
	ДвоичныйВидПодписи = Base64ВДвоичныеДанные(Base64ВидПодписи);
	
	РезультатПроверкиПодписи = RSAПроверитьПодпись(ОткрытыйКлючОтправителя, ДвочиныйВидСтроки, ДвоичныйВидПодписи);
	Если СокрЛП(РезультатПроверкиПодписи) = "Да" Тогда
		РезультатПроверкиПодписи = "Подпись верна!";
	Иначе
		РезультатПроверкиПодписи = "!!! Подпись НЕ верна !!!";
	КонецЕсли;
	
	Сообщить(РезультатПроверкиПодписи);
	
КонецПроцедуры

Скачать обработку

Внимание! Приведенная информация распространяется исключительно в ознакомительных целях. Перед использованием данных материалов рекомендуется ознакомиться с ФЗ Российской Федерации от 4 мая 2011 г. N 99-ФЗ "О лицензировании отдельных видов деятельности".

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *