<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>http://wiki.kint.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B2_%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_.Net_%D0%B8%D0%B7_1%D0%A1</id>
	<title>Использование средств шифрования .Net из 1С - История изменений</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.kint.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B2_%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_.Net_%D0%B8%D0%B7_1%D0%A1"/>
	<link rel="alternate" type="text/html" href="http://wiki.kint.ru/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B2_%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_.Net_%D0%B8%D0%B7_1%D0%A1&amp;action=history"/>
	<updated>2026-05-18T04:14:08Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.31.15</generator>
	<entry>
		<id>http://wiki.kint.ru/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B2_%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_.Net_%D0%B8%D0%B7_1%D0%A1&amp;diff=21550&amp;oldid=prev</id>
		<title>Павел Лазарев: Новая страница: «Категория:Примеры кода 1С  ==Шифрование в .Net==  Среда .Net предоставляет достаточно полны...»</title>
		<link rel="alternate" type="text/html" href="http://wiki.kint.ru/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B2_%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_.Net_%D0%B8%D0%B7_1%D0%A1&amp;diff=21550&amp;oldid=prev"/>
		<updated>2010-10-07T05:59:31Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «&lt;a href=&quot;/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0_1%D0%A1&quot; title=&quot;Категория:Примеры кода 1С&quot;&gt;Категория:Примеры кода 1С&lt;/a&gt;  ==Шифрование в .Net==  Среда &lt;a href=&quot;/index.php?title=.Net&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;.Net (страница не существует)&quot;&gt;.Net&lt;/a&gt; предоставляет достаточно полны...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Категория:Примеры кода 1С]]&lt;br /&gt;
&lt;br /&gt;
==Шифрование в .Net==&lt;br /&gt;
&lt;br /&gt;
Среда [[.Net]] предоставляет достаточно полный и удобный набор средств симметричного (DES,AES,RC2..) и асимметричного (RSA) шифрования.&lt;br /&gt;
&lt;br /&gt;
Эти средства собраны в пространстве имен [http://msdn.microsoft.com/ru-ru/library/system.security.cryptography.aspx System.Security.Cryptography] уже начиная с релиза 1.1 .Net. На современных компьютерах практически гарантированно стоит та или иная версия .Net.&lt;br /&gt;
&lt;br /&gt;
Благодаря тому, что значительная часть управляемого кода .Net прекрасно работает через шлюзы  [http://msdn.microsoft.com/ru-ru/library/6bw51z5z.aspx COM-interop], средства шифрования .Net можно использовать из скриптовых языков, поддерживающих COM-automation. Это можно делать из vbscript, jscript и из 1С.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Пример использования RSA-шифрования==&lt;br /&gt;
&lt;br /&gt;
{{notice|По умолчанию используются 1024-битные ключи RSA, что считается на сегодняшний день вполне надежным}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=1c&amp;gt;&lt;br /&gt;
Процедура Тест_ОбъектRSAиз1С_2() Экспорт&lt;br /&gt;
	strSrcTextValue = &amp;quot;abc тест&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	objCrypt = Новый COMОбъект(&amp;quot;System.Security.Cryptography.RSACryptoServiceProvider&amp;quot;);&lt;br /&gt;
	strXMLPrivateAndPublicKey = objCrypt.ToXmlString(True);&lt;br /&gt;
	strXMLPublicKey = objCrypt.ToXmlString(False);&lt;br /&gt;
	&lt;br /&gt;
	objCrypt.FromXmlString(strXMLPublicKey);&lt;br /&gt;
	&lt;br /&gt;
	binSrcTextValue = UtfToSafeArray(strSrcTextValue);&lt;br /&gt;
	binEncryptValue = objCrypt.Encrypt(binSrcTextValue, False);&lt;br /&gt;
	&lt;br /&gt;
	strEncryptValue = SafeArrayToBase64(binEncryptValue);&lt;br /&gt;
	&lt;br /&gt;
	Тестирование.ПроверитьНеРавенство(strSrcTextValue, strEncryptValue);&lt;br /&gt;
&lt;br /&gt;
	objCrypt.FromXmlString(strXMLPrivateAndPublicKey);&lt;br /&gt;
	&lt;br /&gt;
	binEncryptValue2 = Base64ToSafeArray(strEncryptValue);&lt;br /&gt;
	binDecryptValue = objCrypt.Decrypt(binEncryptValue2, False);&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	strDecryptValue = SafeArrayToUtf(binDecryptValue);&lt;br /&gt;
	&lt;br /&gt;
	Сообщить(&amp;quot;Decrypt: &amp;quot; + strDecryptValue);&lt;br /&gt;
	&lt;br /&gt;
	Тестирование.ПроверитьРавенство(strSrcTextValue, strDecryptValue);&lt;br /&gt;
	objCrypt = Неопределено;&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Функции поддержки преобразования параметров==&lt;br /&gt;
&lt;br /&gt;
Одна из основных сложностей состоит в преобразовании строк и бинарных данных в массивы COMSafaArray с типом элементов &amp;quot;VT_UI1&amp;quot;. Возможная реализация приведена ниже:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=1c&amp;gt;&lt;br /&gt;
Функция UtfToSafeArray(строка) Экспорт &lt;br /&gt;
	adTypeBinary = 1;&lt;br /&gt;
	adTypeText = 2;&lt;br /&gt;
	adReadAll = -1;&lt;br /&gt;
	csUTF8 = &amp;quot;utf-8&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	objStream = Новый COMОбъект(&amp;quot;ADODB.Stream&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	objStream.Open();&lt;br /&gt;
	objStream.Type = adTypeText;&lt;br /&gt;
	objStream.Charset = csUTF8;&lt;br /&gt;
	objStream.WriteText(строка);&lt;br /&gt;
	&lt;br /&gt;
	objStream.Position = 0;&lt;br /&gt;
	objStream.Type = adTypeBinary;&lt;br /&gt;
	&lt;br /&gt;
	bin = objStream.Read(adReadAll);&lt;br /&gt;
	&lt;br /&gt;
	objStream.Close();&lt;br /&gt;
	objStream = Неопределено;&lt;br /&gt;
	&lt;br /&gt;
	Return bin;&lt;br /&gt;
КонецФункции&lt;br /&gt;
&lt;br /&gt;
Функция SafeArrayToUtf(bin) Экспорт &lt;br /&gt;
	adTypeBinary = 1;&lt;br /&gt;
	adTypeText = 2;&lt;br /&gt;
	adReadAll = -1;&lt;br /&gt;
	csUTF8 = &amp;quot;utf-8&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	objStream = Новый COMОбъект(&amp;quot;ADODB.Stream&amp;quot;);&lt;br /&gt;
	objStream.Open();&lt;br /&gt;
	objStream.Type = adTypeBinary;&lt;br /&gt;
	objStream.Write(bin);&lt;br /&gt;
	&lt;br /&gt;
	objStream.Position = 0;&lt;br /&gt;
	objStream.Type = adTypeText;&lt;br /&gt;
	objStream.Charset = csUTF8;&lt;br /&gt;
	&lt;br /&gt;
	str = objStream.ReadText(adReadAll);&lt;br /&gt;
	&lt;br /&gt;
	objStream.Close();&lt;br /&gt;
	objStream = Неопределено;&lt;br /&gt;
	&lt;br /&gt;
	Return str;&lt;br /&gt;
КонецФункции&lt;br /&gt;
&lt;br /&gt;
Функция SafeArrayToBase64(bin) Экспорт &lt;br /&gt;
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла();&lt;br /&gt;
	&lt;br /&gt;
	adTypeBinary = 1;&lt;br /&gt;
	adSaveCreateNotExist = 1;&lt;br /&gt;
	objStream = Новый COMОбъект(&amp;quot;ADODB.Stream&amp;quot;);&lt;br /&gt;
	objStream.Open();&lt;br /&gt;
	objStream.Type = adTypeBinary;&lt;br /&gt;
	objStream.Write(bin);&lt;br /&gt;
	objStream.SaveToFile(ИмяВременногоФайла, adSaveCreateNotExist);&lt;br /&gt;
	objStream.Close();&lt;br /&gt;
	objStream = Неопределено;&lt;br /&gt;
	&lt;br /&gt;
	ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);&lt;br /&gt;
	УдалитьФайлы(ИмяВременногоФайла);&lt;br /&gt;
&lt;br /&gt;
	Возврат Base64Строка(ДвоичныеДанные);&lt;br /&gt;
КонецФункции&lt;br /&gt;
&lt;br /&gt;
Функция Base64ToSafeArray(str) Экспорт &lt;br /&gt;
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла();&lt;br /&gt;
	ДвоичныеДанные = Base64Значение(str);&lt;br /&gt;
	ДвоичныеДанные.Записать(ИмяВременногоФайла);&lt;br /&gt;
	&lt;br /&gt;
	adTypeBinary = 1;&lt;br /&gt;
	adReadAll = -1;&lt;br /&gt;
	objStream = Новый COMОбъект(&amp;quot;ADODB.Stream&amp;quot;);&lt;br /&gt;
	objStream.Open();&lt;br /&gt;
	objStream.Type = adTypeBinary;&lt;br /&gt;
	objStream.LoadFromFile(ИмяВременногоФайла);&lt;br /&gt;
	bin = objStream.Read(adReadAll);&lt;br /&gt;
	objStream.Close();&lt;br /&gt;
	objStream = Неопределено;&lt;br /&gt;
	&lt;br /&gt;
	УдалитьФайлы(ИмяВременногоФайла);&lt;br /&gt;
	Возврат bin;&lt;br /&gt;
КонецФункции&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Пример использования симметричного шифрования AES==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=1c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Процедура Тест_AESРасшифровать() Экспорт &lt;br /&gt;
	saKey = Неопределено;&lt;br /&gt;
	saIV = Неопределено;&lt;br /&gt;
	AESСоздатьКлюч(saKey, saIV);&lt;br /&gt;
	&lt;br /&gt;
	strSrc = &amp;quot;тест test&amp;quot;;&lt;br /&gt;
	binSrc = UtfToSafeArray(strSrc);&lt;br /&gt;
	&lt;br /&gt;
	binEnc = AESЗашифровать(saKey, saIV, binSrc);&lt;br /&gt;
	binDec = AESРасшифровать(saKey, saIV, binEnc);&lt;br /&gt;
	&lt;br /&gt;
	strDec = SafeArrayToUtf(binDec);&lt;br /&gt;
	&lt;br /&gt;
	Тестирование.ПроверитьРавенство(strSrc, strDec);&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Процедура AESСоздатьКлюч(saKey, saIV, KeySize = 128) Экспорт&lt;br /&gt;
	aes = Новый COMОбъект(&amp;quot;System.Security.Cryptography.RijndaelManaged&amp;quot;);&lt;br /&gt;
	aes.KeySize = KeySize;&lt;br /&gt;
	aes.GenerateKey();&lt;br /&gt;
	aes.GenerateIV();&lt;br /&gt;
	saKey = aes.Key;&lt;br /&gt;
	saIV = aes.IV;&lt;br /&gt;
	aes = Неопределено;&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
Функция AESЗашифровать(saKey, saIV, binSrc) Экспорт&lt;br /&gt;
	aes = Новый COMОбъект(&amp;quot;System.Security.Cryptography.RijndaelManaged&amp;quot;);&lt;br /&gt;
	aes.Key = saKey;&lt;br /&gt;
	aes.IV = saIV;&lt;br /&gt;
	encryptor = aes.CreateEncryptor();&lt;br /&gt;
	binEnc = encryptor.TransformFinalBlock(binSrc, 0, binSrc.GetLength());&lt;br /&gt;
	aes = Неопределено;&lt;br /&gt;
	Возврат binEnc;&lt;br /&gt;
КонецФункции&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Функция AESРасшифровать(saKey, saIV, binEnc) Экспорт&lt;br /&gt;
	aes = Новый COMОбъект(&amp;quot;System.Security.Cryptography.RijndaelManaged&amp;quot;);&lt;br /&gt;
	aes.Key = saKey;&lt;br /&gt;
	aes.IV = saIV;&lt;br /&gt;
	Decryptor = aes.CreateDecryptor();&lt;br /&gt;
	binDec = decryptor.TransformFinalBlock(binEnc, 0, binEnc.GetLength());&lt;br /&gt;
	aes = Неопределено;&lt;br /&gt;
	Возврат binDec;&lt;br /&gt;
КонецФункции&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Пример использования цифровой подписи RSA==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=1c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Процедура Тест_RSAПроверитьПодпись() Экспорт &lt;br /&gt;
	strSrc = &amp;quot;тест test&amp;quot;;&lt;br /&gt;
	binSrc = UtfToSafeArray(strSrc);&lt;br /&gt;
	&lt;br /&gt;
	ОткрытыйКлючОтправителя = &amp;quot;&amp;quot;;&lt;br /&gt;
	ЗакрытыйКлючОтправителя = &amp;quot;&amp;quot;;&lt;br /&gt;
	RSAСоздатьКлючи(ОткрытыйКлючОтправителя, ЗакрытыйКлючОтправителя);&lt;br /&gt;
	&lt;br /&gt;
	binSign = RSAПодписать(ЗакрытыйКлючОтправителя, binSrc);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(128, binSign.GetLength());&lt;br /&gt;
	&lt;br /&gt;
	результат = RSAПроверитьПодпись(ОткрытыйКлючОтправителя, binSrc, binSign);&lt;br /&gt;
	Тестирование.ПроверитьИстину(результат);&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Процедура RSAСоздатьКлючи(ОткрытыйКлюч, ЗакрытыйКлюч) Экспорт &lt;br /&gt;
	objCrypt = Новый COMОбъект(&amp;quot;System.Security.Cryptography.RSACryptoServiceProvider&amp;quot;);&lt;br /&gt;
	ЗакрытыйКлюч = objCrypt.ToXmlString(True);&lt;br /&gt;
	ОткрытыйКлюч = objCrypt.ToXmlString(False);&lt;br /&gt;
	objCrypt = Неопределено;&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
Функция RSAПодписать(ЗакрытыйКлючОтправителя, binSrc) Экспорт&lt;br /&gt;
	objCrypt = Новый COMОбъект(&amp;quot;System.Security.Cryptography.RSACryptoServiceProvider&amp;quot;);&lt;br /&gt;
	objCrypt.FromXmlString(ЗакрытыйКлючОтправителя);&lt;br /&gt;
	&lt;br /&gt;
	objHash = Новый COMОбъект(&amp;quot;System.Security.Cryptography.SHA1CryptoServiceProvider&amp;quot;);&lt;br /&gt;
	hash = objHash.ComputeHash_2(binSrc);&lt;br /&gt;
	&lt;br /&gt;
	binSign = objCrypt.SignHash(hash, &amp;quot;SHA1&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	objCrypt = Неопределено;&lt;br /&gt;
	objHash = Неопределено;&lt;br /&gt;
	&lt;br /&gt;
	Возврат binSign;&lt;br /&gt;
КонецФункции&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Функция RSAПроверитьПодпись(ОткрытыйКлючОтправителя, binSrc, binSign) Экспорт&lt;br /&gt;
	objCrypt = Новый COMОбъект(&amp;quot;System.Security.Cryptography.RSACryptoServiceProvider&amp;quot;);&lt;br /&gt;
	objCrypt.FromXmlString(ОткрытыйКлючОтправителя);&lt;br /&gt;
	&lt;br /&gt;
	objHash = Новый COMОбъект(&amp;quot;System.Security.Cryptography.SHA1CryptoServiceProvider&amp;quot;);&lt;br /&gt;
	hash = objHash.ComputeHash_2(binSrc);&lt;br /&gt;
	&lt;br /&gt;
	результат = objCrypt.VerifyHash(hash, &amp;quot;SHA1&amp;quot;, binSign);&lt;br /&gt;
	&lt;br /&gt;
	objCrypt = Неопределено;&lt;br /&gt;
	objHash = Неопределено;&lt;br /&gt;
	&lt;br /&gt;
	Возврат результат;&lt;br /&gt;
КонецФункции&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Совместное использование асимметричного и симметричного шифрования==&lt;br /&gt;
&lt;br /&gt;
При использовании алгоритмов асимметричного шифрования, таких как RSA, есть определенные ограничения:&lt;br /&gt;
* работает медленно, примерно в 100-1000 раз медленнее чем симметричное шифрование&lt;br /&gt;
* при реальных размерах ключа (1024 бита и более) приходится ограничивать размер сообщения, иначе алгоритмы требуют слишком много ресурсов (памяти и процессора)&lt;br /&gt;
* практически в реализации .Nеt при размере ключа 1024 бит максимальный размер сообщения RSA ограничен 117 байтами&lt;br /&gt;
* &amp;quot;многократное&amp;quot; применение RSA (то есть нарезка исходного сообщения по 100 байт и шифрование их по отдельности) не рекомендуется, так как это резко снижает потенциальную стойкость алгоритма&lt;br /&gt;
&lt;br /&gt;
С учетом этих ограничений все реальные схемы использования асимметричных ключей работают примерно так:&lt;br /&gt;
* генерируется ''сеансовый ключ'' для какого-либо симметричного алгоритма&lt;br /&gt;
* сеансовый ключ шифруется схемой RSA&lt;br /&gt;
* сообщение шифруется сеансовым ключом&lt;br /&gt;
&lt;br /&gt;
===Пример совместного использования асимметричного и симметричного шифрования с подписью и верификацией данных:===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=1c&amp;gt;&lt;br /&gt;
Процедура Тест_RSAРаспаковать() Экспорт &lt;br /&gt;
	ОткрытыйКлючПолучателя = &amp;quot;&amp;quot;;&lt;br /&gt;
	ЗакрытыйКлючПолучателя = &amp;quot;&amp;quot;;&lt;br /&gt;
	RSAСоздатьКлючи(ОткрытыйКлючПолучателя, ЗакрытыйКлючПолучателя);&lt;br /&gt;
	&lt;br /&gt;
	ОткрытыйКлючОтправителя = &amp;quot;&amp;quot;;&lt;br /&gt;
	ЗакрытыйКлючОтправителя = &amp;quot;&amp;quot;;&lt;br /&gt;
	RSAСоздатьКлючи(ОткрытыйКлючОтправителя, ЗакрытыйКлючОтправителя);&lt;br /&gt;
	&lt;br /&gt;
	НаДату = ТекущаяДата();&lt;br /&gt;
	стДанные = Новый Структура(&amp;quot;Наименование,Дата&amp;quot;, &amp;quot;Тестовая организация&amp;quot;, НаДату);&lt;br /&gt;
	&lt;br /&gt;
	стрПакет = RSAУпаковать(ОткрытыйКлючПолучателя, ЗакрытыйКлючОтправителя, стДанные);&lt;br /&gt;
	&lt;br /&gt;
	стДанные1 = RSAРаспаковать(ЗакрытыйКлючПолучателя, ОткрытыйКлючОтправителя, стрПакет);&lt;br /&gt;
	&lt;br /&gt;
	Тестирование.ПроверитьРавенство(Тип(&amp;quot;Структура&amp;quot;), ТипЗнч(стДанные1));&lt;br /&gt;
	Тестирование.ПроверитьРавенство(&amp;quot;Тестовая организация&amp;quot;, стДанные1.Наименование);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(НаДату, стДанные1.Дата);&lt;br /&gt;
	&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
Процедура RSAСоздатьКлючи(ОткрытыйКлюч, ЗакрытыйКлюч) Экспорт &lt;br /&gt;
	objCrypt = Новый COMОбъект(&amp;quot;System.Security.Cryptography.RSACryptoServiceProvider&amp;quot;);&lt;br /&gt;
	ЗакрытыйКлюч = objCrypt.ToXmlString(True);&lt;br /&gt;
	ОткрытыйКлюч = objCrypt.ToXmlString(False);&lt;br /&gt;
	objCrypt = Неопределено;&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Функция RSAУпаковать(ОткрытыйКлючПолучателя, ЗакрытыйКлючОтправителя, Данные1С) Экспорт&lt;br /&gt;
	Если ЗначениеЗаполнено(ЗакрытыйКлючОтправителя) Тогда&lt;br /&gt;
		rsaОтправителя = Новый COMОбъект(&amp;quot;System.Security.Cryptography.RSACryptoServiceProvider&amp;quot;);&lt;br /&gt;
		rsaОтправителя.FromXmlString(ЗакрытыйКлючОтправителя);&lt;br /&gt;
	Иначе&lt;br /&gt;
		rsaОтправителя = Неопределено;&lt;br /&gt;
	КонецЕсли;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	rsaПолучателя = Новый COMОбъект(&amp;quot;System.Security.Cryptography.RSACryptoServiceProvider&amp;quot;);&lt;br /&gt;
	rsaПолучателя.FromXmlString(ОткрытыйКлючПолучателя);&lt;br /&gt;
	&lt;br /&gt;
	sha1 = Новый COMОбъект(&amp;quot;System.Security.Cryptography.SHA1CryptoServiceProvider&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	стрДанные = ЗначениеВСтрокуВнутр(Данные1С);&lt;br /&gt;
	saДанные = UtfToSafeArray(стрДанные);&lt;br /&gt;
	&lt;br /&gt;
	aes = Новый COMОбъект(&amp;quot;System.Security.Cryptography.RijndaelManaged&amp;quot;);&lt;br /&gt;
	aes.KeySize = 128;&lt;br /&gt;
	aes.GenerateKey();&lt;br /&gt;
	aes.GenerateIV();&lt;br /&gt;
	encryptor = aes.CreateEncryptor();&lt;br /&gt;
	&lt;br /&gt;
	saКлючСеанса = saСоединить(aes.IV, aes.Key);&lt;br /&gt;
	saEncКлючСеанса = rsaПолучателя.Encrypt(saКлючСеанса, False);&lt;br /&gt;
	&lt;br /&gt;
	saHash = sha1.ComputeHash_2(saДанные);&lt;br /&gt;
	&lt;br /&gt;
	Если rsaОтправителя = Неопределено Тогда&lt;br /&gt;
		saПодпись = Новый COMSafeArray(&amp;quot;VT_UI1&amp;quot;, 0);&lt;br /&gt;
	Иначе&lt;br /&gt;
		saПодпись = rsaОтправителя.SignHash(saHash, &amp;quot;SHA1&amp;quot;);&lt;br /&gt;
	КонецЕсли;&lt;br /&gt;
	&lt;br /&gt;
	saEncПодпись = encryptor.TransformFinalBlock(saПодпись, 0, saПодпись.GetLength());&lt;br /&gt;
	&lt;br /&gt;
	saEncДанные = encryptor.TransformFinalBlock(saДанные, 0, saДанные.GetLength());&lt;br /&gt;
	&lt;br /&gt;
	saПакет = saСобратьПакет(saEncКлючСеанса, saEncПодпись, saEncДанные);&lt;br /&gt;
	&lt;br /&gt;
	стрПакет = SafeArrayToBase64(saПакет);&lt;br /&gt;
	&lt;br /&gt;
	rsaОтправителя = Неопределено;&lt;br /&gt;
	rsaПолучателя = Неопределено;&lt;br /&gt;
	sha1 = Неопределено;&lt;br /&gt;
	aes = Неопределено;&lt;br /&gt;
	&lt;br /&gt;
	Возврат стрПакет;&lt;br /&gt;
КонецФункции&lt;br /&gt;
&lt;br /&gt;
Функция RSAРаспаковать(ЗакрытыйКлючПолучателя, ОткрытыйКлючОтправителя, стрПакет) Экспорт&lt;br /&gt;
	Если ЗначениеЗаполнено(ОткрытыйКлючОтправителя) Тогда&lt;br /&gt;
		rsaОтправителя = Новый COMОбъект(&amp;quot;System.Security.Cryptography.RSACryptoServiceProvider&amp;quot;);&lt;br /&gt;
		rsaОтправителя.FromXmlString(ОткрытыйКлючОтправителя);&lt;br /&gt;
	Иначе&lt;br /&gt;
		rsaОтправителя = Неопределено;&lt;br /&gt;
	КонецЕсли;&lt;br /&gt;
	&lt;br /&gt;
	rsaПолучателя = Новый COMОбъект(&amp;quot;System.Security.Cryptography.RSACryptoServiceProvider&amp;quot;);&lt;br /&gt;
	rsaПолучателя.FromXmlString(ЗакрытыйКлючПолучателя);&lt;br /&gt;
	&lt;br /&gt;
	sha1 = Новый COMОбъект(&amp;quot;System.Security.Cryptography.SHA1CryptoServiceProvider&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	aes = Новый COMОбъект(&amp;quot;System.Security.Cryptography.RijndaelManaged&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	saПакет = Base64ToSafeArray(стрПакет);&lt;br /&gt;
	&lt;br /&gt;
	смещение = 0;&lt;br /&gt;
	saEncКлючСеанса = saПолучитьБлок(saПакет, смещение);&lt;br /&gt;
	saEncПодпись = saПолучитьБлок(saПакет, смещение);&lt;br /&gt;
	saEncДанные = saПолучитьБлок(saПакет, смещение);&lt;br /&gt;
	&lt;br /&gt;
	saКлючСеанса = rsaПолучателя.Decrypt(saEncКлючСеанса, False);&lt;br /&gt;
	saIV = saВыделитьДиапазон(saКлючСеанса, 0, 16);&lt;br /&gt;
	saKey = saВыделитьДиапазон(saКлючСеанса, 16, saКлючСеанса.GetLength() - 16);&lt;br /&gt;
	aes.Key = saKey;&lt;br /&gt;
	aes.IV = saIV;&lt;br /&gt;
	decryptor = aes.CreateDecryptor();&lt;br /&gt;
	&lt;br /&gt;
	saПодпись = decryptor.TransformFinalBlock(saEncПодпись, 0, saEncПодпись.GetLength());&lt;br /&gt;
	saДанные = decryptor.TransformFinalBlock(saEncДанные, 0, saEncДанные.GetLength());&lt;br /&gt;
	&lt;br /&gt;
	Если rsaОтправителя &amp;lt;&amp;gt; Неопределено Тогда&lt;br /&gt;
		saHash = sha1.ComputeHash_2(saДанные);&lt;br /&gt;
		ПодписьКорректна = rsaОтправителя.VerifyHash(saHash, &amp;quot;SHA1&amp;quot;, saПодпись);&lt;br /&gt;
		Если НЕ ПодписьКорректна Тогда&lt;br /&gt;
			ВызватьИсключение &amp;quot;Обнаружено разрушение данных: некорректная цифровая подпись&amp;quot;;&lt;br /&gt;
		КонецЕсли;&lt;br /&gt;
	КонецЕсли;&lt;br /&gt;
	&lt;br /&gt;
	стрДанные = SafeArrayToUtf(saДанные);&lt;br /&gt;
	Данные1С = ЗначениеИзСтрокиВнутр(стрДанные);&lt;br /&gt;
	&lt;br /&gt;
	rsaОтправителя = Неопределено;&lt;br /&gt;
	rsaПолучателя = Неопределено;&lt;br /&gt;
	sha1 = Неопределено;&lt;br /&gt;
	aes = Неопределено;&lt;br /&gt;
	&lt;br /&gt;
	Возврат Данные1С;&lt;br /&gt;
КонецФункции&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Функция saПолучитьБлок(saПакет, смещение)&lt;br /&gt;
	старшийБайт = saПакет.GetValue(смещение + 0);&lt;br /&gt;
	младшийБайт = saПакет.GetValue(смещение + 1);&lt;br /&gt;
	длина = старшийБайт * 256 + младшийБайт;&lt;br /&gt;
	&lt;br /&gt;
	saБлок = Новый COMSafeArray(&amp;quot;VT_UI1&amp;quot;, длина);&lt;br /&gt;
	&lt;br /&gt;
	смещение = смещение + 2;&lt;br /&gt;
	Для индекс = 0 по длина - 1 Цикл&lt;br /&gt;
		saБлок.SetValue(индекс, saПакет.GetValue(индекс + смещение));&lt;br /&gt;
	КонецЦикла;&lt;br /&gt;
	смещение = смещение + длина;&lt;br /&gt;
	&lt;br /&gt;
	Возврат saБлок;&lt;br /&gt;
КонецФункции&lt;br /&gt;
&lt;br /&gt;
Функция saВыделитьДиапазон(saПакет, смещение, длина)&lt;br /&gt;
	saБлок = Новый COMSafeArray(&amp;quot;VT_UI1&amp;quot;, длина);&lt;br /&gt;
	&lt;br /&gt;
	Для индекс = 0 по длина - 1 Цикл&lt;br /&gt;
		saБлок.SetValue(индекс, saПакет.GetValue(индекс + смещение));&lt;br /&gt;
	КонецЦикла;&lt;br /&gt;
&lt;br /&gt;
	Возврат saБлок;&lt;br /&gt;
КонецФункции&lt;br /&gt;
&lt;br /&gt;
Процедура saДобавитьДанные(saПакет, saДанные, смещение)&lt;br /&gt;
	длина = saДанные.GetLength();&lt;br /&gt;
	saПакет.SetValue(смещение + 0, Цел(длина / 256));&lt;br /&gt;
	saПакет.SetValue(смещение + 1, длина % 256);&lt;br /&gt;
	смещение = смещение + 2;&lt;br /&gt;
	Для индекс = 0 по длина - 1 Цикл&lt;br /&gt;
		saПакет.SetValue(смещение + индекс, saДанные.GetValue(индекс));&lt;br /&gt;
	КонецЦикла;&lt;br /&gt;
	смещение = смещение + длина;&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
Функция saСобратьПакет(saКлюч, saПодпись, saДанные) Экспорт &lt;br /&gt;
	saПакет = Новый COMSafeArray(&amp;quot;VT_UI1&amp;quot;, saКлюч.GetLength() + saПодпись.GetLength() + saДанные.GetLength() + 6);&lt;br /&gt;
	&lt;br /&gt;
	смещение = 0;&lt;br /&gt;
	&lt;br /&gt;
	saДобавитьДанные(saПакет, saКлюч, смещение);&lt;br /&gt;
	saДобавитьДанные(saПакет, saПодпись, смещение);&lt;br /&gt;
	saДобавитьДанные(saПакет, saДанные, смещение);&lt;br /&gt;
	&lt;br /&gt;
	Возврат saПакет;&lt;br /&gt;
КонецФункции&lt;br /&gt;
&lt;br /&gt;
Функция saСоединить(sa1, sa2)&lt;br /&gt;
	длина1 = sa1.GetLength();&lt;br /&gt;
	длина2 = sa2.GetLength();&lt;br /&gt;
	saРезультат = Новый COMSafeArray(&amp;quot;VT_UI1&amp;quot;, длина1 + длина2);&lt;br /&gt;
	&lt;br /&gt;
	Для  индекс = 0 по длина1 - 1 Цикл&lt;br /&gt;
		saРезультат.SetValue(индекс, sa1.GetValue(индекс));&lt;br /&gt;
	КонецЦикла;&lt;br /&gt;
	&lt;br /&gt;
	Для индекс = 0 по длина2 - 1 Цикл&lt;br /&gt;
		saРезультат.SetValue(индекс + длина1, sa2.GetValue(индекс));&lt;br /&gt;
	КонецЦикла;&lt;br /&gt;
	&lt;br /&gt;
	Возврат saРезультат;&lt;br /&gt;
КонецФункции&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Пример упакованного пакета данных===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AICMxryOHYJJuxYufTP4X643HVamNgUuQ4lcY/L1YXk6HkQ9LnL02h/ERIgKwDSX&lt;br /&gt;
pFJqTVisEF3Y+BORPJGyDlSeJ/Z/qwnX606AfTQxgEkB1qfW72a86DYyhG6kvjbY&lt;br /&gt;
Kc4e9QIW1Za6HJgkw1hjXr85meXIibOVm4BfNDZCvYmRswCQemALjNne1dacqmW4&lt;br /&gt;
RzcASMLxLZciFVXDBQB+LbuojpdY5Vn++hpzpWt1vh/Mj4bdeEHNGg3p229kbOBW&lt;br /&gt;
Iog5zVHpj+mKADK8IeLKZwYWghP19bAo4cMVJ+zzceMjzLCAWQ+c1GI6aq6FRcyJ&lt;br /&gt;
Dh07lzyvDfcw1iS0AbZg23Y5BRW9zCpg5xt4RX2vcAhFHO0iAMC+6/jZofsIY72g&lt;br /&gt;
YukEgKWm9TSDhiRMcozbrCjv4Gug+aPXUAK0gvrS42C/ITynTyrtTE1erHFWXmCt&lt;br /&gt;
VhAdpiE5sE6QFI8LYFB4pcPAqOooFEj/kBUQHEArJyyacWazs2/jTLCv1SmLrKjs&lt;br /&gt;
tTZhafQ2y9pEBGvfqsG4YhKSjA7SVJzgtfcgAi76bHiWyURGQqiqNym1WpXp9WO/&lt;br /&gt;
eckaQFAi4rqYpt0Qn93G3/iJ/Wq+hPMN/z9c6UqmQtbm7/Tp0f4=&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Пример xml-сериализации открытого ключа RSA===&lt;br /&gt;
&amp;lt;source lang=xml&amp;gt;&lt;br /&gt;
&amp;lt;RSAKeyValue&amp;gt;&lt;br /&gt;
&amp;lt;Modulus&amp;gt;u7ptm/rGsEhZ3JhKApnDPUVj6bPnSYmVzGkMrAsElT2CIRD6zWbA0+GcoQ5qCz/ZTeCeDBgCIhDkACdy9Q+kjl1HGlwWS8OGCaOLt&lt;br /&gt;
/14zXuYoCeSZMP3sJMI7BuzRCvu5NBduxfZYC75UnKzO29WjXIxF5h32U8nArv6WivhPRs=&amp;lt;/Modulus&amp;gt;&lt;br /&gt;
&amp;lt;Exponent&amp;gt;AQAB&amp;lt;/Exponent&amp;gt;&lt;br /&gt;
&amp;lt;/RSAKeyValue&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Пример xml-сериализации закрытого ключа RSA:===&lt;br /&gt;
&amp;lt;source lang=xml&amp;gt;&lt;br /&gt;
&amp;lt;RSAKeyValue&amp;gt;&lt;br /&gt;
&amp;lt;Modulus&amp;gt;u7ptm/rGsEhZ3JhKApnDPUVj6bPnSYmVzGkMrAsElT2CIRD6zWbA0+GcoQ5qCz/ZTeCeDBgCIhDkACdy9Q+kjl1HGlwWS8OGCaOLt&lt;br /&gt;
/14zXuYoCeSZMP3sJMI7BuzRCvu5NBduxfZYC75UnKzO29WjXIxF5h32U8nArv6WivhPRs=&amp;lt;/Modulus&amp;gt;&lt;br /&gt;
&amp;lt;Exponent&amp;gt;AQAB&amp;lt;/Exponent&amp;gt;&lt;br /&gt;
&amp;lt;P&amp;gt;/HvZG4UCGgsngAPG5jie9K4uctxIuuuTft1yVy9rz3zrO58AyxgqEKan2ezikpjzhKeUF6Y+6SBf/DJIs9W9fQ==&amp;lt;/P&amp;gt;&lt;br /&gt;
&amp;lt;Q&amp;gt;vle25eGrqNY0y1QvQgQRBnFUDkxnvmH7zIiMJhL/fHzhLBQOIRDsgqIgEvGMGfkjMxPyOSi1cE4eDe1rMBdIdw==&amp;lt;/Q&amp;gt;&lt;br /&gt;
&amp;lt;DP&amp;gt;vpLQpff4RSYkM3kmWUFlobQTdTkWYJhN5VVK58nwa1WTzJXQqHtdzOGuEky+G/782CURH+So2ZhJOvfNbognlQ==&amp;lt;/DP&amp;gt;&lt;br /&gt;
&amp;lt;DQ&amp;gt;Mt0rseiJP7fmKcOYUVLW3drg9GU0f+qdJ/4BPZdsEG8qmOXPFMT5/rqmSYmkv7gU0OxumRmoypcFbwFX2GUQZw==&amp;lt;/DQ&amp;gt;&lt;br /&gt;
&amp;lt;InverseQ&amp;gt;wbxr31t5DAUanNTJojPnQS5ex0RXDVAiGcyMCpktOQNTvvN64Hh6975JYg1wEtFuu8doLh6tgfexvpOtVhJq2A==&amp;lt;/InverseQ&amp;gt;&lt;br /&gt;
&amp;lt;D&amp;gt;M6bn4bLuWDKQBxIfyvdjsMgW5YaKbMFeZg/BXNTrPeTemRqC52EOTT4WSnoc01uN&lt;br /&gt;
/s9+rPUuIRFkqmYwSx0yuT85ayfoiiDDLq7GDt8M21EuAep3yxOAHAgJ3Ddr9UApv72MuDKNHrOnr3WDR5OPWtuS3ZZJ8jVpv5jwADBsEYE=&amp;lt;/D&amp;gt;&lt;br /&gt;
&amp;lt;/RSAKeyValue&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Определение доступности .Net==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=1c&amp;gt;&lt;br /&gt;
Процедура Тест_ВерсияDotNet() Экспорт&lt;br /&gt;
	objHtml = Новый COMОбъект(&amp;quot;htmlfile&amp;quot;);&lt;br /&gt;
	агент = objHtml.parentWindow.navigator.userAgent;&lt;br /&gt;
	&lt;br /&gt;
	Сообщить(агент);&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Павел Лазарев</name></author>
		
	</entry>
</feed>