Пример использования электронной цифровой подписи(RSA) 1С:Предприятие 8
- 2013-03-01
- Автор: admin
- Рубрика: 1C:Предприятие, Защита информации, Криптография
Внимание! Приведенная информация распространяется исключительно в ознакомительных целях. Перед использованием данных материалов рекомендуется ознакомиться с ФЗ Российской Федерации от 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-ФЗ "О лицензировании отдельных видов деятельности".