<?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%94%D0%BB%D0%B8%D0%BD%D0%BD%D0%B0%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B0_%281Cv8%29</id>
	<title>Длинная арифметика (1Cv8) - История изменений</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.kint.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%94%D0%BB%D0%B8%D0%BD%D0%BD%D0%B0%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B0_%281Cv8%29"/>
	<link rel="alternate" type="text/html" href="http://wiki.kint.ru/index.php?title=%D0%94%D0%BB%D0%B8%D0%BD%D0%BD%D0%B0%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B0_(1Cv8)&amp;action=history"/>
	<updated>2026-05-15T13:59:52Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.31.15</generator>
	<entry>
		<id>http://wiki.kint.ru/index.php?title=%D0%94%D0%BB%D0%B8%D0%BD%D0%BD%D0%B0%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B0_(1Cv8)&amp;diff=87543&amp;oldid=prev</id>
		<title>Дмитрий Малюгин: /* Реалиация */</title>
		<link rel="alternate" type="text/html" href="http://wiki.kint.ru/index.php?title=%D0%94%D0%BB%D0%B8%D0%BD%D0%BD%D0%B0%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B0_(1Cv8)&amp;diff=87543&amp;oldid=prev"/>
		<updated>2024-12-03T15:54:38Z</updated>

		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Реалиация&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Версия 15:54, 3 декабря 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l15&quot; &gt;Строка 15:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 15:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* На JavaScript: http://www-cs-students.stanford.edu/~tjw/jsbn/&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* На JavaScript: http://www-cs-students.stanford.edu/~tjw/jsbn/&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;** http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn.js&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;** http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn.js&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Медиа:1Cv8_ДлиннаяАрифметика.dt]]&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Модуль &amp;quot;ДлиннаяАрифметика&amp;quot;==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Модуль &amp;quot;ДлиннаяАрифметика&amp;quot;==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Дмитрий Малюгин</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.kint.ru/index.php?title=%D0%94%D0%BB%D0%B8%D0%BD%D0%BD%D0%B0%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B0_(1Cv8)&amp;diff=21547&amp;oldid=prev</id>
		<title>Павел Лазарев: Новая страница: «Категория:Примеры кода 1С  ==Что это==  {{cite|[http://ru.wikipedia.org/wiki/%D0%94%D0%BB%D0%B8%D0%BD%D0%BD%D0%B0%D1%8F_%D0%B0%D1%80%D...»</title>
		<link rel="alternate" type="text/html" href="http://wiki.kint.ru/index.php?title=%D0%94%D0%BB%D0%B8%D0%BD%D0%BD%D0%B0%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B0_(1Cv8)&amp;diff=21547&amp;oldid=prev"/>
		<updated>2010-10-07T05:55:59Z</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;  ==Что это==  {{cite|[http://ru.wikipedia.org/wiki/%D0%94%D0%BB%D0%B8%D0%BD%D0%BD%D0%B0%D1%8F_%D0%B0%D1%80%D...»&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;
==Что это==&lt;br /&gt;
&lt;br /&gt;
{{cite|[http://ru.wikipedia.org/wiki/%D0%94%D0%BB%D0%B8%D0%BD%D0%BD%D0%B0%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B0 Длинная арифметика. Материал из Википедии — свободной энциклопедии]|&lt;br /&gt;
&lt;br /&gt;
Длинная арифметика — в вычислительной технике операции над числами, разрядность которых превышает длину машинного слова данной вычислительной машины. Частный случай — арифметика произвольной точности — относится к арифметике, в которой длина чисел ограничена только объёмом доступной памяти.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Реалиация==&lt;br /&gt;
&lt;br /&gt;
Примеры реализации:&lt;br /&gt;
* На VisualBasic: http://www.di-mgt.com.au/src/basModExp.bas.html&lt;br /&gt;
** http://www.di-mgt.com.au/crypto.html&lt;br /&gt;
* На JavaScript: http://www-cs-students.stanford.edu/~tjw/jsbn/&lt;br /&gt;
** http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn.js&lt;br /&gt;
&lt;br /&gt;
[[Медиа:1Cv8_ДлиннаяАрифметика.dt]]&lt;br /&gt;
&lt;br /&gt;
==Модуль &amp;quot;ДлиннаяАрифметика&amp;quot;==&lt;br /&gt;
--[[Участник:Павел Лазарев|Павел Лазарев]] 13:08, 20 декабря 2009 (SAMT)&lt;br /&gt;
* реализация проста и работает правильно, но очень медленно&lt;br /&gt;
* возможные оптимизации &lt;br /&gt;
** использовать массив не 8-битных целых (байтовый) а 32-битных целых&lt;br /&gt;
** реализовать на основе http://www-cs-students.stanford.edu/~tjw/jsbn/, но там остро не хватает битовых операций..&lt;br /&gt;
** может быть поможет что-то из [[Общедоступные COM-объекты Windows]]&lt;br /&gt;
** может быть использовать реализацию http://www-cs-students.stanford.edu/~tjw/jsbn/ через Windows Script Host / JScript&lt;br /&gt;
** еще одна реализация на javascript: http://assl.sullof.com/assl/&lt;br /&gt;
** и еще: http://www.jcryption.org/&lt;br /&gt;
** также существуют реализации хэшей md5 на javascript: http://pajhome.org.uk/crypt/md5/index.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Использование объекта MSScriptControl.ScriptControl для запуска скриптов:&lt;br /&gt;
* http://www.script-coding.info/MSScriptControl.html&lt;br /&gt;
* http://www.forum.mista.ru/topic.php?id=252049&lt;br /&gt;
* http://www.kb.mista.ru/article.php?id=66&lt;br /&gt;
* http://www.forum.mista.ru/topic.php?id=438082&lt;br /&gt;
* http://support.microsoft.com/kb/184740&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=1c&amp;gt;&lt;br /&gt;
// --[[Участник:Павел Лазарев|Павел Лазарев]] 13:00, 20 декабря 2009 (SAMT)&lt;br /&gt;
//Источник: http://www.di-mgt.com.au/src/basModExp.bas.html&lt;br /&gt;
&lt;br /&gt;
Функция ВСтроку16(мзЧисло) Экспорт&lt;br /&gt;
    строка = &amp;quot;&amp;quot;;&lt;br /&gt;
	Для индекс = 0 по мзЧисло.Количество() - 1 Цикл&lt;br /&gt;
		байт = мзЧисло[индекс];&lt;br /&gt;
		ПерваяЦифра = Цел(байт/16);&lt;br /&gt;
		ВтораяЦифра = байт % 16;&lt;br /&gt;
		строка = строка + ШестнадцетиричнаяЦифра(ПерваяЦифра) + ШестнадцетиричнаяЦифра(ВтораяЦифра);&lt;br /&gt;
	КонецЦикла;&lt;br /&gt;
    Возврат строка;&lt;br /&gt;
КонецФункции&lt;br /&gt;
&lt;br /&gt;
Функция ШестнадцетиричнаяЦифра(цифра)&lt;br /&gt;
	Возврат Сред(&amp;quot;0123456789ABCDEF&amp;quot;, цифра + 1, 1);	&lt;br /&gt;
КонецФункции&lt;br /&gt;
&lt;br /&gt;
Функция ИзСтроки16(Знач строка) Экспорт &lt;br /&gt;
	КоличествоЦифр = СтрДлина(строка);&lt;br /&gt;
	КоличествоБайт = Цел(КоличествоЦифр / 2);&lt;br /&gt;
	Если КоличествоБайт * 2 &amp;lt; КоличествоЦифр Тогда&lt;br /&gt;
		строка = &amp;quot;0&amp;quot; + строка;&lt;br /&gt;
		КоличествоЦифр = СтрДлина(строка);&lt;br /&gt;
		КоличествоБайт = Цел(КоличествоЦифр / 2);&lt;br /&gt;
	КонецЕсли;&lt;br /&gt;
	Если КоличествоБайт = 0 Тогда&lt;br /&gt;
		Возврат Новый Массив;&lt;br /&gt;
	КонецЕсли;&lt;br /&gt;
	&lt;br /&gt;
	строка = ВРег(строка);&lt;br /&gt;
	НомерБайта = 0;&lt;br /&gt;
	мзЧисло = Новый Массив(КоличествоБайт);&lt;br /&gt;
	Для  НомерБайта = 0 по КоличествоБайт - 1 Цикл&lt;br /&gt;
		НомерЦифры = НомерБайта * 2 + 1;&lt;br /&gt;
		ПерваяЦифра = КодСимвола(строка, НомерЦифры);&lt;br /&gt;
		ВтораяЦифра = КодСимвола(строка, НомерЦифры + 1);&lt;br /&gt;
		мзЧисло[НомерБайта] = ШестнадцетиричноеЧисло(ПерваяЦифра) * 16 + ШестнадцетиричноеЧисло(ВтораяЦифра);&lt;br /&gt;
	КонецЦикла;&lt;br /&gt;
	&lt;br /&gt;
	Возврат мзЧисло;&lt;br /&gt;
КонецФункции&lt;br /&gt;
&lt;br /&gt;
Функция ШестнадцетиричноеЧисло(Код)&lt;br /&gt;
	Если Код &amp;gt;= 48 И Код &amp;lt;= 57 Тогда&lt;br /&gt;
		Возврат Код - 48;&lt;br /&gt;
	ИначеЕсли Код &amp;gt;= 65 И Код &amp;lt;= 70 Тогда&lt;br /&gt;
		Возврат Код - 65 + 10;&lt;br /&gt;
	Иначе&lt;br /&gt;
		Возврат 0;&lt;br /&gt;
	КонецЕсли;&lt;br /&gt;
КонецФункции&lt;br /&gt;
&lt;br /&gt;
Процедура мзРазделитьНаДва(мзЧисло) Экспорт&lt;br /&gt;
// Divides multiple-precision integer x by 2 by shifting to right by one bit&lt;br /&gt;
	//Dim d As Long&lt;br /&gt;
	//Dim i As Integer&lt;br /&gt;
	//d = 0&lt;br /&gt;
	//For i = 0 To UBound(x)&lt;br /&gt;
	//	d = d Or x(i)&lt;br /&gt;
	//	x(i) = CByte((d \ 2) And &amp;amp;HFF)&lt;br /&gt;
	//	If (d And &amp;amp;H1) Then&lt;br /&gt;
	//		d = &amp;amp;H100&lt;br /&gt;
	//	Else&lt;br /&gt;
	//		d = 0&lt;br /&gt;
	//	End If&lt;br /&gt;
	//Next&lt;br /&gt;
	&lt;br /&gt;
	частное = 0;&lt;br /&gt;
	Для i = 0 To мзЧисло.Количество() - 1 Цикл&lt;br /&gt;
		частное = частное + мзЧисло[i];&lt;br /&gt;
		мзЧисло[i] = Цел(частное / 2) % 256;&lt;br /&gt;
		Если (частное % 2) = 1 Тогда&lt;br /&gt;
			частное = 256;&lt;br /&gt;
		Иначе&lt;br /&gt;
			частное = 0;&lt;br /&gt;
		КонецЕсли;&lt;br /&gt;
	КонецЦикла;&lt;br /&gt;
	&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Функция  мзЭтоНуль(мзЧисло) Экспорт&lt;br /&gt;
	Для каждого байт из мзЧисло Цикл&lt;br /&gt;
		Если байт &amp;lt;&amp;gt; 0 Тогда&lt;br /&gt;
			Возврат Ложь;&lt;br /&gt;
		КонецЕсли;&lt;br /&gt;
	КонецЦикла;&lt;br /&gt;
	Возврат Истина;&lt;br /&gt;
КонецФункции&lt;br /&gt;
&lt;br /&gt;
Процедура мзВыровнятьДлину(мзЧислоА, мзЧислоБ, мзЧислоМ) Экспорт&lt;br /&gt;
	количество = Макс(мзЧислоА.Количество(), Макс(мзЧислоБ.Количество(), мзЧислоМ.Количество())) + 1;&lt;br /&gt;
	мзУстановитьДлину(мзЧислоА, количество);&lt;br /&gt;
	мзУстановитьДлину(мзЧислоБ, количество);&lt;br /&gt;
	мзУстановитьДлину(мзЧислоМ, количество);&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
Процедура мзУстановитьДлину(мзЧисло, количество)&lt;br /&gt;
	длина = мзЧисло.Количество();&lt;br /&gt;
	Для индекс = длина по количество - 1 Цикл&lt;br /&gt;
		мзЧисло.Вставить(0, 0);&lt;br /&gt;
	КонецЦикла;&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Процедура мзДобавитьПоМодулю(мзЧислоА, мзЧислоБ, мзЧислоМ) Экспорт&lt;br /&gt;
//' Computes a = (a + b) mod m&lt;br /&gt;
//	Dim i As Integer&lt;br /&gt;
//	Dim d As Long&lt;br /&gt;
//	' 1. Add a = a + b&lt;br /&gt;
//	d = 0&lt;br /&gt;
//	For i = nLen - 1 To 0 Step -1&lt;br /&gt;
//		d = CLng(a(i)) + CLng(b(i)) + d&lt;br /&gt;
//		a(i) = CByte(d And &amp;amp;HFF)&lt;br /&gt;
//		d = d \ &amp;amp;H100&lt;br /&gt;
//	Next&lt;br /&gt;
//	' 2. If a &amp;gt; m then a = a - m&lt;br /&gt;
//	For i = 0 To nLen - 2&lt;br /&gt;
//		If a(i) &amp;lt;&amp;gt; m(i) Then&lt;br /&gt;
//			Exit For&lt;br /&gt;
//		End If&lt;br /&gt;
//	Next&lt;br /&gt;
//	If a(i) &amp;gt;= m(i) Then&lt;br /&gt;
//		Call aSubtract(a, m, nLen)&lt;br /&gt;
//	End If&lt;br /&gt;
//	' 3. Return a in-situ&lt;br /&gt;
&lt;br /&gt;
	//	' 1. Add a = a + b&lt;br /&gt;
	d = 0;&lt;br /&gt;
	nlen = мзЧислоА.Количество();&lt;br /&gt;
	Для индекс = 1 по nlen Цикл&lt;br /&gt;
		i = nlen - индекс;&lt;br /&gt;
		d = мзЧислоА[i] + мзЧислоБ[i] + d;&lt;br /&gt;
		мзЧислоА[i] = d % 256;&lt;br /&gt;
		d = Цел(d / 256);&lt;br /&gt;
	КонецЦикла;&lt;br /&gt;
	//	' 2. If a &amp;gt; m then a = a - m&lt;br /&gt;
	&lt;br /&gt;
	Для i = 0 по nlen - 2 Цикл&lt;br /&gt;
		Если мзЧислоА[i] &amp;lt;&amp;gt; мзЧислоМ[i] Тогда&lt;br /&gt;
			Прервать;&lt;br /&gt;
		КонецЕсли;&lt;br /&gt;
	КонецЦикла;&lt;br /&gt;
	&lt;br /&gt;
	Если мзЧислоА[i] &amp;gt; мзЧислоМ[i] Тогда&lt;br /&gt;
		мзВычесть(мзЧислоА, мзЧислоМ);&lt;br /&gt;
	КонецЕсли;&lt;br /&gt;
	&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
Процедура мзВычесть(мзЧислоА, мзЧислоБ) Экспорт&lt;br /&gt;
//' Computes a = a - b&lt;br /&gt;
//	Dim i As Integer&lt;br /&gt;
//	Dim borrow As Long&lt;br /&gt;
//	Dim d As Long   ' NB d is signed&lt;br /&gt;
//	&lt;br /&gt;
//	borrow = 0&lt;br /&gt;
//	For i = nLen - 1 To 0 Step -1&lt;br /&gt;
//		d = CLng(a(i)) - CLng(b(i)) - borrow&lt;br /&gt;
//		If d &amp;lt; 0 Then&lt;br /&gt;
//			d = d + &amp;amp;H100&lt;br /&gt;
//			borrow = 1&lt;br /&gt;
//		Else&lt;br /&gt;
//			borrow = 0&lt;br /&gt;
//		End If&lt;br /&gt;
//		a(i) = CByte(d And &amp;amp;HFF)&lt;br /&gt;
//	Next&lt;br /&gt;
&lt;br /&gt;
    nlen = мзЧислоА.Количество();&lt;br /&gt;
	borrow = 0;&lt;br /&gt;
	Для индекс = 1 по nlen Цикл&lt;br /&gt;
		i = nlen - индекс;&lt;br /&gt;
		d = мзЧислоА[i] - мзЧислоБ[i] - borrow;&lt;br /&gt;
		Если d &amp;lt; 0 Тогда&lt;br /&gt;
			d = d + 256;&lt;br /&gt;
			borrow = 1;&lt;br /&gt;
		Иначе&lt;br /&gt;
			borrow = 0;&lt;br /&gt;
		КонецЕсли;&lt;br /&gt;
		мзЧислоА[i] = d % 256;&lt;br /&gt;
	КонецЦикла;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
Функция мзУмножитьПоМодулю(мзЧислоА, мзЧислоБ, мзЧислоМ) Экспорт&lt;br /&gt;
//Private Function aModMult(abX() As Byte, abY() As Byte, abMod() As Byte, nLen As Integer) As Variant&lt;br /&gt;
//' Returns w = (x * y) mod m&lt;br /&gt;
//	Dim w() As Byte&lt;br /&gt;
//	Dim x() As Byte&lt;br /&gt;
//	Dim y() As Byte&lt;br /&gt;
//	Dim nBits As Integer&lt;br /&gt;
//	&lt;br /&gt;
//	' 1. Set w = 0, and temps x = abX, y = abY&lt;br /&gt;
//	ReDim w(nLen - 1)&lt;br /&gt;
//	x = abX&lt;br /&gt;
//	y = abY&lt;br /&gt;
//	' 2. From LS bit to MS bit of X do:&lt;br /&gt;
//	For nBits = nLen * 8 To 1 Step -1&lt;br /&gt;
//		' 2.1 if x is odd then w = (w + y) mod m&lt;br /&gt;
//		If (x(nLen - 1) And &amp;amp;H1) &amp;lt;&amp;gt; 0 Then&lt;br /&gt;
//			Call aModAdd(w, y, abMod, nLen)&lt;br /&gt;
//		End If&lt;br /&gt;
//		' 2.2 x = x / 2&lt;br /&gt;
//		Call DivideByTwo(x)&lt;br /&gt;
//		' 2.3 if x != 0 then y = (y + y) mod m&lt;br /&gt;
//		If aIsZero(x, nLen) Then Exit For&lt;br /&gt;
//		Call aModAdd(y, y, abMod, nLen)&lt;br /&gt;
//	Next&lt;br /&gt;
//	aModMult = w&lt;br /&gt;
	&lt;br /&gt;
    nlen = мзЧислоА.Количество();&lt;br /&gt;
	w = Новый Массив(nlen); //-1&lt;br /&gt;
	Для i = 0 по nlen - 1 Цикл // -2&lt;br /&gt;
		w[i] = 0;&lt;br /&gt;
	КонецЦикла;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	x = Новый Массив(nlen);&lt;br /&gt;
	y = Новый Массив(nlen);&lt;br /&gt;
	Для i = 0 по nlen - 1 Цикл&lt;br /&gt;
		x[i] = мзЧислоА[i];&lt;br /&gt;
		y[i] = мзЧислоБ[i];&lt;br /&gt;
	КонецЦикла;&lt;br /&gt;
	&lt;br /&gt;
	Для nBits = 1 по nlen * 8 Цикл&lt;br /&gt;
		Если x[nlen -1] % 2 &amp;lt;&amp;gt; 0 Тогда&lt;br /&gt;
			мзДобавитьПоМодулю(w, y, мзЧислоМ);&lt;br /&gt;
		КонецЕсли;&lt;br /&gt;
		&lt;br /&gt;
		мзРазделитьНаДва(x);&lt;br /&gt;
		&lt;br /&gt;
		Если мзЭтоНуль(x) Тогда&lt;br /&gt;
			Прервать;&lt;br /&gt;
		КонецЕсли;&lt;br /&gt;
		&lt;br /&gt;
		мзДобавитьПоМодулю(y, y, мзЧислоМ);&lt;br /&gt;
		&lt;br /&gt;
	КонецЦикла;&lt;br /&gt;
	&lt;br /&gt;
	Возврат w;&lt;br /&gt;
КонецФункции&lt;br /&gt;
&lt;br /&gt;
Функция мзСтепеньПоМодулю(мзЧислоА, мзЧислоБ, мзЧислоМ) Экспорт&lt;br /&gt;
//' Computes a = b^e mod m and returns the result in a byte array as a VARIANT&lt;br /&gt;
//	Dim a() As Byte&lt;br /&gt;
//	Dim e() As Byte&lt;br /&gt;
//	Dim s() As Byte&lt;br /&gt;
//	Dim nBits As Long&lt;br /&gt;
//	&lt;br /&gt;
//	' Perform right-to-left binary exponentiation&lt;br /&gt;
//	' 1. Set A = 1, S = b&lt;br /&gt;
//	ReDim a(nLen - 1)&lt;br /&gt;
//	a(nLen - 1) = 1&lt;br /&gt;
//	' NB s and e are trashed so use copies&lt;br /&gt;
//	s = abBase&lt;br /&gt;
//	e = abExponent&lt;br /&gt;
//	' 2. While e != 0 do:&lt;br /&gt;
//	For nBits = nLen * 8 To 1 Step -1&lt;br /&gt;
//		' 2.1 if e is odd then A = A*S mod m&lt;br /&gt;
//		If (e(nLen - 1) And &amp;amp;H1) &amp;lt;&amp;gt; 0 Then&lt;br /&gt;
//			a = aModMult(a, s, abModulus, nLen)&lt;br /&gt;
//		End If&lt;br /&gt;
//		' 2.2 e = e / 2&lt;br /&gt;
//		Call DivideByTwo(e)&lt;br /&gt;
//		' 2.3 if e != 0 then S = S*S mod m&lt;br /&gt;
//		If aIsZero(e, nLen) Then Exit For&lt;br /&gt;
//		s = aModMult(s, s, abModulus, nLen)&lt;br /&gt;
//		DoEvents&lt;br /&gt;
//	Next&lt;br /&gt;
//	&lt;br /&gt;
//	' 3. Return(A)&lt;br /&gt;
//	aModExp = a&lt;br /&gt;
	//&lt;br /&gt;
	&lt;br /&gt;
    nlen = мзЧислоА.Количество();&lt;br /&gt;
	a = Новый Массив(nlen);&lt;br /&gt;
	Для i = 0 по nlen - 1 Цикл&lt;br /&gt;
		a[i] = 0;&lt;br /&gt;
	КонецЦикла;&lt;br /&gt;
	a[nlen - 1] = 1;&lt;br /&gt;
	&lt;br /&gt;
	s = Новый Массив(nlen);&lt;br /&gt;
	e = Новый Массив(nlen);&lt;br /&gt;
	Для i = 0 по nlen - 1 Цикл&lt;br /&gt;
		s[i] = мзЧислоА[i];&lt;br /&gt;
		e[i] = мзЧислоБ[i];&lt;br /&gt;
	КонецЦикла;&lt;br /&gt;
	&lt;br /&gt;
	Для nBits = 1 по nlen * 8 Цикл&lt;br /&gt;
		Если e[nlen -1] % 2 &amp;lt;&amp;gt; 0 Тогда&lt;br /&gt;
			a = мзУмножитьПоМодулю(a, s, мзЧислоМ);&lt;br /&gt;
		КонецЕсли;&lt;br /&gt;
		&lt;br /&gt;
		мзРазделитьНаДва(e);&lt;br /&gt;
		&lt;br /&gt;
		Если мзЭтоНуль(e) Тогда&lt;br /&gt;
			Прервать;&lt;br /&gt;
		КонецЕсли;&lt;br /&gt;
		&lt;br /&gt;
		s = мзУмножитьПоМодулю(s, s, мзЧислоМ);&lt;br /&gt;
		&lt;br /&gt;
	КонецЦикла;&lt;br /&gt;
	&lt;br /&gt;
	Возврат a;&lt;br /&gt;
	&lt;br /&gt;
КонецФункции&lt;br /&gt;
&lt;br /&gt;
Процедура мзУдалитьВедущиеНули(мзЧисло) Экспорт &lt;br /&gt;
	Пока мзЧисло.Количество() &amp;gt; 0 Цикл&lt;br /&gt;
		Если мзЧисло[0] = 0 Тогда&lt;br /&gt;
			мзЧисло.Удалить(0);&lt;br /&gt;
		Иначе&lt;br /&gt;
			Возврат;&lt;br /&gt;
		КонецЕсли;&lt;br /&gt;
	КонецЦикла;&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// А ^ Б mod М&lt;br /&gt;
Функция СтепеньПоМодулю(стрЧислоА, стрЧислоБ, стрЧислоМ) Экспорт&lt;br /&gt;
	мзЧислоА = ИзСтроки16(стрЧислоА);&lt;br /&gt;
	мзЧислоБ = ИзСтроки16(стрЧислоБ);&lt;br /&gt;
	мзЧислоМ = ИзСтроки16(стрЧислоМ);&lt;br /&gt;
	&lt;br /&gt;
	мзВыровнятьДлину(мзЧислоА, мзЧислоБ, мзЧислоМ);&lt;br /&gt;
	мзРезультат = мзСтепеньПоМодулю(мзЧислоА, мзЧислоБ, мзЧислоМ);&lt;br /&gt;
	мзУдалитьВедущиеНули(мзРезультат);&lt;br /&gt;
	&lt;br /&gt;
	Возврат ВСтроку16(мзРезультат);&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;source lang=1c&amp;gt;&lt;br /&gt;
// --[[Участник:Павел Лазарев|Павел Лазарев]] 13:00, 20 декабря 2009 (SAMT)&lt;br /&gt;
&lt;br /&gt;
#Если Клиент Тогда&lt;br /&gt;
&lt;br /&gt;
Процедура Тест_ИзСтроки16() Экспорт&lt;br /&gt;
	мзЧисло = ДлиннаяАрифметика.ИзСтроки16(&amp;quot;&amp;quot;);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(0, мзЧисло.Количество());&lt;br /&gt;
	&lt;br /&gt;
	мзЧисло = ДлиннаяАрифметика.ИзСтроки16(&amp;quot;1&amp;quot;);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(1, мзЧисло.Количество());&lt;br /&gt;
	Тестирование.ПроверитьРавенство(1, мзЧисло[0]);&lt;br /&gt;
	&lt;br /&gt;
	мзЧисло =  ДлиннаяАрифметика.ИзСтроки16(&amp;quot;ffe&amp;quot;);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(2, мзЧисло.Количество());&lt;br /&gt;
	Тестирование.ПроверитьРавенство(15, мзЧисло[0]);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(254, мзЧисло[1]);&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	мзЧисло =  ДлиннаяАрифметика.ИзСтроки16(&amp;quot;FfeE01&amp;quot;);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(3, мзЧисло.Количество());&lt;br /&gt;
	Тестирование.ПроверитьРавенство(255, мзЧисло[0]);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(238, мзЧисло[1]);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(1, мзЧисло[2]);&lt;br /&gt;
	&lt;br /&gt;
	мзЧисло = ДлиннаяАрифметика.ИзСтроки16(&amp;quot;deadbeef&amp;quot;);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(4, мзЧисло.Количество());&lt;br /&gt;
	Тестирование.ПроверитьРавенство(222, мзЧисло[0]);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(173, мзЧисло[1]);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(190, мзЧисло[2]);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(239, мзЧисло[3]);&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
Процедура Тест_ВСтроку16() Экспорт&lt;br /&gt;
	мзЧисло = Новый Массив;&lt;br /&gt;
	&lt;br /&gt;
	Тестирование.ПроверитьРавенство(&amp;quot;&amp;quot;, ДлиннаяАрифметика.ВСтроку16(мзЧисло));&lt;br /&gt;
	&lt;br /&gt;
	мзЧисло.Очистить();&lt;br /&gt;
	мзЧисло.Добавить(1);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(&amp;quot;01&amp;quot;, ДлиннаяАрифметика.ВСтроку16(мзЧисло));&lt;br /&gt;
	&lt;br /&gt;
	мзЧисло.Очистить();&lt;br /&gt;
	мзЧисло.Добавить(255);&lt;br /&gt;
	мзЧисло.Добавить(238);&lt;br /&gt;
	мзЧисло.Добавить(1);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(&amp;quot;FFEE01&amp;quot;, ДлиннаяАрифметика.ВСтроку16(мзЧисло));&lt;br /&gt;
	&lt;br /&gt;
	мзЧисло.Очистить();&lt;br /&gt;
	мзЧисло.Добавить(222);&lt;br /&gt;
	мзЧисло.Добавить(173);&lt;br /&gt;
	мзЧисло.Добавить(190);&lt;br /&gt;
	мзЧисло.Добавить(239);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(&amp;quot;DEADBEEF&amp;quot;, ДлиннаяАрифметика.ВСтроку16(мзЧисло));&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
Процедура Тест_мзРазделитьНаДва() Экспорт&lt;br /&gt;
	мзЧисло =  ДлиннаяАрифметика.ИзСтроки16(&amp;quot;ffee&amp;quot;);&lt;br /&gt;
	ДлиннаяАрифметика.мзРазделитьНаДва(мзЧисло);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(&amp;quot;7FF7&amp;quot;, ДлиннаяАрифметика.ВСтроку16(мзЧисло));&lt;br /&gt;
	&lt;br /&gt;
	мзЧисло =  ДлиннаяАрифметика.ИзСтроки16(&amp;quot;5518f65d&amp;quot;);&lt;br /&gt;
	ДлиннаяАрифметика.мзРазделитьНаДва(мзЧисло);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(&amp;quot;2A8C7B2E&amp;quot;, ДлиннаяАрифметика.ВСтроку16(мзЧисло));&lt;br /&gt;
	&lt;br /&gt;
	мзЧисло =  ДлиннаяАрифметика.ИзСтроки16(&amp;quot;5518f65dFFEE01DEADBEEF&amp;quot;);&lt;br /&gt;
	ДлиннаяАрифметика.мзРазделитьНаДва(мзЧисло);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(&amp;quot;2A8C7B2EFFF700EF56DF77&amp;quot;, ДлиннаяАрифметика.ВСтроку16(мзЧисло));&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
Процедура Тест_мзЭтоНуль() Экспорт&lt;br /&gt;
	мзЧисло =  ДлиннаяАрифметика.ИзСтроки16(&amp;quot;ffee&amp;quot;);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(Ложь, ДлиннаяАрифметика.мзЭтоНуль(мзЧисло));&lt;br /&gt;
	&lt;br /&gt;
	мзЧисло =  ДлиннаяАрифметика.ИзСтроки16(&amp;quot;&amp;quot;);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(Истина, ДлиннаяАрифметика.мзЭтоНуль(мзЧисло));&lt;br /&gt;
	&lt;br /&gt;
	мзЧисло =  ДлиннаяАрифметика.ИзСтроки16(&amp;quot;00000000000000000000000000000000000000&amp;quot;);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(Истина, ДлиннаяАрифметика.мзЭтоНуль(мзЧисло));&lt;br /&gt;
	&lt;br /&gt;
	мзЧисло =  ДлиннаяАрифметика.ИзСтроки16(&amp;quot;00000000000000000000000000000030000000&amp;quot;);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(Ложь, ДлиннаяАрифметика.мзЭтоНуль(мзЧисло));&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
Процедура Тест_мзВыровнятьДлину() Экспорт &lt;br /&gt;
	мзЧислоА =  ДлиннаяАрифметика.ИзСтроки16(&amp;quot;FFEE&amp;quot;);&lt;br /&gt;
	мзЧислоБ =  ДлиннаяАрифметика.ИзСтроки16(&amp;quot;5518f65d&amp;quot;);&lt;br /&gt;
	мзЧислоМ =  ДлиннаяАрифметика.ИзСтроки16(&amp;quot;FFEEDD&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	ДлиннаяАрифметика.мзВыровнятьДлину(мзЧислоА, мзЧислоБ, мзЧислоМ);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(5, мзЧислоА.Количество());&lt;br /&gt;
	Тестирование.ПроверитьРавенство(5, мзЧислоБ.Количество());&lt;br /&gt;
	Тестирование.ПроверитьРавенство(5, мзЧислоМ.Количество());&lt;br /&gt;
	&lt;br /&gt;
	Тестирование.ПроверитьРавенство(&amp;quot;000000FFEE&amp;quot;, ДлиннаяАрифметика.ВСтроку16(мзЧислоА));&lt;br /&gt;
	Тестирование.ПроверитьРавенство(&amp;quot;005518F65D&amp;quot;, ДлиннаяАрифметика.ВСтроку16(мзЧислоБ));&lt;br /&gt;
	Тестирование.ПроверитьРавенство(&amp;quot;0000FFEEDD&amp;quot;, ДлиннаяАрифметика.ВСтроку16(мзЧислоМ));&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
Процедура Тест_мзВычесть() Экспорт &lt;br /&gt;
	мзЧислоА =  ДлиннаяАрифметика.ИзСтроки16(&amp;quot;5518f65d&amp;quot;);&lt;br /&gt;
	мзЧислоБ =  ДлиннаяАрифметика.ИзСтроки16(&amp;quot;FFEE&amp;quot;);&lt;br /&gt;
	мзЧислоМ =  ДлиннаяАрифметика.ИзСтроки16(&amp;quot;&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	ДлиннаяАрифметика.мзВыровнятьДлину(мзЧислоА, мзЧислоБ, мзЧислоМ);&lt;br /&gt;
	ДлиннаяАрифметика.мзВычесть(мзЧислоА, мзЧислоБ);&lt;br /&gt;
	&lt;br /&gt;
	Тестирование.ПроверитьРавенство(&amp;quot;005517F66F&amp;quot;, ДлиннаяАрифметика.ВСтроку16(мзЧислоА));&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Процедура Тест_мзДобавитьПоМодулю() Экспорт &lt;br /&gt;
	мзЧислоА =  ДлиннаяАрифметика.ИзСтроки16(&amp;quot;FFEE&amp;quot;);&lt;br /&gt;
	мзЧислоБ =  ДлиннаяАрифметика.ИзСтроки16(&amp;quot;5518f65d&amp;quot;);//5519F64B&lt;br /&gt;
	мзЧислоМ =  ДлиннаяАрифметика.ИзСтроки16(&amp;quot;550FEEDD&amp;quot;);&lt;br /&gt;
	//a = (a+b) mod m&lt;br /&gt;
	ДлиннаяАрифметика.мзВыровнятьДлину(мзЧислоА, мзЧислоБ, мзЧислоМ);&lt;br /&gt;
	ДлиннаяАрифметика.мзДобавитьПоМодулю(мзЧислоА, мзЧислоБ, мзЧислоМ);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(&amp;quot;00000A076E&amp;quot;, ДлиннаяАрифметика.ВСтроку16(мзЧислоА));&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	мзЧислоА =  ДлиннаяАрифметика.ИзСтроки16(&amp;quot;FFEE&amp;quot;);&lt;br /&gt;
	мзЧислоБ =  ДлиннаяАрифметика.ИзСтроки16(&amp;quot;5518f65d&amp;quot;);//5519F64B&lt;br /&gt;
	мзЧислоМ =  ДлиннаяАрифметика.ИзСтроки16(&amp;quot;32A8C7B2EF&amp;quot;);&lt;br /&gt;
	//a = (a+b) mod m&lt;br /&gt;
	ДлиннаяАрифметика.мзВыровнятьДлину(мзЧислоА, мзЧислоБ, мзЧислоМ);&lt;br /&gt;
	ДлиннаяАрифметика.мзДобавитьПоМодулю(мзЧислоА, мзЧислоБ, мзЧислоМ);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(&amp;quot;00005519F64B&amp;quot;, ДлиннаяАрифметика.ВСтроку16(мзЧислоА));&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
Процедура Тест_мзУмножитьПоМодулю() Экспорт &lt;br /&gt;
	мзЧислоА =  ДлиннаяАрифметика.ИзСтроки16(&amp;quot;FFEE&amp;quot;);&lt;br /&gt;
	мзЧислоБ =  ДлиннаяАрифметика.ИзСтроки16(&amp;quot;5518f65d&amp;quot;);//5512FA9BAD76&lt;br /&gt;
	мзЧислоМ =  ДлиннаяАрифметика.ИзСтроки16(&amp;quot;550FEEDD&amp;quot;);&lt;br /&gt;
	//(a*b) mod m&lt;br /&gt;
	ДлиннаяАрифметика.мзВыровнятьДлину(мзЧислоА, мзЧислоБ, мзЧислоМ);&lt;br /&gt;
	мзЧислоАА = ДлиннаяАрифметика.мзУмножитьПоМодулю(мзЧислоА, мзЧислоБ, мзЧислоМ);&lt;br /&gt;
	//	Тестирование.ПроверитьРавенство(&amp;quot;000E2F47B1&amp;quot;, ДлиннаяАрифметика.ВСтроку16(мзЧислоАА));&lt;br /&gt;
	&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Процедура Тест_СтепеньПоМодулю() Экспорт &lt;br /&gt;
	&lt;br /&gt;
	Тестирование.ПроверитьРавенство(&amp;quot;5B56&amp;quot;, ДлиннаяАрифметика.СтепеньПоМодулю(&amp;quot;3c&amp;quot;, &amp;quot;03&amp;quot;, &amp;quot;face&amp;quot;));&lt;br /&gt;
	Тестирование.ПроверитьРавенство(&amp;quot;6A35DDD3C9CF&amp;quot;, ДлиннаяАрифметика.СтепеньПоМодулю(&amp;quot;beef&amp;quot;, &amp;quot;03&amp;quot;, &amp;quot;1000000000000&amp;quot;)); &lt;br /&gt;
	Тестирование.ПроверитьРавенство(&amp;quot;C9CF&amp;quot;, ДлиннаяАрифметика.СтепеньПоМодулю(&amp;quot;beef&amp;quot;, &amp;quot;03&amp;quot;, &amp;quot;10000&amp;quot;));&lt;br /&gt;
	&lt;br /&gt;
	//' Do a mini-RSA encryption with 32-bit key:&lt;br /&gt;
	//' Public key (n, e) = (0x5518f65d, 0x11)&lt;br /&gt;
	//' Private key d = 0x2309cd31&lt;br /&gt;
	//' Message m = 0x35b9a3cb&lt;br /&gt;
	//' Encrypt c = m^e mod n = 35b9a3cb^11 mod 5518f65d = 528C41E5&lt;br /&gt;
	//' Decrypt m' = c^d mod n = 528C41E5^2309cd31 mod 5518f65d = 35B9A3CB&lt;br /&gt;
	Тестирование.ПроверитьРавенство(&amp;quot;528C41E5&amp;quot;, ДлиннаяАрифметика.СтепеньПоМодулю(&amp;quot;35b9a3cb&amp;quot;, &amp;quot;11&amp;quot;, &amp;quot;5518f65d&amp;quot;));&lt;br /&gt;
	Тестирование.ПроверитьРавенство(&amp;quot;35B9A3CB&amp;quot;, ДлиннаяАрифметика.СтепеньПоМодулю(&amp;quot;528C41E5&amp;quot;, &amp;quot;2309cd31&amp;quot;, &amp;quot;5518f65d&amp;quot;));&lt;br /&gt;
	&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
//' An example of an RSA calculation using mpModExp from&lt;br /&gt;
//' &amp;quot;Some Examples of the PKCS Standards&amp;quot;,&lt;br /&gt;
//' An RSA Laboratories Technical Note,&lt;br /&gt;
//' Burton S. Kaliski Jr., November 1, 1993.&lt;br /&gt;
//' RSA key is 508 bits long.&lt;br /&gt;
//' WARNING: this may take some time!&lt;br /&gt;
Процедура Тест_RSA508() Экспорт &lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	strMod = &amp;quot;0A66791DC6988168&lt;br /&gt;
	|DE7AB77419BB7FB0&lt;br /&gt;
	|C001C62710270075&lt;br /&gt;
	|142942E19A8D8C51&lt;br /&gt;
	|D053B3E3782A1DE5&lt;br /&gt;
	|DC5AF4EBE9946817&lt;br /&gt;
	|0114A1DFE67CDC9A&lt;br /&gt;
	|9AF55D655620BBAB&amp;quot;;&lt;br /&gt;
	strExp = &amp;quot;010001&amp;quot;;&lt;br /&gt;
	strPri = &amp;quot;0123C5B61BA36EDB&lt;br /&gt;
	|1D3679904199A89E&lt;br /&gt;
	|A80C09B9122E1400&lt;br /&gt;
	|C09ADCF7784676D0&lt;br /&gt;
	|1D23356A7D44D6BD&lt;br /&gt;
	|8BD50E94BFC723FA&lt;br /&gt;
	|87D8862B75177691&lt;br /&gt;
	|C11D757692DF8881&amp;quot;;&lt;br /&gt;
	strMsg = &amp;quot;1FFFFFFFFFFFF&lt;br /&gt;
	|FFFFFFFFFFFFFFFF&lt;br /&gt;
	|FFFFFFFFFFFFFFFF&lt;br /&gt;
	|FFFFFFFFFF003020&lt;br /&gt;
	|300C06082A864886&lt;br /&gt;
	|F70D020205000410&lt;br /&gt;
	|DCA9ECF1C15C1BD2&lt;br /&gt;
	|66AFF9C8799365CD&amp;quot;;&lt;br /&gt;
	strOK = &amp;quot;6DB36CB18D3475B&lt;br /&gt;
	|9C01DB3C78952808&lt;br /&gt;
	|0279BBAEFF2B7D55&lt;br /&gt;
	|8ED6615987C85186&lt;br /&gt;
	|3F8A6C2CFFBC89C3&lt;br /&gt;
	|F75A18D96B127C71&lt;br /&gt;
	|7D54D0D8048DA8A0&lt;br /&gt;
	|544626D17A2A8FBE&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	//' Sign, i.e. Encrypt with private key, s = m^d mod n&lt;br /&gt;
	strSig = ДлиннаяАрифметика.СтепеньПоМодулю(strMsg, strPri, strMod);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(strOK, strSig);&lt;br /&gt;
	&lt;br /&gt;
	//' Verify, i.e. Decrypt with public key m' = s^e mod n&lt;br /&gt;
	strVer = ДлиннаяАрифметика.СтепеньПоМодулю(strSig, strExp, strMod);&lt;br /&gt;
	Тестирование.ПроверитьРавенство(strVer, strMsg);&lt;br /&gt;
	&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
Процедура Тест_RSA1() Экспорт &lt;br /&gt;
	&lt;br /&gt;
	// пример с http://ru.wikipedia.org/wiki/Rsa&lt;br /&gt;
	//' Do a mini-RSA encryption&lt;br /&gt;
	//' Public key (n, e) = (8BF9FF, 3)&lt;br /&gt;
	//' Private key (n, d) = (8BF9FF, 5D415B)&lt;br /&gt;
	//' Message m = 1B207&lt;br /&gt;
	//' Encrypt c = m^e mod n = 1B207^3 mod 8BF9FF = 3DD329&lt;br /&gt;
	//' Decrypt m' = c^d mod n = 3DD329^5D415B mod 8BF9FF = 1B207&lt;br /&gt;
	Тестирование.ПроверитьРавенство(&amp;quot;3DD329&amp;quot;, ДлиннаяАрифметика.СтепеньПоМодулю(&amp;quot;1B207&amp;quot;, &amp;quot;3&amp;quot;, &amp;quot;8BF9FF&amp;quot;));&lt;br /&gt;
	Тестирование.ПроверитьРавенство(&amp;quot;01B207&amp;quot;, ДлиннаяАрифметика.СтепеньПоМодулю(&amp;quot;3DD329&amp;quot;, &amp;quot;5D415B&amp;quot;, &amp;quot;8BF9FF&amp;quot;));&lt;br /&gt;
	&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
Процедура Тест_Diffie_Hellman() Экспорт &lt;br /&gt;
	//' A very simple example of Diffie-Hellman key exchange.&lt;br /&gt;
	//' CAUTION: Practical use requires numbers of 1000-2000+ bits in length&lt;br /&gt;
	//' and other checks on suitability of p and g.&lt;br /&gt;
	//' EXPLANATION OF SIMPLE DIFFIE-HELLMAN&lt;br /&gt;
	//' 1. Both parties agree to select and share a public generator, say, g = 3&lt;br /&gt;
	//'    and public prime modulus  p = 0xc773218c737ec8ee993b4f2ded30f48edace915f&lt;br /&gt;
	//' 2. Alice selects private key x = 0x849dbd59069bff80cf30d052b74beeefc285b46f&lt;br /&gt;
	//' 3. Alice's public key is Ya = g^x mod p. Alice sends this to Bob.&lt;br /&gt;
	//' 4. To send a concealed, shared secret key to Alice, Bob picks a secret random number&lt;br /&gt;
	//'    say, y = 0x40a2cf7390f76c1f2eef39c33eb61fb11811d528&lt;br /&gt;
	//' 5. Bob computes Yb = g^y mod p and sends this to Alice.&lt;br /&gt;
	//' 6. Bob can computes the shared key k = Ya^y mod p,&lt;br /&gt;
	//'    to use for further communications with Alice&lt;br /&gt;
	//' 7. Alice can compute the same shared key k = Yb^x mod p,&lt;br /&gt;
	//'    to use for further communications with Bob.&lt;br /&gt;
	//' Note: k = Ya^y = (g^x)^y = g^(xy) = Yb^x = (g^y)^x = g^(xy) mod p&lt;br /&gt;
	//' An eavesdropper only sees g, p, Ya and Yb.&lt;br /&gt;
	//' It is easy to compute Y=g^x mod p but it is&lt;br /&gt;
	//' difficult to compute x given g^x mod p.&lt;br /&gt;
	//' This is the discrete logarithm problem.&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//' Alice computes Ya = g^x mod p&lt;br /&gt;
	Ya = ДлиннаяАрифметика.СтепеньПоМодулю(&amp;quot;3&amp;quot;, &amp;quot;849dbd59069bff80cf30d052b74beeefc285b46f&amp;quot;, &amp;quot;c773218c737ec8ee993b4f2ded30f48edace915f&amp;quot;);&lt;br /&gt;
	//' Bob computes Yb = g^y mod p&lt;br /&gt;
	Yb = ДлиннаяАрифметика.СтепеньПоМодулю(&amp;quot;3&amp;quot;, &amp;quot;40a2cf7390f76c1f2eef39c33eb61fb11811d528&amp;quot;, &amp;quot;c773218c737ec8ee993b4f2ded30f48edace915f&amp;quot;);&lt;br /&gt;
	//' Alice computes the secret key k = Yb^x mod p&lt;br /&gt;
	Ka = ДлиннаяАрифметика.СтепеньПоМодулю(Yb, &amp;quot;849dbd59069bff80cf30d052b74beeefc285b46f&amp;quot;, &amp;quot;c773218c737ec8ee993b4f2ded30f48edace915f&amp;quot;);&lt;br /&gt;
	//' Bob computes the secret key k = Ya^y mod p&lt;br /&gt;
	Kb = ДлиннаяАрифметика.СтепеньПоМодулю(Ya, &amp;quot;40a2cf7390f76c1f2eef39c33eb61fb11811d528&amp;quot;, &amp;quot;c773218c737ec8ee993b4f2ded30f48edace915f&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	Тестирование.ПроверитьРавенство(Ka, Kb);&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
Процедура ПередВыполнениемТеста() Экспорт&lt;br /&gt;
	&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
Процедура ПослеВыполненияТеста() Экспорт&lt;br /&gt;
КонецПроцедуры&lt;br /&gt;
&lt;br /&gt;
Функция ДоступныеТесты() Экспорт&lt;br /&gt;
	спДоступныеТесты = Новый СписокЗначений;&lt;br /&gt;
	спДоступныеТесты.Добавить(&amp;quot;Тест_ВСтроку16&amp;quot;, &amp;quot;ВСтроку16&amp;quot;, Истина);&lt;br /&gt;
	спДоступныеТесты.Добавить(&amp;quot;Тест_ИзСтроки16&amp;quot;, &amp;quot;ИзСтроки16&amp;quot;, Истина);&lt;br /&gt;
	спДоступныеТесты.Добавить(&amp;quot;Тест_мзРазделитьНаДва&amp;quot;, &amp;quot;мзРазделитьНаДва&amp;quot;, Истина);&lt;br /&gt;
	спДоступныеТесты.Добавить(&amp;quot;Тест_мзЭтоНуль&amp;quot;, &amp;quot;мзЭтоНуль&amp;quot;, Истина);&lt;br /&gt;
	спДоступныеТесты.Добавить(&amp;quot;Тест_мзВыровнятьДлину&amp;quot;, &amp;quot;мзВыровнятьДлину&amp;quot;, Истина);&lt;br /&gt;
	спДоступныеТесты.Добавить(&amp;quot;Тест_мзВычесть&amp;quot;, &amp;quot;мзВычесть&amp;quot;, Истина);&lt;br /&gt;
	спДоступныеТесты.Добавить(&amp;quot;Тест_мзДобавитьПоМодулю&amp;quot;, &amp;quot;мзДобавитьПоМодулю&amp;quot;, Истина);&lt;br /&gt;
	спДоступныеТесты.Добавить(&amp;quot;Тест_мзУмножитьПоМодулю&amp;quot;, &amp;quot;мзУмножитьПоМодулю&amp;quot;, Истина);&lt;br /&gt;
	спДоступныеТесты.Добавить(&amp;quot;Тест_СтепеньПоМодулю&amp;quot;, &amp;quot;СтепеньПоМодулю&amp;quot;, Истина);&lt;br /&gt;
	спДоступныеТесты.Добавить(&amp;quot;Тест_RSA508&amp;quot;, &amp;quot;RSA508&amp;quot;, Ложь);&lt;br /&gt;
	спДоступныеТесты.Добавить(&amp;quot;Тест_RSA1&amp;quot;, &amp;quot;RSA Пример 1&amp;quot;, Истина);&lt;br /&gt;
	спДоступныеТесты.Добавить(&amp;quot;Тест_Diffie_Hellman&amp;quot;, &amp;quot;Diffie_Hellman Пример 1&amp;quot;, Ложь);&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>