<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Demiandr</id>
	<title>Алговики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Demiandr"/>
	<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Demiandr"/>
	<updated>2026-10-22T19:06:40Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28684</id>
		<title>Дифференцильная атака</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28684"/>
		<updated>2021-11-15T10:48:14Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: /* Информационный граф алгоритма и блок-схема обработки одного текста */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю [math] 2^{32}[/math]. Является статистической атакой.  Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Так как раундовые ключи однозначно получаются из основного секретного ключа, задачей криптоаналитика является нахождение раундовых ключей, после чего восстанавливается секретный ключ. В данном виде атак на блочные алгоритмы шифрования находятся статистические зависимости между двумя текстами с определенной входной разницей &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, после чего определяется наиболее вероятная разница выходных шифртекстов &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt; на предпоследнем раунде &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt;. Такая зависимость между входной и выходной разницами пар текстов называется дифференциальной характеристикой. Способы определения дифференциальных характеристик чрезвычайно сложны и разнятся от алгоритма к алгоритму, поэтому опускаются в данной статье. После нахождения дифференциальной характеристики производится атака на блочный алгоритм шифрования.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - вероятность дифференциальной характеристики &amp;lt;math&amp;gt;Δfirst→Δlast&amp;lt;/math&amp;gt;, воздействущей на &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит результирующего шифртекста. Тогда атака проводится следующим образом:&lt;br /&gt;
# Берется небольшая положительная константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (обычно равная 2 или 3). Генерируется &amp;lt;math&amp;gt;c/p&amp;lt;/math&amp;gt; пар текстов с входной разницей &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Все данные пары текстов пропускаются через &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов алгоритма шифрования, после чего получаются соответствующие шифртексты &amp;lt;math&amp;gt;Y_{R}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Для всех возможных значений &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа заводится свой счетчик. Далее для каждой сгенерированной пары шифртекстов &amp;lt;math&amp;gt;Y_{R}&amp;lt;/math&amp;gt; данные тексты расшифровываются на всех возможных значениях &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа, в результате чего получаются значения &amp;lt;math&amp;gt;Y_{R-1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Для каждой пары текстов путем их сложения находится своя разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt;. Далее значение &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается c &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt;. Если они совпадают, счетчик для данного &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит ключа увеличивается на 1.&lt;br /&gt;
После такого полного перебора раундовым ключом является то значение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит, которое имеет наибольший счетчик. Определив таким образом биты раундового ключа можно найти значение секретного ключа и взломать алгоритм шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифртекстов и возможного значения бит раундового ключа последнего раунда найденной характеристики  происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;gt; раунде совпадает с искомой разницей &amp;lt;math&amp;gt;ΔU&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2c/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит число пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма и блок-схема обработки одного текста ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим [[глоссарий#Граф алгоритма|информационный граф]] для обработки всех пар текстов. Как видно из графа, обработка каждой пары текстов происходит независимо, после чего значения всех счетчиков сохраняются в один список.&lt;br /&gt;
[[Файл:Infograph.jpg|обрамить|центр| Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
Действия, происходящие для каждой пары текстов в графе, можно подробно рассмотреть с использованием следующей блок-схемы. Как из видно схемы, для каждого текста &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; сначала генерируется второй текст при помощи добавления к нему разницы &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, взятой из дифференциальной характеристики, после чего происходит шифрование на протяжение &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов для обеих текстов из пары. После получения шифртекстов &amp;lt;math&amp;gt;Y_R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Y&#039;_R&amp;lt;/math&amp;gt; в результате последнего раунда, для всех возможных &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа происходит частичное расшифрование, после чего в каждой паре тексты складываются и их разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается с искомой &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt; в характеристике. Если разницы текстов совпадают, данные значения бит раундового ключа заносятся в результат.&lt;br /&gt;
[[Файл:Блок схема.jpg|обрамить|центр| Блок-схема обработки одного текста]]&lt;br /&gt;
Стоит отметить, что описанные выше преобразования  происходят с каждым текстом, а число данных текстов зависит от вероятности найденной дифференциальной характеристики.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как видно из предыдущего пункта, обработка каждого текста из множества возможных текстов происходит независимо от других текстов. Таким образом, каждый процесс может шифровать и расшифровывать свою часть всего множества текстов, что даст большое ускорение работы алгоритма. Объединяя полученные результаты со всех процессов можно определить результирующие биты последнего раундового ключа.&lt;br /&gt;
&lt;br /&gt;
Стоить отметить, что существуют другие ресурсы параллелизма, как в алгоритме атаки, так и в алгоритме шифрования, но их параллелизм не является эффективным. Так как в каждой паре существует два текста, каждый текст из пары можно шифровать и расшифровывать параллельно, однако так как число пар в блочном шифре Present может близиться к &amp;lt;math&amp;gt;2^{32}&amp;lt;/math&amp;gt; и для каждой пары необходимо находить разницу текстов данной пары, более эффективным является обработка обеих текстов из пары одним процессом. &lt;br /&gt;
Помимо этого, некоторые операции в алгоритме шифрования могут выполняться параллельно. Такими операциями являются операция побитового сложения текста с раундовым ключом и операция подстановки бит частей текста по 4 бита. Так как подобная параллельность обычно достигается при аппаратной реализации шифрования (где каждый бит текста течет по своему каналу), то при программной реализации более эффективным является совмещение преобразований в одно, путем хранения результата преобразований в одной большой таблице. Распараллеливание этих операция для каждого текста из всех обрабатываемых текстов принесет огромные накладные расходы на синхронизацию и обмен информацией между процессами.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: алгоритм шифрования, константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, вероятность характеристики &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, число бит раундового ключа &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число раундов шифрования &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, входная разница между парами текстов &amp;lt;math&amp;gt;deltafirst&amp;lt;/math&amp;gt;, выходная разница между парами текстов &amp;lt;math&amp;gt;deltalast&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: Объем входных не изменяется, изменяются только сами входные данные. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Биты раундового ключа последнего раунда.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов-2&amp;quot;. При компиляции использовался компилятор Openmpi/4.1.0-icc.&lt;br /&gt;
&lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
! colspan=&amp;quot;6&amp;quot;|Число процессов&lt;br /&gt;
|-&lt;br /&gt;
! Число генерируемых пар текстов&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|4&lt;br /&gt;
|8&lt;br /&gt;
|16&lt;br /&gt;
|32&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|42,1364&lt;br /&gt;
|21,1016&lt;br /&gt;
|11,6119&lt;br /&gt;
|6,1043&lt;br /&gt;
|3,06838&lt;br /&gt;
|1,5346&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;2*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|84,4536  &lt;br /&gt;
|45,0574&lt;br /&gt;
|23,3564 &lt;br /&gt;
|12,2063 &lt;br /&gt;
|6,13689 &lt;br /&gt;
|3,0685&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;4*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|169,6 &lt;br /&gt;
|85,1138 &lt;br /&gt;
|46,0756 &lt;br /&gt;
|24,4103 &lt;br /&gt;
|12,276 &lt;br /&gt;
|6,1380  &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;8*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|339,081 &lt;br /&gt;
|170,628 &lt;br /&gt;
|95,0417 &lt;br /&gt;
|48,8382 &lt;br /&gt;
|24,5472 &lt;br /&gt;
|12,275 &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;16*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|683,5931 &lt;br /&gt;
|345,1143 &lt;br /&gt;
|175,181 &lt;br /&gt;
|97,6816 &lt;br /&gt;
|49,094 &lt;br /&gt;
|24,553&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
В следующей таблице представлены времена работы алгоритма для различного числа процессов и обрабатываемых пар текстов.&lt;br /&gt;
Графически результаты эксперимента представлены на рисунке ниже&lt;br /&gt;
[[Файл:Time.png|обрамить|центр|100x150px|Масштабируемость алгоритма]]&lt;br /&gt;
Алгоритм имеет сильную масштабируемость. Время выполнения алгоритма сокращается почти в 2 раза с увеличением числа обрабатываемых пар текстов в 2 раза.&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;references /&amp;gt;&lt;br /&gt;
M. Heys &amp;quot;A tutorial on linear and differential cryptanalysis&amp;quot; [https://ioactive.com/wp-content/uploads/2015/07/ldc_tutorial.pdf].&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28683</id>
		<title>Дифференцильная атака</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28683"/>
		<updated>2021-11-15T10:42:22Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю [math] 2^{32}[/math]. Является статистической атакой.  Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Так как раундовые ключи однозначно получаются из основного секретного ключа, задачей криптоаналитика является нахождение раундовых ключей, после чего восстанавливается секретный ключ. В данном виде атак на блочные алгоритмы шифрования находятся статистические зависимости между двумя текстами с определенной входной разницей &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, после чего определяется наиболее вероятная разница выходных шифртекстов &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt; на предпоследнем раунде &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt;. Такая зависимость между входной и выходной разницами пар текстов называется дифференциальной характеристикой. Способы определения дифференциальных характеристик чрезвычайно сложны и разнятся от алгоритма к алгоритму, поэтому опускаются в данной статье. После нахождения дифференциальной характеристики производится атака на блочный алгоритм шифрования.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - вероятность дифференциальной характеристики &amp;lt;math&amp;gt;Δfirst→Δlast&amp;lt;/math&amp;gt;, воздействущей на &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит результирующего шифртекста. Тогда атака проводится следующим образом:&lt;br /&gt;
# Берется небольшая положительная константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (обычно равная 2 или 3). Генерируется &amp;lt;math&amp;gt;c/p&amp;lt;/math&amp;gt; пар текстов с входной разницей &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Все данные пары текстов пропускаются через &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов алгоритма шифрования, после чего получаются соответствующие шифртексты &amp;lt;math&amp;gt;Y_{R}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Для всех возможных значений &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа заводится свой счетчик. Далее для каждой сгенерированной пары шифртекстов &amp;lt;math&amp;gt;Y_{R}&amp;lt;/math&amp;gt; данные тексты расшифровываются на всех возможных значениях &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа, в результате чего получаются значения &amp;lt;math&amp;gt;Y_{R-1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Для каждой пары текстов путем их сложения находится своя разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt;. Далее значение &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается c &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt;. Если они совпадают, счетчик для данного &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит ключа увеличивается на 1.&lt;br /&gt;
После такого полного перебора раундовым ключом является то значение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит, которое имеет наибольший счетчик. Определив таким образом биты раундового ключа можно найти значение секретного ключа и взломать алгоритм шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифртекстов и возможного значения бит раундового ключа последнего раунда найденной характеристики  происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;gt; раунде совпадает с искомой разницей &amp;lt;math&amp;gt;ΔU&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2c/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит число пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма и блок-схема обработки одного текста ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим [[глоссарий#Граф алгоритма|информационный граф]] для обработки всех пар текстов. Как видно из графа, обработка каждой пары текстов происходит параллельно, после чего значения всех счетчиков сохраняются в один список.&lt;br /&gt;
[[Файл:Infograph.jpg|обрамить|центр| Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
Действия, происходящие для каждой пары текстов в графе, можно подробно рассмотреть с использованием следующей блок-схемы. Как из видно схемы, для каждого текста &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; сначала генерируется второй текст при помощи добавления к нему разницы &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, взятой из дифференциальной характеристики, после чего происходит шифрование на протяжение &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов для обеих текстов из пары. После получения шифртекстов &amp;lt;math&amp;gt;Y_R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Y&#039;_R&amp;lt;/math&amp;gt; в результате последнего раунда, для всех возможных &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа происходит частичное расшифрование, после чего в каждой паре тексты складываются и их разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается с искомой &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt; в характеристике. Если разницы текстов совпадают, данные значения бит раундового ключа заносятся в результат.&lt;br /&gt;
[[Файл:Блок схема.jpg|обрамить|центр| Блок схема обработки одного текста]]&lt;br /&gt;
Стоит отметить, что описанные выше преобразования  происходят с каждым текстом, а число данных текстов зависит от вероятности найденной дифференциальной характеристики. &lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как видно из предыдущего пункта, обработка каждого текста из множества возможных текстов происходит независимо от других текстов. Таким образом, каждый процесс может шифровать и расшифровывать свою часть всего множества текстов, что даст большое ускорение работы алгоритма. Объединяя полученные результаты со всех процессов можно определить результирующие биты последнего раундового ключа.&lt;br /&gt;
&lt;br /&gt;
Стоить отметить, что существуют другие ресурсы параллелизма, как в алгоритме атаки, так и в алгоритме шифрования, но их параллелизм не является эффективным. Так как в каждой паре существует два текста, каждый текст из пары можно шифровать и расшифровывать параллельно, однако так как число пар в блочном шифре Present может близиться к &amp;lt;math&amp;gt;2^{32}&amp;lt;/math&amp;gt; и для каждой пары необходимо находить разницу текстов данной пары, более эффективным является обработка обеих текстов из пары одним процессом. &lt;br /&gt;
Помимо этого, некоторые операции в алгоритме шифрования могут выполняться параллельно. Такими операциями являются операция побитового сложения текста с раундовым ключом и операция подстановки бит частей текста по 4 бита. Так как подобная параллельность обычно достигается при аппаратной реализации шифрования (где каждый бит текста течет по своему каналу), то при программной реализации более эффективным является совмещение преобразований в одно, путем хранения результата преобразований в одной большой таблице. Распараллеливание этих операция для каждого текста из всех обрабатываемых текстов принесет огромные накладные расходы на синхронизацию и обмен информацией между процессами.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: алгоритм шифрования, константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, вероятность характеристики &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, число бит раундового ключа &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число раундов шифрования &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, входная разница между парами текстов &amp;lt;math&amp;gt;deltafirst&amp;lt;/math&amp;gt;, выходная разница между парами текстов &amp;lt;math&amp;gt;deltalast&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: Объем входных не изменяется, изменяются только сами входные данные. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Биты раундового ключа последнего раунда.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов-2&amp;quot;. При компиляции использовался компилятор Openmpi/4.1.0-icc.&lt;br /&gt;
&lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
! colspan=&amp;quot;6&amp;quot;|Число процессов&lt;br /&gt;
|-&lt;br /&gt;
! Число генерируемых пар текстов&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|4&lt;br /&gt;
|8&lt;br /&gt;
|16&lt;br /&gt;
|32&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|42,1364&lt;br /&gt;
|21,1016&lt;br /&gt;
|11,6119&lt;br /&gt;
|6,1043&lt;br /&gt;
|3,06838&lt;br /&gt;
|1,5346&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;2*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|84,4536  &lt;br /&gt;
|45,0574&lt;br /&gt;
|23,3564 &lt;br /&gt;
|12,2063 &lt;br /&gt;
|6,13689 &lt;br /&gt;
|3,0685&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;4*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|169,6 &lt;br /&gt;
|85,1138 &lt;br /&gt;
|46,0756 &lt;br /&gt;
|24,4103 &lt;br /&gt;
|12,276 &lt;br /&gt;
|6,1380  &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;8*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|339,081 &lt;br /&gt;
|170,628 &lt;br /&gt;
|95,0417 &lt;br /&gt;
|48,8382 &lt;br /&gt;
|24,5472 &lt;br /&gt;
|12,275 &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;16*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|683,5931 &lt;br /&gt;
|345,1143 &lt;br /&gt;
|175,181 &lt;br /&gt;
|97,6816 &lt;br /&gt;
|49,094 &lt;br /&gt;
|24,553&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
В следующей таблице представлены времена работы алгоритма для различного числа процессов и обрабатываемых пар текстов.&lt;br /&gt;
Графически результаты эксперимента представлены на рисунке ниже&lt;br /&gt;
[[Файл:Time.png|обрамить|центр|100x150px|Масштабируемость алгоритма]]&lt;br /&gt;
Алгоритм имеет сильную масштабируемость. Время выполнения алгоритма сокращается почти в 2 раза с увеличением числа обрабатываемых пар текстов в 2 раза.&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;references /&amp;gt;&lt;br /&gt;
M. Heys &amp;quot;A tutorial on linear and differential cryptanalysis&amp;quot; [https://ioactive.com/wp-content/uploads/2015/07/ldc_tutorial.pdf].&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%91%D0%BB%D0%BE%D0%BA_%D1%81%D1%85%D0%B5%D0%BC%D0%B0.jpg&amp;diff=28682</id>
		<title>Файл:Блок схема.jpg</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%91%D0%BB%D0%BE%D0%BA_%D1%81%D1%85%D0%B5%D0%BC%D0%B0.jpg&amp;diff=28682"/>
		<updated>2021-11-15T10:31:16Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;схема работы&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Infograph.jpg&amp;diff=28681</id>
		<title>Файл:Infograph.jpg</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Infograph.jpg&amp;diff=28681"/>
		<updated>2021-11-15T10:00:41Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Граф алгоритма атаки&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28680</id>
		<title>Дифференцильная атака</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28680"/>
		<updated>2021-11-14T09:56:01Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю [math] 2^{32}[/math]. Является статистической атакой.  Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Так как раундовые ключи однозначно получаются из основного секретного ключа, задачей криптоаналитика является нахождение раундовых ключей, после чего восстанавливается секретный ключ. В данном виде атак на блочные алгоритмы шифрования находятся статистические зависимости между двумя текстами с определенной входной разницей &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, после чего определяется наиболее вероятная разница выходных шифртекстов &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt; на предпоследнем раунде &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt;. Такая зависимость между входной и выходной разницами пар текстов называется дифференциальной характеристикой. Способы определения дифференциальных характеристик чрезвычайно сложны и разнятся от алгоритма к алгоритму, поэтому опускаются в данной статье. После нахождения дифференциальной характеристики производится атака на блочный алгоритм шифрования.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - вероятность дифференциальной характеристики &amp;lt;math&amp;gt;Δfirst→Δlast&amp;lt;/math&amp;gt;, воздействущей на &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит результирующего шифртекста. Тогда атака проводится следующим образом:&lt;br /&gt;
# Берется небольшая положительная константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (обычно равная 2 или 3). Генерируется &amp;lt;math&amp;gt;c/p&amp;lt;/math&amp;gt; пар текстов с входной разницей &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Все данные пары текстов пропускаются через &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов алгоритма шифрования, после чего получаются соответствующие шифртексты &amp;lt;math&amp;gt;Y_{R}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Для всех возможных значений &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа заводится свой счетчик. Далее для каждой сгенерированной пары шифртекстов &amp;lt;math&amp;gt;Y_{R}&amp;lt;/math&amp;gt; данные тексты расшифровываются на всех возможных значениях &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа, в результате чего получаются значения &amp;lt;math&amp;gt;Y_{R-1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Для каждой пары текстов путем их сложения находится своя разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt;. Далее значение &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается c &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt;. Если они совпадают, счетчик для данного &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит ключа увеличивается на 1.&lt;br /&gt;
После такого полного перебора раундовым ключом является то значение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит, которое имеет наибольший счетчик. Определив таким образом биты раундового ключа можно найти значение секретного ключа и взломать алгоритм шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифртекстов и возможного значения бит раундового ключа последнего раунда найденной характеристики  происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;gt; раунде совпадает с искомой разницей &amp;lt;math&amp;gt;ΔU&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2c/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит число пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим [[глоссарий#Граф алгоритма|граф]] для обработки одного текста как аналитически, так и в виде рисунка. Стоит отметить, что описанные ниже преобразования &lt;br /&gt;
происходят с каждым текстом, а число данных текстов зависит от вероятности найденной дифференциальной характеристики. Общий граф алгоритма дифференциальной атаки будет состоять из большого количества независимых графов, типичных показанному ниже.&lt;br /&gt;
Как видно из рисунка, для каждого текста &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; сначала генерируется второй текст при помощи добавления к нему разницы &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, взятой из дифференциальной характеристики, после чего происходит шифрование на протяжение &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов для обеих текстов из пары. После получения шифртекстов &amp;lt;math&amp;gt;Y_R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Y&#039;_R&amp;lt;/math&amp;gt; в результате последнего раунда, для всех возможных &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа происходит частичное расшифрование, после чего в каждой паре тексты складываются и их разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается с искомой &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt; в характеристике. Если разницы текстов совпадают, данные значения бит раундового ключа заносятся в результат.&lt;br /&gt;
[[Файл:Graphdifferential.jpg|обрамить|центр|Алгоритм обработки только одного текста]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как видно из предыдущего пункта, обработка каждого текста из множества возможных текстов происходит независимо от других текстов. Таким образом, каждый процесс может шифровать и расшифровывать свою часть всего множества текстов, что даст большое ускорение работы алгоритма. Объединяя полученные результаты со всех процессов можно определить результирующие биты последнего раундового ключа.&lt;br /&gt;
&lt;br /&gt;
Стоить отметить, что существуют другие ресурсы параллелизма, как в алгоритме атаки, так и в алгоритме шифрования, но их параллелизм не является эффективным. Так как в каждой паре существует два текста, каждый текст из пары можно шифровать и расшифровывать параллельно, однако так как число пар в блочном шифре Present может близиться к &amp;lt;math&amp;gt;2^{32}&amp;lt;/math&amp;gt; и для каждой пары необходимо находить разницу текстов данной пары, более эффективным является обработка обеих текстов из пары одним процессом. &lt;br /&gt;
Помимо этого, некоторые операции в алгоритме шифрования могут выполняться параллельно. Такими операциями являются операция побитового сложения текста с раундовым ключом и операция подстановки бит частей текста по 4 бита. Так как подобная параллельность обычно достигается при аппаратной реализации шифрования (где каждый бит текста течет по своему каналу), то при программной реализации более эффективным является совмещение преобразований в одно, путем хранения результата преобразований в одной большой таблице. Распараллеливание этих операция для каждого текста из всех обрабатываемых текстов принесет огромные накладные расходы на синхронизацию и обмен информацией между процессами.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: алгоритм шифрования, константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, вероятность характеристики &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, число бит раундового ключа &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число раундов шифрования &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, входная разница между парами текстов &amp;lt;math&amp;gt;deltafirst&amp;lt;/math&amp;gt;, выходная разница между парами текстов &amp;lt;math&amp;gt;deltalast&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: Объем входных не изменяется, изменяются только сами входные данные. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Биты раундового ключа последнего раунда.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов-2&amp;quot;. При компиляции использовался компилятор Openmpi/4.1.0-icc.&lt;br /&gt;
&lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
! colspan=&amp;quot;6&amp;quot;|Число процессов&lt;br /&gt;
|-&lt;br /&gt;
! Число генерируемых пар текстов&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|4&lt;br /&gt;
|8&lt;br /&gt;
|16&lt;br /&gt;
|32&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|42,1364&lt;br /&gt;
|21,1016&lt;br /&gt;
|11,6119&lt;br /&gt;
|6,1043&lt;br /&gt;
|3,06838&lt;br /&gt;
|1,5346&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;2*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|84,4536  &lt;br /&gt;
|45,0574&lt;br /&gt;
|23,3564 &lt;br /&gt;
|12,2063 &lt;br /&gt;
|6,13689 &lt;br /&gt;
|3,0685&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;4*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|169,6 &lt;br /&gt;
|85,1138 &lt;br /&gt;
|46,0756 &lt;br /&gt;
|24,4103 &lt;br /&gt;
|12,276 &lt;br /&gt;
|6,1380  &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;8*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|339,081 &lt;br /&gt;
|170,628 &lt;br /&gt;
|95,0417 &lt;br /&gt;
|48,8382 &lt;br /&gt;
|24,5472 &lt;br /&gt;
|12,275 &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;16*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|683,5931 &lt;br /&gt;
|345,1143 &lt;br /&gt;
|175,181 &lt;br /&gt;
|97,6816 &lt;br /&gt;
|49,094 &lt;br /&gt;
|24,553&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
В следующей таблице представлены времена работы алгоритма для различного числа процессов и обрабатываемых пар текстов.&lt;br /&gt;
Графически результаты эксперимента представлены на рисунке ниже&lt;br /&gt;
[[Файл:Time.png|обрамить|центр|100x150px|Масштабируемость алгоритма]]&lt;br /&gt;
Алгоритм имеет сильную масштабируемость. Время выполнения алгоритма сокращается почти в 2 раза с увеличением числа обрабатываемых пар текстов в 2 раза.&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;references /&amp;gt;&lt;br /&gt;
M. Heys &amp;quot;A tutorial on linear and differential cryptanalysis&amp;quot; [https://ioactive.com/wp-content/uploads/2015/07/ldc_tutorial.pdf].&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28679</id>
		<title>Дифференцильная атака</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28679"/>
		<updated>2021-11-14T09:53:33Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю [math] 2^{32}[/math]. Является статистической атакой.  Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Так как раундовые ключи однозначно получаются из основного секретного ключа, задачей криптоаналитика является нахождение раундовых ключей, после чего восстанавливается секретный ключ. В данном виде атак на блочные алгоритмы шифрования находятся статистические зависимости между двумя текстами с определенной входной разницей &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, после чего определяется наиболее вероятная разница выходных шифртекстов &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt; на предпоследнем раунде &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt;. Такая зависимость между входной и выходной разницами пар текстов называется дифференциальной характеристикой. Способы определения дифференциальных характеристик чрезвычайно сложны и разнятся от алгоритма к алгоритму, поэтому опускаются в данной статье. После нахождения дифференциальной характеристики производится атака на блочный алгоритм шифрования.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - вероятность дифференциальной характеристики &amp;lt;math&amp;gt;Δfirst→Δlast&amp;lt;/math&amp;gt;, воздействущей на &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит результирующего шифртекста. Тогда атака проводится следующим образом:&lt;br /&gt;
# Берется небольшая положительная константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (обычно равная 2 или 3). Генерируется &amp;lt;math&amp;gt;c/p&amp;lt;/math&amp;gt; пар текстов с входной разницей &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Все данные пары текстов пропускаются через &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов алгоритма шифрования, после чего получаются соответствующие шифртексты &amp;lt;math&amp;gt;Y_{R}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Для всех возможных значений &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа заводится свой счетчик. Далее для каждой сгенерированной пары шифртекстов &amp;lt;math&amp;gt;Y_{R}&amp;lt;/math&amp;gt; данные тексты расшифровываются на всех возможных значениях &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа, в результате чего получаются значения &amp;lt;math&amp;gt;Y_{R-1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Для каждой пары текстов путем их сложения находится своя разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt;. Далее значение &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается c &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt;. Если они совпадают, счетчик для данного &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит ключа увеличивается на 1.&lt;br /&gt;
После такого полного перебора раундовым ключом является то значение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит, которое имеет наибольший счетчик. Определив таким образом биты раундового ключа можно найти значение секретного ключа и взломать алгоритм шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифртекстов и возможного значения бит раундового ключа последнего раунда найденной характеристики  происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;gt; раунде совпадает с искомой разницей &amp;lt;math&amp;gt;ΔU&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2c/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит число пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим [[глоссарий#Граф алгоритма|граф]] для обработки одного текста как аналитически, так и в виде рисунка. Стоит отметить, что описанные ниже преобразования &lt;br /&gt;
происходят с каждым текстом, а число данных текстов зависит от вероятности найденной дифференциальной характеристики. Общий граф алгоритма дифференциальной атаки будет состоять из большого количества независимых графов, типичных показанному ниже.&lt;br /&gt;
Как видно из рисунка, для каждого текста &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; сначала генерируется второй текст при помощи добавления к нему разницы &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, взятой из дифференциальной характеристики, после чего происходит шифрование на протяжение &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов для обеих текстов из пары. После получения шифртекстов &amp;lt;math&amp;gt;Y_R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Y&#039;_R&amp;lt;/math&amp;gt; в результате последнего раунда, для всех возможных &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа происходит частичное расшифрование, после чего в каждой паре тексты складываются и их разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается с искомой &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt; в характеристике. Если разницы текстов совпадают, данные значения бит раундового ключа заносятся в результат.&lt;br /&gt;
[[Файл:Graphdifferential.jpg|обрамить|центр|Информационная схема работы алгоритма]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как видно из предыдущего пункта, обработка каждого текста из множества возможных текстов происходит независимо от других текстов. Таким образом, каждый процесс может шифровать и расшифровывать свою часть всего множества текстов, что даст большое ускорение работы алгоритма. Объединяя полученные результаты со всех процессов можно определить результирующие биты последнего раундового ключа.&lt;br /&gt;
&lt;br /&gt;
Стоить отметить, что существуют другие ресурсы параллелизма, как в алгоритме атаки, так и в алгоритме шифрования, но их параллелизм не является эффективным. Так как в каждой паре существует два текста, каждый текст из пары можно шифровать и расшифровывать параллельно, однако так как число пар в блочном шифре Present может близиться к &amp;lt;math&amp;gt;2^{32}&amp;lt;/math&amp;gt; и для каждой пары необходимо находить разницу текстов данной пары, более эффективным является обработка обеих текстов из пары одним процессом. &lt;br /&gt;
Помимо этого, некоторые операции в алгоритме шифрования могут выполняться параллельно. Такими операциями являются операция побитового сложения текста с раундовым ключом и операция подстановки бит частей текста по 4 бита. Так как подобная параллельность обычно достигается при аппаратной реализации шифрования (где каждый бит текста течет по своему каналу), то при программной реализации более эффективным является совмещение преобразований в одно, путем хранения результата преобразований в одной большой таблице. Распараллеливание этих операция для каждого текста из всех обрабатываемых текстов принесет огромные накладные расходы на синхронизацию и обмен информацией между процессами.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: алгоритм шифрования, константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, вероятность характеристики &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, число бит раундового ключа &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число раундов шифрования &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, входная разница между парами текстов &amp;lt;math&amp;gt;deltafirst&amp;lt;/math&amp;gt;, выходная разница между парами текстов &amp;lt;math&amp;gt;deltalast&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: Объем входных не изменяется, изменяются только сами входные данные. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Биты раундового ключа последнего раунда.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов-2&amp;quot;. При компиляции использовался компилятор Openmpi/4.1.0-icc.&lt;br /&gt;
&lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
! colspan=&amp;quot;6&amp;quot;|Число процессов&lt;br /&gt;
|-&lt;br /&gt;
! Число генерируемых пар текстов&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|4&lt;br /&gt;
|8&lt;br /&gt;
|16&lt;br /&gt;
|32&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|42,1364&lt;br /&gt;
|21,1016&lt;br /&gt;
|11,6119&lt;br /&gt;
|6,1043&lt;br /&gt;
|3,06838&lt;br /&gt;
|1,5346&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;2*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|84,4536  &lt;br /&gt;
|45,0574&lt;br /&gt;
|23,3564 &lt;br /&gt;
|12,2063 &lt;br /&gt;
|6,13689 &lt;br /&gt;
|3,0685&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;4*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|169,6 &lt;br /&gt;
|85,1138 &lt;br /&gt;
|46,0756 &lt;br /&gt;
|24,4103 &lt;br /&gt;
|12,276 &lt;br /&gt;
|6,1380  &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;8*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|339,081 &lt;br /&gt;
|170,628 &lt;br /&gt;
|95,0417 &lt;br /&gt;
|48,8382 &lt;br /&gt;
|24,5472 &lt;br /&gt;
|12,275 &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;16*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|683,5931 &lt;br /&gt;
|345,1143 &lt;br /&gt;
|175,181 &lt;br /&gt;
|97,6816 &lt;br /&gt;
|49,094 &lt;br /&gt;
|24,553&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
В следующей таблице представлены времена работы алгоритма для различного числа процессов и обрабатываемых пар текстов.&lt;br /&gt;
Графически результаты эксперимента представлены на рисунке ниже&lt;br /&gt;
[[Файл:Time.png|обрамить|центр|100x150px|Масштабируемость алгоритма]]&lt;br /&gt;
Алгоритм имеет сильную масштабируемость. Время выполнения алгоритма сокращается почти в 2 раза с увеличением числа обрабатываемых пар текстов в 2 раза.&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;references /&amp;gt;&lt;br /&gt;
M. Heys &amp;quot;A tutorial on linear and differential cryptanalysis&amp;quot; [https://ioactive.com/wp-content/uploads/2015/07/ldc_tutorial.pdf].&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28678</id>
		<title>Дифференцильная атака</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28678"/>
		<updated>2021-11-14T09:15:32Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю [math] 2^{32}[/math]. Является статистической атакой.  Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Так как раундовые ключи однозначно получаются из основного секретного ключа, задачей криптоаналитика является нахождение раундовых ключей, после чего восстанавливается секретный ключ. В данном виде атак на блочные алгоритмы шифрования находятся статистические зависимости между двумя текстами с определенной входной разницей &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, после чего определяется наиболее вероятная разница выходных шифртекстов &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt; на предпоследнем раунде &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt;. Такая зависимость между входной и выходной разницами пар текстов называется дифференциальной характеристикой. Способы определения дифференциальных характеристик чрезвычайно сложны и разнятся от алгоритма к алгоритму, поэтому опускаются в данной статье. После нахождения дифференциальной характеристики производится атака на блочный алгоритм шифрования.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - вероятность дифференциальной характеристики &amp;lt;math&amp;gt;Δfirst→Δlast&amp;lt;/math&amp;gt;, воздействущей на &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит результирующего шифртекста. Тогда атака проводится следующим образом:&lt;br /&gt;
# Берется небольшая положительная константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (обычно равная 2 или 3). Генерируется &amp;lt;math&amp;gt;c/p&amp;lt;/math&amp;gt; пар текстов с входной разницей &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Все данные пары текстов пропускаются через &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов алгоритма шифрования, после чего получаются соответствующие шифртексты &amp;lt;math&amp;gt;Y_{R}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Для всех возможных значений &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа заводится свой счетчик. Далее для каждой сгенерированной пары шифртекстов &amp;lt;math&amp;gt;Y_{R}&amp;lt;/math&amp;gt; данные тексты расшифровываются на всех возможных значениях &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа, в результате чего получаются значения &amp;lt;math&amp;gt;Y_{R-1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Для каждой пары текстов путем их сложения находится своя разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt;. Далее значение &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается c &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt;. Если они совпадают, счетчик для данного &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит ключа увеличивается на 1.&lt;br /&gt;
После такого полного перебора раундовым ключом является то значение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит, которое имеет наибольший счетчик. Определив таким образом биты раундового ключа можно найти значение секретного ключа и взломать алгоритм шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифртекстов и возможного значения бит раундового ключа последнего раунда найденной характеристики  происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;gt; раунде совпадает с искомой разницей &amp;lt;math&amp;gt;ΔU&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2c/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит число пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим [[глоссарий#Граф алгоритма|граф]] для обработки одного текста как аналитически, так и в виде рисунка. Стоит отметить, что описанные ниже преобразования &lt;br /&gt;
происходят с каждым текстом, а число данных текстов зависит от вероятности найденной дифференциальной характеристики.&lt;br /&gt;
Как видно из рисунка, для каждого текста &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; сначала генерируется второй текст при помощи добавления к нему разницы &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, взятой из дифференциальной характеристики, после чего происходит шифрование на протяжение &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов для обеих текстов из пары. После получения шифртекстов &amp;lt;math&amp;gt;Y_R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Y&#039;_R&amp;lt;/math&amp;gt; в результате последнего раунда, для всех возможных &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа происходит частичное расшифрование, после чего в каждой паре тексты складываются и их разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается с искомой &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt; в характеристике. Если разницы текстов совпадают, данные значения бит раундового ключа заносятся в результат.&lt;br /&gt;
[[Файл:Graphdifferential.jpg|обрамить|центр|Информационная схема работы алгоритма]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как видно из предыдущего пункта, обработка каждого текста из множества возможных текстов происходит независимо от других текстов. Таким образом, каждый процесс может шифровать и расшифровывать свою часть всего множества текстов, что даст большое ускорение работы алгоритма. Объединяя полученные результаты со всех процессов можно определить результирующие биты последнего раундового ключа.&lt;br /&gt;
&lt;br /&gt;
Стоить отметить, что существуют другие ресурсы параллелизма, как в алгоритме атаки, так и в алгоритме шифрования, но их параллелизм не является эффективным. Так как в каждой паре существует два текста, каждый текст из пары можно шифровать и расшифровывать параллельно, однако так как число пар в блочном шифре Present может близиться к &amp;lt;math&amp;gt;2^{32}&amp;lt;/math&amp;gt; и для каждой пары необходимо находить разницу текстов данной пары, более эффективным является обработка обеих текстов из пары одним процессом. &lt;br /&gt;
Помимо этого, некоторые операции в алгоритме шифрования могут выполняться параллельно. Такими операциями являются операция побитового сложения текста с раундовым ключом и операция подстановки бит частей текста по 4 бита. Так как подобная параллельность обычно достигается при аппаратной реализации шифрования (где каждый бит текста течет по своему каналу), то при программной реализации более эффективным является совмещение преобразований в одно, путем хранения результата преобразований в одной большой таблице. Распараллеливание этих операция для каждого текста из всех обрабатываемых текстов принесет огромные накладные расходы на синхронизацию и обмен информацией между процессами.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: алгоритм шифрования, константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, вероятность характеристики &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, число бит раундового ключа &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число раундов шифрования &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, входная разница между парами текстов &amp;lt;math&amp;gt;deltafirst&amp;lt;/math&amp;gt;, выходная разница между парами текстов &amp;lt;math&amp;gt;deltalast&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: Объем входных не изменяется, изменяются только сами входные данные. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Биты раундового ключа последнего раунда.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов-2&amp;quot;. При компиляции использовался компилятор Openmpi/4.1.0-icc.&lt;br /&gt;
&lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
! colspan=&amp;quot;6&amp;quot;|Число процессов&lt;br /&gt;
|-&lt;br /&gt;
! Число генерируемых пар текстов&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|4&lt;br /&gt;
|8&lt;br /&gt;
|16&lt;br /&gt;
|32&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|42,1364&lt;br /&gt;
|21,1016&lt;br /&gt;
|11,6119&lt;br /&gt;
|6,1043&lt;br /&gt;
|3,06838&lt;br /&gt;
|1,5346&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;2*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|84,4536  &lt;br /&gt;
|45,0574&lt;br /&gt;
|23,3564 &lt;br /&gt;
|12,2063 &lt;br /&gt;
|6,13689 &lt;br /&gt;
|3,0685&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;4*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|169,6 &lt;br /&gt;
|85,1138 &lt;br /&gt;
|46,0756 &lt;br /&gt;
|24,4103 &lt;br /&gt;
|12,276 &lt;br /&gt;
|6,1380  &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;8*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|339,081 &lt;br /&gt;
|170,628 &lt;br /&gt;
|95,0417 &lt;br /&gt;
|48,8382 &lt;br /&gt;
|24,5472 &lt;br /&gt;
|12,275 &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;16*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|683,5931 &lt;br /&gt;
|345,1143 &lt;br /&gt;
|175,181 &lt;br /&gt;
|97,6816 &lt;br /&gt;
|49,094 &lt;br /&gt;
|24,553&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
В следующей таблице представлены времена работы алгоритма для различного числа процессов и обрабатываемых пар текстов.&lt;br /&gt;
Графически результаты эксперимента представлены на рисунке ниже&lt;br /&gt;
[[Файл:Time.png|обрамить|центр|100x150px|Масштабируемость алгоритма]]&lt;br /&gt;
Алгоритм имеет сильную масштабируемость. Время выполнения алгоритма сокращается почти в 2 раза с увеличением числа обрабатываемых пар текстов в 2 раза.&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;references /&amp;gt;&lt;br /&gt;
M. Heys &amp;quot;A tutorial on linear and differential cryptanalysis&amp;quot; [https://ioactive.com/wp-content/uploads/2015/07/ldc_tutorial.pdf].&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28677</id>
		<title>Дифференцильная атака</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28677"/>
		<updated>2021-11-14T09:00:02Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю [math] 2^{32}[/math]. Является статистической атакой.  Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Так как раундовые ключи однозначно получаются из основного секретного ключа, задачей криптоаналитика является нахождение раундовых ключей, после чего восстанавливается секретный ключ. В данном виде атак на блочные алгоритмы шифрования находятся статистические зависимости между двумя текстами с определенной входной разницей &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, после чего определяется наиболее вероятная разница выходных шифртекстов &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt; на предпоследнем раунде &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt;. Такая зависимость между входной и выходной разницами пар текстов называется дифференциальной характеристикой. Способы определения дифференциальных характеристик чрезвычайно сложны и разнятся от алгоритма к алгоритму, поэтому опускаются в данной статье. После нахождения дифференциальной характеристики производится атака на блочный алгоритм шифрования.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - вероятность дифференциальной характеристики &amp;lt;math&amp;gt;Δfirst→Δlast&amp;lt;/math&amp;gt;, воздействущей на &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит результирующего шифртекста. Тогда атака проводится следующим образом:&lt;br /&gt;
# Берется небольшая положительная константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (обычно равная 2 или 3). Генерируется &amp;lt;math&amp;gt;c/p&amp;lt;/math&amp;gt; пар текстов с входной разницей &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Все данные пары текстов пропускаются через &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов алгоритма шифрования, после чего получаются соответствующие шифртексты &amp;lt;math&amp;gt;Y_{R}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Для всех возможных значений &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа заводится свой счетчик. Далее для каждой сгенерированной пары шифртекстов &amp;lt;math&amp;gt;Y_{R}&amp;lt;/math&amp;gt; данные тексты расшифровываются на всех возможных значениях &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа, в результате чего получаются значения &amp;lt;math&amp;gt;Y_{R-1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Для каждой пары текстов путем их сложения находится своя разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt;. Далее значение &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается c &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt;. Если они совпадают, счетчик для данного &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит ключа увеличивается на 1.&lt;br /&gt;
После такого полного перебора раундовым ключом является то значение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит, которое имеет наибольший счетчик. Определив таким образом биты раундового ключа можно найти значение секретного ключа и взломать алгоритм шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифртекстов и возможного значения бит раундового ключа последнего раунда найденной характеристики  происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;gt; раунде совпадает с искомой разницей &amp;lt;math&amp;gt;ΔU&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2c/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит число пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим [[глоссарий#Граф алгоритма|граф]] для обработки одного текста как аналитически, так и в виде рисунка. Стоит отметить, что описанные ниже преобразования &lt;br /&gt;
происходят с каждым текстом, а число данных текстов зависит от вероятности найденной дифференциальной характеристики.&lt;br /&gt;
Как видно из рисунка, для каждого текста &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; сначала генерируется второй текст при помощи добавления к нему разницы &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, взятой из дифференциальной характеристики, после чего происходит шифрование на протяжение &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов для обеих текстов из пары. После получения шифртекстов &amp;lt;math&amp;gt;Y_R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Y&#039;_R&amp;lt;/math&amp;gt; в результате последнего раунда, для всех возможных &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа происходит частичное расшифрование, после чего в каждой паре тексты складываются и их разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается с искомой &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt; в характеристике. Если разницы текстов совпадают, данные значения бит раундового ключа заносятся в результат.&lt;br /&gt;
[[Файл:Graphdifferential.jpg|обрамить|центр|Информационная схема работы алгоритма]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как видно из предыдущего пункта, обработка каждого текста из множества возможных текстов происходит независимо от других текстов. Таким образом, каждый процесс может шифровать и расшифровывать свою часть всего множества текстов, что даст большое ускорение работы алгоритма. Объединяя полученные результаты со всех процессов можно определить результирующие биты последнего раундового ключа.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: алгоритм шифрования, константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, вероятность характеристики &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, число бит раундового ключа &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число раундов шифрования &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, входная разница между парами текстов &amp;lt;math&amp;gt;deltafirst&amp;lt;/math&amp;gt;, выходная разница между парами текстов &amp;lt;math&amp;gt;deltalast&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: Объем входных не изменяется, изменяются только сами входные данные. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Биты раундового ключа последнего раунда.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов-2&amp;quot;. При компиляции использовался компилятор Openmpi/4.1.0-icc.&lt;br /&gt;
&lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
! colspan=&amp;quot;6&amp;quot;|Число процессов&lt;br /&gt;
|-&lt;br /&gt;
! Число генерируемых пар текстов&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|4&lt;br /&gt;
|8&lt;br /&gt;
|16&lt;br /&gt;
|32&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|42,1364&lt;br /&gt;
|21,1016&lt;br /&gt;
|11,6119&lt;br /&gt;
|6,1043&lt;br /&gt;
|3,06838&lt;br /&gt;
|1,5346&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;2*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|84,4536  &lt;br /&gt;
|45,0574&lt;br /&gt;
|23,3564 &lt;br /&gt;
|12,2063 &lt;br /&gt;
|6,13689 &lt;br /&gt;
|3,0685&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;4*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|169,6 &lt;br /&gt;
|85,1138 &lt;br /&gt;
|46,0756 &lt;br /&gt;
|24,4103 &lt;br /&gt;
|12,276 &lt;br /&gt;
|6,1380  &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;8*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|339,081 &lt;br /&gt;
|170,628 &lt;br /&gt;
|95,0417 &lt;br /&gt;
|48,8382 &lt;br /&gt;
|24,5472 &lt;br /&gt;
|12,275 &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;16*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|683,5931 &lt;br /&gt;
|345,1143 &lt;br /&gt;
|175,181 &lt;br /&gt;
|97,6816 &lt;br /&gt;
|49,094 &lt;br /&gt;
|24,553&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
В следующей таблице представлены времена работы алгоритма для различного числа процессов и обрабатываемых пар текстов.&lt;br /&gt;
Графически результаты эксперимента представлены на рисунке ниже&lt;br /&gt;
[[Файл:Time.png|обрамить|центр|100x150px|Масштабируемость алгоритма]]&lt;br /&gt;
Алгоритм имеет сильную масштабируемость. Время выполнения алгоритма сокращается почти в 2 раза с увеличением числа обрабатываемых пар текстов в 2 раза.&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;references /&amp;gt;&lt;br /&gt;
M. Heys &amp;quot;A tutorial on linear and differential cryptanalysis&amp;quot; [https://ioactive.com/wp-content/uploads/2015/07/ldc_tutorial.pdf].&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28676</id>
		<title>Дифференцильная атака</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28676"/>
		<updated>2021-11-13T13:54:56Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю [math] 2^{32}[/math]. Является статистической атакой.  Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Так как раундовые ключи однозначно получаются из основного секретного ключа, задачей криптоаналитика является нахождение раундовых ключей, после чего восстанавливается секретный ключ. В данном виде атак на блочные алгоритмы шифрования находятся статистические зависимости между двумя текстами с определенной входной разницей &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, после чего определяется наиболее вероятная разница выходных шифртекстов &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt; на предпоследнем раунде &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt;. Такая зависимость между входной и выходной разницами пар текстов называется дифференциальной характеристикой. Способы определения дифференциальных характеристик чрезвычайно сложны и разнятся от алгоритма к алгоритму, поэтому опускаются в данной статье. После нахождения дифференциальной характеристики производится атака на блочный алгоритм шифрования.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - вероятность дифференциальной характеристики &amp;lt;math&amp;gt;Δfirst→Δlast&amp;lt;/math&amp;gt;, воздействущей на &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит результирующего шифртекста. Тогда атака проводится следующим образом:&lt;br /&gt;
# Берется небольшая положительная константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (обычно равная 2 или 3). Генерируется &amp;lt;math&amp;gt;c/p&amp;lt;/math&amp;gt; пар текстов с входной разницей &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Все данные пары текстов пропускаются через &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов алгоритма шифрования, после чего получаются соответствующие шифртексты &amp;lt;math&amp;gt;Y_{R}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Для всех возможных значений &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа заводится свой счетчик. Далее для каждой сгенерированной пары шифртекстов &amp;lt;math&amp;gt;Y_{R}&amp;lt;/math&amp;gt; данные тексты расшифровываются на всех возможных значениях &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа, в результате чего получаются значения &amp;lt;math&amp;gt;Y_{R-1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Для каждой пары текстов путем их сложения находится своя разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt;. Далее значение &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается c &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt;. Если они совпадают, счетчик для данного &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит ключа увеличивается на 1.&lt;br /&gt;
После такого полного перебора раундовым ключом является то значение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит, которое имеет наибольший счетчик. Определив таким образом биты раундового ключа можно найти значение секретного ключа и взломать алгоритм шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифртекстов и возможного значения бит раундового ключа последнего раунда найденной характеристики  происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;gt; раунде совпадает с искомой разницей &amp;lt;math&amp;gt;ΔU&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2c/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит число пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим [[глоссарий#Граф алгоритма|граф алгоритма]] для обработки одного текста как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Graphdifferential.jpg|обрамить|центр|Информационная схема работы алгоритма]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из рисунка, для каждого текста &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; сначала генерируется второй текст при помощи добавления к нему разницы &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, взятой из дифференциальной характеристики, после чего происходит шифрование на протяжение &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов для обеих текстов из пары. После получения шифртекстов &amp;lt;math&amp;gt;Y_R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Y&#039;_R&amp;lt;/math&amp;gt; в результате последнего раунда, для всех возможных &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа происходит частичное расшифрование, после чего в каждой паре тексты складываются и их разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается с искомой &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;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;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: алгоритм шифрования, константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, вероятность характеристики &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, число бит раундового ключа &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число раундов шифрования &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, входная разница между парами текстов &amp;lt;math&amp;gt;deltafirst&amp;lt;/math&amp;gt;, выходная разница между парами текстов &amp;lt;math&amp;gt;deltalast&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: Объем входных не изменяется, изменяются только сами входные данные. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Биты раундового ключа последнего раунда.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов-2&amp;quot;. При компиляции использовался компилятор Openmpi/4.1.0-icc.&lt;br /&gt;
&lt;br /&gt;
 {| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
! colspan=&amp;quot;6&amp;quot;|Число процессов&lt;br /&gt;
|-&lt;br /&gt;
! Число генерируемых пар текстов&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|4&lt;br /&gt;
|8&lt;br /&gt;
|16&lt;br /&gt;
|32&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|42,1364&lt;br /&gt;
|21,1016&lt;br /&gt;
|11,6119&lt;br /&gt;
|6,1043&lt;br /&gt;
|3,06838&lt;br /&gt;
|1,5346&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;2*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|84,4536  &lt;br /&gt;
|45,0574&lt;br /&gt;
|23,3564 &lt;br /&gt;
|12,2063 &lt;br /&gt;
|6,13689 &lt;br /&gt;
|3,0685&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;4*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|169,6 &lt;br /&gt;
|85,1138 &lt;br /&gt;
|46,0756 &lt;br /&gt;
|24,4103 &lt;br /&gt;
|12,276 &lt;br /&gt;
|6,1380  &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;8*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|339,081 &lt;br /&gt;
|170,628 &lt;br /&gt;
|95,0417 &lt;br /&gt;
|48,8382 &lt;br /&gt;
|24,5472 &lt;br /&gt;
|12,275 &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;16*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|683,5931 &lt;br /&gt;
|345,1143 &lt;br /&gt;
|175,181 &lt;br /&gt;
|97,6816 &lt;br /&gt;
|49,094 &lt;br /&gt;
|24,553&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
В следующей таблице представлены времена работы алгоритма для различного числа процессов и обрабатываемых пар текстов.&lt;br /&gt;
Графически результаты эксперимента представлены на рисунке ниже&lt;br /&gt;
[[Файл:Time.png|обрамить|центр|100x150px|Масштабируемость алгоритма]]&lt;br /&gt;
Алгоритм имеет сильную масштабируемость. Время выполнения алгоритма сокращается почти в 2 раза с увеличением числа обрабатываемых пар текстов в 2 раза.&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;references /&amp;gt;&lt;br /&gt;
M. Heys &amp;quot;A tutorial on linear and differential cryptanalysis&amp;quot; [https://ioactive.com/wp-content/uploads/2015/07/ldc_tutorial.pdf].&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Time.png&amp;diff=28675</id>
		<title>Файл:Time.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Time.png&amp;diff=28675"/>
		<updated>2021-11-13T13:45:10Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Время работы&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28674</id>
		<title>Дифференцильная атака</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28674"/>
		<updated>2021-11-13T13:40:29Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю [math] 2^{32}[/math]. Является статистической атакой.  Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Так как раундовые ключи однозначно получаются из основного секретного ключа, задачей криптоаналитика является нахождение раундовых ключей, после чего восстанавливается секретный ключ. В данном виде атак на блочные алгоритмы шифрования находятся статистические зависимости между двумя текстами с определенной входной разницей &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, после чего определяется наиболее вероятная разница выходных шифртекстов &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt; на предпоследнем раунде &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt;. Такая зависимость между входной и выходной разницами пар текстов называется дифференциальной характеристикой. Способы определения дифференциальных характеристик чрезвычайно сложны и разнятся от алгоритма к алгоритму, поэтому опускаются в данной статье. После нахождения дифференциальной характеристики производится атака на блочный алгоритм шифрования.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - вероятность дифференциальной характеристики &amp;lt;math&amp;gt;Δfirst→Δlast&amp;lt;/math&amp;gt;, воздействущей на &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит результирующего шифртекста. Тогда атака проводится следующим образом:&lt;br /&gt;
# Берется небольшая положительная константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (обычно равная 2 или 3). Генерируется &amp;lt;math&amp;gt;c/p&amp;lt;/math&amp;gt; пар текстов с входной разницей &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Все данные пары текстов пропускаются через &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов алгоритма шифрования, после чего получаются соответствующие шифртексты &amp;lt;math&amp;gt;Y_{R}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Для всех возможных значений &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа заводится свой счетчик. Далее для каждой сгенерированной пары шифртекстов &amp;lt;math&amp;gt;Y_{R}&amp;lt;/math&amp;gt; данные тексты расшифровываются на всех возможных значениях &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа, в результате чего получаются значения &amp;lt;math&amp;gt;Y_{R-1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Для каждой пары текстов путем их сложения находится своя разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt;. Далее значение &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается c &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt;. Если они совпадают, счетчик для данного &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит ключа увеличивается на 1.&lt;br /&gt;
После такого полного перебора раундовым ключом является то значение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит, которое имеет наибольший счетчик. Определив таким образом биты раундового ключа можно найти значение секретного ключа и взломать алгоритм шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифртекстов и возможного значения бит раундового ключа последнего раунда найденной характеристики  происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;gt; раунде совпадает с искомой разницей &amp;lt;math&amp;gt;ΔU&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2c/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит число пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим [[глоссарий#Граф алгоритма|граф алгоритма]] для обработки одного текста как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Graphdifferential.jpg|обрамить|центр|Информационная схема работы алгоритма]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из рисунка, для каждого текста &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; сначала генерируется второй текст при помощи добавления к нему разницы &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, взятой из дифференциальной характеристики, после чего происходит шифрование на протяжение &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов для обеих текстов из пары. После получения шифртекстов &amp;lt;math&amp;gt;Y_R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Y&#039;_R&amp;lt;/math&amp;gt; в результате последнего раунда, для всех возможных &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа происходит частичное расшифрование, после чего в каждой паре тексты складываются и их разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается с искомой &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;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;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: алгоритм шифрования, константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, вероятность характеристики &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, число бит раундового ключа &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число раундов шифрования &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, входная разница между парами текстов &amp;lt;math&amp;gt;deltafirst&amp;lt;/math&amp;gt;, выходная разница между парами текстов &amp;lt;math&amp;gt;deltalast&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: Объем входных не изменяется, изменяются только сами входные данные. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Биты раундового ключа последнего раунда.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов-2&amp;quot;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Компилятор C++&lt;br /&gt;
|-&lt;br /&gt;
|openmpi/4.1.0-icc&lt;br /&gt;
|-}&lt;br /&gt;
 &lt;br /&gt;
В следующей таблице представлены времена работы алгоритма для различного числа процессов и обрабатываемых пар текстов.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
! colspan=&amp;quot;6&amp;quot;|Число процессов&lt;br /&gt;
|-&lt;br /&gt;
! Число генерируемых пар текстов&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|4&lt;br /&gt;
|8&lt;br /&gt;
|16&lt;br /&gt;
|32&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|42,1364&lt;br /&gt;
|21,1016&lt;br /&gt;
|11,6119&lt;br /&gt;
|6,1043&lt;br /&gt;
|3,06838&lt;br /&gt;
|1,5346&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;2*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|84,4536  &lt;br /&gt;
|45,0574&lt;br /&gt;
|23,3564 &lt;br /&gt;
|12,2063 &lt;br /&gt;
|6,13689 &lt;br /&gt;
|3,0685&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;4*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|169,6 &lt;br /&gt;
|85,1138 &lt;br /&gt;
|46,0756 &lt;br /&gt;
|24,4103 &lt;br /&gt;
|12,276 &lt;br /&gt;
|6,1380  &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;8*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|339,081 &lt;br /&gt;
|170,628 &lt;br /&gt;
|95,0417 &lt;br /&gt;
|48,8382 &lt;br /&gt;
|24,5472 &lt;br /&gt;
|12,275 &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;16*10^7&amp;lt;/math&amp;gt;&lt;br /&gt;
|683,5931 &lt;br /&gt;
|345,1143 &lt;br /&gt;
|175,181 &lt;br /&gt;
|97,6816 &lt;br /&gt;
|49,094 &lt;br /&gt;
|24,553&lt;br /&gt;
|-}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Алгоритм имеет сильную масштабируемость. Время выполнения алгоритма сокращается почти в 2 раза с увеличением числа обрабатываемых пар текстов в 2 раза.&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;references /&amp;gt;&lt;br /&gt;
M. Heys &amp;quot;A tutorial on linear and differential cryptanalysis&amp;quot; [https://ioactive.com/wp-content/uploads/2015/07/ldc_tutorial.pdf].&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28673</id>
		<title>Дифференцильная атака</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28673"/>
		<updated>2021-11-13T12:50:53Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю [math] 2^{32}[/math]. Является статистической атакой.  Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Так как раундовые ключи однозначно получаются из основного секретного ключа, задачей криптоаналитика является нахождение раундовых ключей, после чего восстанавливается секретный ключ. В данном виде атак на блочные алгоритмы шифрования находятся статистические зависимости между двумя текстами с определенной входной разницей &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, после чего определяется наиболее вероятная разница выходных шифртекстов &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt; на предпоследнем раунде &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt;. Такая зависимость между входной и выходной разницами пар текстов называется дифференциальной характеристикой. Способы определения дифференциальных характеристик чрезвычайно сложны и разнятся от алгоритма к алгоритму, поэтому опускаются в данной статье. После нахождения дифференциальной характеристики производится атака на блочный алгоритм шифрования.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - вероятность дифференциальной характеристики &amp;lt;math&amp;gt;Δfirst→Δlast&amp;lt;/math&amp;gt;, воздействущей на &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит результирующего шифртекста. Тогда атака проводится следующим образом:&lt;br /&gt;
# Берется небольшая положительная константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (обычно равная 2 или 3). Генерируется &amp;lt;math&amp;gt;c/p&amp;lt;/math&amp;gt; пар текстов с входной разницей &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Все данные пары текстов пропускаются через &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов алгоритма шифрования, после чего получаются соответствующие шифртексты &amp;lt;math&amp;gt;Y_{R}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Для всех возможных значений &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа заводится свой счетчик. Далее для каждой сгенерированной пары шифртекстов &amp;lt;math&amp;gt;Y_{R}&amp;lt;/math&amp;gt; данные тексты расшифровываются на всех возможных значениях &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа, в результате чего получаются значения &amp;lt;math&amp;gt;Y_{R-1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Для каждой пары текстов путем их сложения находится своя разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt;. Далее значение &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается c &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt;. Если они совпадают, счетчик для данного &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит ключа увеличивается на 1.&lt;br /&gt;
После такого полного перебора раундовым ключом является то значение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит, которое имеет наибольший счетчик. Определив таким образом биты раундового ключа можно найти значение секретного ключа и взломать алгоритм шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифртекстов и возможного значения бит раундового ключа последнего раунда найденной характеристики  происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;gt; раунде совпадает с искомой разницей &amp;lt;math&amp;gt;ΔU&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2c/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит число пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим [[глоссарий#Граф алгоритма|граф алгоритма]] для обработки одного текста как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Graphdifferential.jpg|обрамить|центр|Информационная схема работы алгоритма]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из рисунка, для каждого текста &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; сначала генерируется второй текст при помощи добавления к нему разницы &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, взятой из дифференциальной характеристики, после чего происходит шифрование на протяжение &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов для обеих текстов из пары. После получения шифртекстов &amp;lt;math&amp;gt;Y_R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Y&#039;_R&amp;lt;/math&amp;gt; в результате последнего раунда, для всех возможных &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа происходит частичное расшифрование, после чего в каждой паре тексты складываются и их разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается с искомой &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;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;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: алгоритм шифрования, константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, вероятность характеристики &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, число бит раундового ключа &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число раундов шифрования &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, входная разница между парами текстов &amp;lt;math&amp;gt;deltafirst&amp;lt;/math&amp;gt;, выходная разница между парами текстов &amp;lt;math&amp;gt;deltalast&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: Объем входных не изменяется, изменяются только сами входные данные. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Биты раундового ключа последнего раунда.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;
=== Возможные способы и особенности параллельной реализации алгоритма ===&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;lt;references /&amp;gt;&lt;br /&gt;
M. Heys &amp;quot;A tutorial on linear and differential cryptanalysis&amp;quot; [https://ioactive.com/wp-content/uploads/2015/07/ldc_tutorial.pdf].&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28672</id>
		<title>Дифференцильная атака</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28672"/>
		<updated>2021-11-13T12:46:39Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю [math] 2^{32}[/math]. Является статистической атакой.  Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Так как раундовые ключи однозначно получаются из основного секретного ключа, задачей криптоаналитика является нахождение раундовых ключей, после чего восстанавливается секретный ключ. В данном виде атак на блочные алгоритмы шифрования находятся статистические зависимости между двумя текстами с определенной входной разницей &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, после чего определяется наиболее вероятная разница выходных шифртекстов &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt; на предпоследнем раунде &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt;. Такая зависимость между входной и выходной разницами пар текстов называется дифференциальной характеристикой. Способы определения дифференциальных характеристик чрезвычайно сложны и разнятся от алгоритма к алгоритму, поэтому опускаются в данной статье. После нахождения дифференциальной характеристики производится атака на блочный алгоритм шифрования.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - вероятность дифференциальной характеристики &amp;lt;math&amp;gt;Δfirst→Δlast&amp;lt;/math&amp;gt;, воздействущей на &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит результирующего шифртекста. Тогда атака проводится следующим образом:&lt;br /&gt;
# Берется небольшая положительная константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (обычно равная 2 или 3). Генерируется &amp;lt;math&amp;gt;c/p&amp;lt;/math&amp;gt; пар текстов с входной разницей &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Все данные пары текстов пропускаются через &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов алгоритма шифрования, после чего получаются соответствующие шифртексты &amp;lt;math&amp;gt;Y_{R}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Для всех возможных значений &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа заводится свой счетчик. Далее для каждой сгенерированной пары шифртекстов &amp;lt;math&amp;gt;Y_{R}&amp;lt;/math&amp;gt; данные тексты расшифровываются на всех возможных значениях &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа, в результате чего получаются значения &amp;lt;math&amp;gt;Y_{R-1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Для каждой пары текстов путем их сложения находится своя разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt;. Далее значение &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается c &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt;. Если они совпадают, счетчик для данного &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит ключа увеличивается на 1.&lt;br /&gt;
После такого полного перебора раундовым ключом является то значение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит, которое имеет наибольший счетчик. Определив таким образом биты раундового ключа можно найти значение секретного ключа и взломать алгоритм шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифртекстов и возможного значения бит раундового ключа последнего раунда найденной характеристики  происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;gt; раунде совпадает с искомой разницей &amp;lt;math&amp;gt;ΔU&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2c/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит число пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим [[глоссарий#Граф алгоритма|граф алгоритма]] для обработки одного текста как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Graphdifferential.jpg|обрамить|центр|Информационная схема работы алгоритма]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из рисунка, для каждого текста &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; сначала генерируется второй текст при помощи добавления к нему разницы &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, взятой из дифференциальной характеристики, после чего происходит шифрование на протяжение &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов для обеих текстов из пары. После получения шифртекстов &amp;lt;math&amp;gt;Y_R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Y&#039;_R&amp;lt;/math&amp;gt; в результате последнего раунда, для всех возможных &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа происходит частичное расшифрование, после чего в каждой паре тексты складываются и их разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается с искомой &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;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;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: алгоритм шифрования, константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, вероятность характеристики &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, число бит раундового ключа &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число раундов шифрования &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, входная разница между парами текстов &amp;lt;math&amp;gt;deltafirst&amp;lt;/math&amp;gt;, выходная разница между парами текстов &amp;lt;math&amp;gt;deltalast&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: Объем входных не изменяется, изменяются только сами входные данные. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Биты раундового ключа последнего раунда.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;
=== Возможные способы и особенности параллельной реализации алгоритма ===&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;lt;references /&amp;gt;&lt;br /&gt;
M. Heys &amp;quot;A tutorial on linear and differential cryptanalysis&amp;quot; [https://ioactive.com/wp-content/uploads/2015/07/ldc_tutorial.pdf].&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28652</id>
		<title>Дифференцильная атака</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28652"/>
		<updated>2021-11-04T13:24:13Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: Новая страница: «{{level-a}}   == Свойства и структура алгоритма ==  === Общее описание алгоритма === Дифференциальн...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю [math] 2^{32}[/math]. Является статистической атакой.  Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Так как раундовые ключи однозначно получаются из основного секретного ключа, задачей криптоаналитика является нахождение раундовых ключей, после чего восстанавливается секретный ключ. В данном виде атак на блочные алгоритмы шифрования находятся статистические зависимости между двумя текстами с определенной входной разницей &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, после чего определяется наиболее вероятная разница выходных шифртекстов &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt; на предпоследнем раунде &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt;. Такая зависимость между входной и выходной разницами пар текстов называется дифференциальной характеристикой. Способы определения дифференциальных характеристик чрезвычайно сложны и разнятся от алгоритма к алгоритму, поэтому опускаются в данной статье. После нахождения дифференциальной характеристики производится атака на блочный алгоритм шифрования.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - вероятность дифференциальной характеристики &amp;lt;math&amp;gt;Δfirst→Δlast&amp;lt;/math&amp;gt;, воздействущей на &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит результирующего шифртекста. Тогда атака проводится следующим образом:&lt;br /&gt;
# Берется небольшая положительная константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (обычно равная 2 или 3). Генерируется &amp;lt;math&amp;gt;c/p&amp;lt;/math&amp;gt; пар текстов с входной разницей &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Все данные пары текстов пропускаются через &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов алгоритма шифрования, после чего получаются соответствующие шифртексты &amp;lt;math&amp;gt;Y_{R}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Для всех возможных значений &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа заводится свой счетчик. Далее для каждой сгенерированной пары шифртекстов &amp;lt;math&amp;gt;Y_{R}&amp;lt;/math&amp;gt; данные тексты расшифровываются на всех возможных значениях &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа, в результате чего получаются значения &amp;lt;math&amp;gt;Y_{R-1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Для каждой пары текстов путем их сложения находится своя разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt;. Далее значение &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается c &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt;. Если они совпадают, счетчик для данного &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит ключа увеличивается на 1.&lt;br /&gt;
После такого полного перебора раундовым ключом является то значение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит, которое имеет наибольший счетчик. Определив таким образом биты раундового ключа можно найти значение секретного ключа и взломать алгоритм шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифртекстов и возможного значения бит раундового ключа последнего раунда найденной характеристики  происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;gt; раунде совпадает с искомой разницей &amp;lt;math&amp;gt;ΔU&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2c/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит число пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим [[глоссарий#Граф алгоритма|граф алгоритма]] для обработки одного текста как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Graphdifferential.jpg|обрамить|центр|Информационная схема работы алгоритма]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из рисунка, для каждого текста &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; сначала генерируется второй текст при помощи добавления к нему разницы &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, взятой из дифференциальной характеристики, после чего происходит шифрование на протяжение &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов для обеих текстов из пары. После получения шифртекстов &amp;lt;math&amp;gt;Y_R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Y&#039;_R&amp;lt;/math&amp;gt; в результате последнего раунда, для всех возможных &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа происходит частичное расшифрование, после чего в каждой паре тексты складываются и их разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается с искомой &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;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;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: алгоритм шифрования, константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, вероятность характеристики &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, число бит раундового ключа &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число раундов шифрования &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, входная разница между парами текстов &amp;lt;math&amp;gt;deltafirst&amp;lt;/math&amp;gt;, выходная разница между парами текстов &amp;lt;math&amp;gt;deltalast&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: Объем входных не изменяется, изменяются только сами входные данные. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Биты раундового ключа последнего раунда.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;
=== Возможные способы и особенности параллельной реализации алгоритма ===&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;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28651</id>
		<title>Дифференацильная атака</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28651"/>
		<updated>2021-11-04T13:14:13Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю [math] 2^{32}[/math]. Является статистической атакой.  Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Так как раундовые ключи однозначно получаются из основного секретного ключа, задачей криптоаналитика является нахождение раундовых ключей, после чего восстанавливается секретный ключ. В данном виде атак на блочные алгоритмы шифрования находятся статистические зависимости между двумя текстами с определенной входной разницей &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, после чего определяется наиболее вероятная разница выходных шифртекстов &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt; на предпоследнем раунде &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt;. Такая зависимость между входной и выходной разницами пар текстов называется дифференциальной характеристикой. Способы определения дифференциальных характеристик чрезвычайно сложны и разнятся от алгоритма к алгоритму, поэтому опускаются в данной статье. После нахождения дифференциальной характеристики производится атака на блочный алгоритм шифрования.&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - вероятность дифференциальной характеристики &amp;lt;math&amp;gt;Δfirst→Δlast&amp;lt;/math&amp;gt;, воздействущей на &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит результирующего шифртекста. Тогда атака проводится следующим образом:&lt;br /&gt;
# Берется небольшая положительная константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (обычно равная 2 или 3). Генерируется &amp;lt;math&amp;gt;c/p&amp;lt;/math&amp;gt; пар текстов с входной разницей &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Все данные пары текстов пропускаются через &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов алгоритма шифрования, после чего получаются соответствующие шифртексты &amp;lt;math&amp;gt;Y_{R}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Для всех возможных значений &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа заводится свой счетчик. Далее для каждой сгенерированной пары шифртекстов &amp;lt;math&amp;gt;Y_{R}&amp;lt;/math&amp;gt; данные тексты расшифровываются на всех возможных значениях &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа, в результате чего получаются значения &amp;lt;math&amp;gt;Y_{R-1}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Для каждой пары текстов путем их сложения находится своя разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt;. Далее значение &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается c &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt;. Если они совпадают, счетчик для данного &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит ключа увеличивается на 1.&lt;br /&gt;
После такого полного перебора раундовым ключом является то значение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит, которое имеет наибольший счетчик. Определив таким образом биты раундового ключа можно найти значение секретного ключа и взломать алгоритм шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифртекстов и возможного значения бит раундового ключа последнего раунда найденной характеристики  происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;gt; раунде совпадает с искомой разницей &amp;lt;math&amp;gt;ΔU&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2c/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит число пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим [[глоссарий#Граф алгоритма|граф алгоритма]] для обработки одного текста как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Graphdifferential.jpg|обрамить|центр|Информационная схема работы алгоритма]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из рисунка, для каждого текста &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; сначала генерируется второй текст при помощи добавления к нему разницы &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, взятой из дифференциальной характеристики, после чего происходит шифрование на протяжение &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов для обеих текстов из пары. После получения шифртекстов &amp;lt;math&amp;gt;Y_R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Y&#039;_R&amp;lt;/math&amp;gt; в результате последнего раунда, для всех возможных &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа происходит частичное расшифрование, после чего в каждой паре тексты складываются и их разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается с искомой &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;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;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: алгоритм шифрования, константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, вероятность характеристики &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, число бит раундового ключа &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число раундов шифрования &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, входная разница между парами текстов &amp;lt;math&amp;gt;deltafirst&amp;lt;/math&amp;gt;, выходная разница между парами текстов &amp;lt;math&amp;gt;deltalast&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: Объем входных не изменяется, изменяются только сами входные данные. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Биты раундового ключа последнего раунда.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;
=== Возможные способы и особенности параллельной реализации алгоритма ===&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;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28650</id>
		<title>Дифференацильная атака</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28650"/>
		<updated>2021-11-04T12:38:16Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю [math] 2^{32}[/math]. Является статистической атакой.  Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;ΔX=({ΔX_1}{ΔX_2}{ΔX_3}...{ΔX_3})&amp;lt;/math&amp;gt;&lt;br /&gt;
Задачей криптоаналитика является нахождение &lt;br /&gt;
Пусть &amp;lt;math&amp;gt;{p}&amp;lt;/math&amp;gt; - вероя&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифртекстов и возможного значения бит раундового ключа последнего раунда найденной характеристики  происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;gt; раунде совпадает с искомой разницей &amp;lt;math&amp;gt;ΔU&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2c/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит число пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим [[глоссарий#Граф алгоритма|граф алгоритма]] для обработки одного текста как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Graphdifferential.jpg|обрамить|центр|Информационная схема работы алгоритма]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из рисунка, для каждого текста &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; сначала генерируется второй текст при помощи добавления к нему разницы &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, взятой из дифференциальной характеристики, после чего происходит шифрование на протяжение &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов для обеих текстов из пары. После получения шифртекстов &amp;lt;math&amp;gt;Y_R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Y&#039;_R&amp;lt;/math&amp;gt; в результате последнего раунда, для всех возможных &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа происходит частичное расшифрование, после чего в каждой паре тексты складываются и их разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается с искомой &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;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;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: алгоритм шифрования, константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, вероятность характеристики &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, число бит раундового ключа &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число раундов шифрования &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, входная разница между парами текстов &amp;lt;math&amp;gt;deltafirst&amp;lt;/math&amp;gt;, выходная разница между парами текстов &amp;lt;math&amp;gt;deltalast&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: Объем входных не изменяется, изменяются только сами входные данные. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Биты раундового ключа последнего раунда.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;
=== Возможные способы и особенности параллельной реализации алгоритма ===&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;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28649</id>
		<title>Дифференацильная атака</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28649"/>
		<updated>2021-11-04T12:20:05Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю {\displaystyle 2^{32}}2^{32}. Является статистической атакой. Применим для взлома DES, FEAL и некоторых других шифров, как правило, разработанных ранее начала 90-х. Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;ΔX=({ΔX_1}{ΔX_2}{ΔX_3}...{ΔX_3})&amp;lt;/math&amp;gt;&lt;br /&gt;
Задачей криптоаналитика является нахождение &lt;br /&gt;
Пусть &amp;lt;math&amp;gt;{p}&amp;lt;/math&amp;gt; - вероя&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифртекстов и возможного значения бит раундового ключа последнего раунда найденной характеристики  происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;gt; раунде совпадает с искомой разницей &amp;lt;math&amp;gt;ΔU&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2c/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит число пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим [[глоссарий#Граф алгоритма|граф алгоритма]] для обработки одного текста как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Graphdifferential.jpg|обрамить|центр|Информационная схема работы алгоритма]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из рисунка, для каждого текста &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; сначала генерируется второй текст при помощи добавления к нему разницы &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, взятой из дифференциальной характеристики, после чего происходит шифрование на протяжение &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов для обеих текстов из пары. После получения шифртекстов &amp;lt;math&amp;gt;Y_R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Y&#039;_R&amp;lt;/math&amp;gt; в результате последнего раунда, для всех возможных &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа происходит частичное расшифрование, после чего в каждой паре тексты складываются и их разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается с искомой &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;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;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: алгоритм шифрования, константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, вероятность характеристики &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, число бит раундового ключа &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число раундов шифрования &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, входная разница между парами текстов &amp;lt;math&amp;gt;deltafirst&amp;lt;/math&amp;gt;, выходная разница между парами текстов &amp;lt;math&amp;gt;deltalast&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: Объем входных не изменяется, изменяются только сами входные данные. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Биты раундового ключа последнего раунда.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;
=== Возможные способы и особенности параллельной реализации алгоритма ===&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;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28648</id>
		<title>Дифференацильная атака</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28648"/>
		<updated>2021-11-04T12:19:19Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю {\displaystyle 2^{32}}2^{32}. Является статистической атакой. Применим для взлома DES, FEAL и некоторых других шифров, как правило, разработанных ранее начала 90-х. Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;ΔX=({ΔX_1}{ΔX_2}{ΔX_3}...{ΔX_3})&amp;lt;/math&amp;gt;&lt;br /&gt;
Задачей криптоаналитика является нахождение &lt;br /&gt;
Пусть &amp;lt;math&amp;gt;{p}&amp;lt;/math&amp;gt; - вероя&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифртекстов и возможного значения бит раундового ключа последнего раунда найденной характеристики  происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;gt; раунде совпадает с искомой разницей &amp;lt;math&amp;gt;ΔU&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2c/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;с&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит число пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим [[глоссарий#Граф алгоритма|граф алгоритма]] для обработки одного текста как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Graphdifferential.jpg|обрамить|центр|Информационная схема работы алгоритма]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из рисунка, для каждого текста &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; сначала генерируется второй текст при помощи добавления к нему разницы &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, взятой из дифференциальной характеристики, после чего происходит шифрование на протяжение &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов для обеих текстов из пары. После получения шифртекстов &amp;lt;math&amp;gt;Y_R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Y&#039;_R&amp;lt;/math&amp;gt; в результате последнего раунда, для всех возможных &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа происходит частичное расшифрование, после чего в каждой паре тексты складываются и их разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается с искомой &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;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;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: алгоритм шифрования, константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, вероятность характеристики &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, число бит раундового ключа &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число раундов шифрования &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, входная разница между парами текстов &amp;lt;math&amp;gt;deltafirst&amp;lt;/math&amp;gt;, выходная разница между парами текстов &amp;lt;math&amp;gt;deltalast&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: Объем входных не изменяется, изменяются только сами входные данные. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Биты раундового ключа последнего раунда.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;
=== Возможные способы и особенности параллельной реализации алгоритма ===&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;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28647</id>
		<title>Дифференацильная атака</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28647"/>
		<updated>2021-11-04T12:14:29Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю {\displaystyle 2^{32}}2^{32}. Является статистической атакой. Применим для взлома DES, FEAL и некоторых других шифров, как правило, разработанных ранее начала 90-х. Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;ΔX=({ΔX_1}{ΔX_2}{ΔX_3}...{ΔX_3})&amp;lt;/math&amp;gt;&lt;br /&gt;
Задачей криптоаналитика является нахождение &lt;br /&gt;
Пусть &amp;lt;math&amp;gt;{p}&amp;lt;/math&amp;gt; - вероя&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифртекстов и возможного значения бит раундового ключа последнего раунда найденной характеристики  происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;gt; раунде совпадает с искомой разницей &amp;lt;math&amp;gt;ΔU&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2c/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;с&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит число пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим [[глоссарий#Граф алгоритма|граф алгоритма]] для обработки одного текста как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Graphdifferential.jpg|обрамить|центр|Информационная схема работы алгоритма]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из рисунка, для каждого текста &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; сначала генерируется второй текст при помощи добавления к нему разницы &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, взятой из дифференциальной характеристики, после чего происходит шифрование на протяжение &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов для обеих текстов из пары. После получения шифртекстов &amp;lt;math&amp;gt;Y_R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Y&#039;_R&amp;lt;/math&amp;gt; в результате последнего раунда, для всех возможных &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа происходит частичное расшифрование, после чего в каждой паре тексты складываются и их разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается с искомой &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt; в характеристике. Если разницы текстов совпадают, данные значения бит раундового ключа заносятся в результат.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для алгоритма умножения квадратной матрицы на вектор порядка n в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
Для умножения матрицы размером &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; строк на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; столбцов на вектор порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном (наиболее быстром) варианте требуется:&lt;br /&gt;
 &lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
При этом использование режима накопления требует совершения умножений и сложений в режиме двойной точности, а в параллельном варианте это означает, что практически все промежуточные вычисления для выполнения алгоритма в режиме накопления должны быть двойной точности. В отличие от последовательного варианта это означает некоторое увеличение требуемой памяти.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, таким образом, алгоритм умножения матрицы на вектор относится к алгоритмам &#039;&#039;с линейной сложностью&#039;&#039;. При классификации по ширине ЯПФ его сложность также будет &#039;&#039;линейной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: алгоритм шифрования, константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, вероятность характеристики &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, число бит раундового ключа &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число раундов шифрования &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, входная разница между парами текстов &amp;lt;math&amp;gt;deltafirst&amp;lt;/math&amp;gt;, выходная разница между парами текстов &amp;lt;math&amp;gt;deltalast&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: Объем входных не изменяется, изменяются только сами входные данные. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Биты раундового ключа последнего раунда.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;
=== Возможные способы и особенности параллельной реализации алгоритма ===&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;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28646</id>
		<title>Дифференацильная атака</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28646"/>
		<updated>2021-11-04T12:13:20Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю {\displaystyle 2^{32}}2^{32}. Является статистической атакой. Применим для взлома DES, FEAL и некоторых других шифров, как правило, разработанных ранее начала 90-х. Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;ΔX=({ΔX_1}{ΔX_2}{ΔX_3}...{ΔX_3})&amp;lt;/math&amp;gt;&lt;br /&gt;
Задачей криптоаналитика является нахождение &lt;br /&gt;
Пусть &amp;lt;math&amp;gt;{p}&amp;lt;/math&amp;gt; - вероя&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифртекстов и возможного значения бит раундового ключа последнего раунда найденной характеристики  происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;gt; раунде совпадает с искомой разницей &amp;lt;math&amp;gt;ΔU&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2c/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;с&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит числе пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим [[глоссарий#Граф алгоритма|граф алгоритма]] для обработки одного текста как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Graphdifferential.jpg|обрамить|центр|Информационная схема работы алгоритма]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из рисунка, для каждого текста &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; сначала генерируется второй текст при помощи добавления к нему разницы &amp;lt;math&amp;gt;Δfirst&amp;lt;/math&amp;gt;, взятой из дифференциальной характеристики, после чего происходит шифрование на протяжение &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; раундов для обеих текстов из пары. После получения шифртекстов &amp;lt;math&amp;gt;Y_R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Y&#039;_R&amp;lt;/math&amp;gt; в результате последнего раунда, для всех возможных &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит последнего раундового ключа происходит частичное расшифрование, после чего в каждой паре тексты складываются и их разница &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; сравнивается с искомой &amp;lt;math&amp;gt;Δlast&amp;lt;/math&amp;gt; в характеристике. Если разницы текстов совпадают, данные значения бит раундового ключа заносятся в результат.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для алгоритма умножения квадратной матрицы на вектор порядка n в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
Для умножения матрицы размером &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; строк на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; столбцов на вектор порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном (наиболее быстром) варианте требуется:&lt;br /&gt;
 &lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
При этом использование режима накопления требует совершения умножений и сложений в режиме двойной точности, а в параллельном варианте это означает, что практически все промежуточные вычисления для выполнения алгоритма в режиме накопления должны быть двойной точности. В отличие от последовательного варианта это означает некоторое увеличение требуемой памяти.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, таким образом, алгоритм умножения матрицы на вектор относится к алгоритмам &#039;&#039;с линейной сложностью&#039;&#039;. При классификации по ширине ЯПФ его сложность также будет &#039;&#039;линейной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: алгоритм шифрования, константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, вероятность характеристики &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, число бит раундового ключа &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число раундов шифрования &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, входная разница между парами текстов &amp;lt;math&amp;gt;deltafirst&amp;lt;/math&amp;gt;, выходная разница между парами текстов &amp;lt;math&amp;gt;deltalast&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: Объем входных не изменяется, изменяются только сами входные данные. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Биты раундового ключа последнего раунда.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;
=== Возможные способы и особенности параллельной реализации алгоритма ===&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;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Graphdifferential.jpg&amp;diff=28645</id>
		<title>Файл:Graphdifferential.jpg</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Graphdifferential.jpg&amp;diff=28645"/>
		<updated>2021-11-04T11:50:05Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;work&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28644</id>
		<title>Дифференацильная атака</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28644"/>
		<updated>2021-11-04T11:31:07Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю {\displaystyle 2^{32}}2^{32}. Является статистической атакой. Применим для взлома DES, FEAL и некоторых других шифров, как правило, разработанных ранее начала 90-х. Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;ΔX=({ΔX_1}{ΔX_2}{ΔX_3}...{ΔX_3})&amp;lt;/math&amp;gt;&lt;br /&gt;
Задачей криптоаналитика является нахождение &lt;br /&gt;
Пусть &amp;lt;math&amp;gt;{p}&amp;lt;/math&amp;gt; - вероя&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифртекстов и возможного значения бит раундового ключа последнего раунда найденной характеристики  происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;gt; раунде совпадает с искомой разницей &amp;lt;math&amp;gt;ΔU&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2c/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;с&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит числе пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем [[глоссарий#Граф алгоритма|граф алгоритма]] как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
[[Файл:YeqAX.png|500px|thumb|center|Рисунок 1. Граф последовательного умножения плотной матрицы на вектор с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма умножения плотной матрицы на вектор состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; константа &amp;lt;math&amp;gt;0.&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, а именно  &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - элемент входных данных &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; n&amp;lt;/math&amp;gt; - &#039;&#039;промежуточным данным&#039;&#039; алгоритма;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = n&amp;lt;/math&amp;gt; - выходным данным.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рисунке, выполненном для случая &amp;lt;math&amp;gt;m = 4, n = 5&amp;lt;/math&amp;gt;. Здесь вершины обозначены голубым цветом. Изображена подача только входных данных из вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, подача элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, идущая во все вершины, на рисунке не представлена.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для алгоритма умножения квадратной матрицы на вектор порядка n в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
Для умножения матрицы размером &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; строк на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; столбцов на вектор порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном (наиболее быстром) варианте требуется:&lt;br /&gt;
 &lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
При этом использование режима накопления требует совершения умножений и сложений в режиме двойной точности, а в параллельном варианте это означает, что практически все промежуточные вычисления для выполнения алгоритма в режиме накопления должны быть двойной точности. В отличие от последовательного варианта это означает некоторое увеличение требуемой памяти.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, таким образом, алгоритм умножения матрицы на вектор относится к алгоритмам &#039;&#039;с линейной сложностью&#039;&#039;. При классификации по ширине ЯПФ его сложность также будет &#039;&#039;линейной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: алгоритм шифрования, константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, вероятность характеристики &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, число бит раундового ключа &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число раундов шифрования &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, входная разница между парами текстов &amp;lt;math&amp;gt;deltafirst&amp;lt;/math&amp;gt;, выходная разница между парами текстов &amp;lt;math&amp;gt;deltalast&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: Объем входных не изменяется, изменяются только сами входные данные. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Биты раундового ключа последнего раунда.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;
=== Возможные способы и особенности параллельной реализации алгоритма ===&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;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28643</id>
		<title>Дифференацильная атака</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28643"/>
		<updated>2021-11-04T11:30:24Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю {\displaystyle 2^{32}}2^{32}. Является статистической атакой. Применим для взлома DES, FEAL и некоторых других шифров, как правило, разработанных ранее начала 90-х. Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;ΔX=({ΔX_1}{ΔX_2}{ΔX_3}...{ΔX_3})&amp;lt;/math&amp;gt;&lt;br /&gt;
Задачей криптоаналитика является нахождение &lt;br /&gt;
Пусть &amp;lt;math&amp;gt;{p}&amp;lt;/math&amp;gt; - вероя&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифртекстов и возможного значения бит раундового ключа последнего раунда найденной характеристики  происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;gt; раунде совпадает с искомой разницей &amp;lt;math&amp;gt;ΔU&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2c/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;с&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит числе пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем [[глоссарий#Граф алгоритма|граф алгоритма]] как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
[[Файл:YeqAX.png|500px|thumb|center|Рисунок 1. Граф последовательного умножения плотной матрицы на вектор с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма умножения плотной матрицы на вектор состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; константа &amp;lt;math&amp;gt;0.&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, а именно  &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - элемент входных данных &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; n&amp;lt;/math&amp;gt; - &#039;&#039;промежуточным данным&#039;&#039; алгоритма;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = n&amp;lt;/math&amp;gt; - выходным данным.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рисунке, выполненном для случая &amp;lt;math&amp;gt;m = 4, n = 5&amp;lt;/math&amp;gt;. Здесь вершины обозначены голубым цветом. Изображена подача только входных данных из вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, подача элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, идущая во все вершины, на рисунке не представлена.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для алгоритма умножения квадратной матрицы на вектор порядка n в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
Для умножения матрицы размером &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; строк на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; столбцов на вектор порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном (наиболее быстром) варианте требуется:&lt;br /&gt;
 &lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
При этом использование режима накопления требует совершения умножений и сложений в режиме двойной точности, а в параллельном варианте это означает, что практически все промежуточные вычисления для выполнения алгоритма в режиме накопления должны быть двойной точности. В отличие от последовательного варианта это означает некоторое увеличение требуемой памяти.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, таким образом, алгоритм умножения матрицы на вектор относится к алгоритмам &#039;&#039;с линейной сложностью&#039;&#039;. При классификации по ширине ЯПФ его сложность также будет &#039;&#039;линейной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: алгоритм шифрования, константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, вероятность характеристики &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, число бит раундового ключа &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число раундов шифрования &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, входная разница между парами текстов &amp;lt;math&amp;gt;deltafirst&amp;lt;/math&amp;gt;, выходная разница между парами текстов &amp;lt;math&amp;gt;deltalast&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: Объем входных не изменяется, изменяются только сами входные данные. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Биты раундового ключа последнего раунда.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
[[file:Масштабируемость перемножения матрицы и вектора производительность.png|thumb|center|700px|Рисунок 5. Параллельная реализация произведения матрицы на вектор Максимальная производительность. ]]&lt;br /&gt;
[[file:Масштабируемость перемножения матрицы и вектора эффективность.png|thumb|center|700px|Рисунок 6. Параллельная реализация произведения матрицы на вектор Максимальная эффективность. ]]&lt;br /&gt;
Набор изменяемых параметров запуска реализации алгоритма и границы значений параметров алгоритма: &lt;br /&gt;
*	число процессоров [4 : 256]&lt;br /&gt;
*	размерность матрицы [1024 : 51200]&lt;br /&gt;
Эффективность выполнения реализации алгоритма&lt;br /&gt;
*	Минимальная эффективность 0,02%&lt;br /&gt;
*	Максимальная эффективность 9,55%&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
*	По числу процессов: -0.01517 – при увеличении числа процессов эффективность убывает достаточно интенсивно на всей рассмотренной области изменений параметров запуска. Уменьшение эффективности на рассмотренной области работы параллельной программы звязано с увеличением числа пересылок с ростом числа процессов и как следствие ростом накладных расходов на организацию вычислений. Основной вклад в значение эффективности вносит область с малым числом процессов и малой задачей, там эффективность достигает максимума в 9,5%. Далее эффективность очень резко падает до уровня около 1% Присутствует область, на которой при увеличении числа процессов эффективность возрастает, но при дальнейшем росте продолжает снижаться. Это скорее всего объясняется декомпозицей данных, при которой наступает момент, когда размер матрицы позволяет блокам укладываться в КЭШ-память. Так же это подтверждает проявление этого явления, но со смещением по числу процессов, и при увеличении вычислительной сложности задачи.&lt;br /&gt;
*	По размеру задачи: -0.0014 – при увеличении размера задачи эффективность в целом уменьшается по рассматриваемой области, хотя и менее интенсивно, чем при увеличении числа процессов. Снижение эффективности объясняется тем, что при росте вычислительной сложности существенно возрастают объемы передаваемых данных. При увеличении размера данных наступает момент резкого снижения эффективности с значений около 1% к долям процента и минимуму. С увеличением числа процессоров такой переход появляется на большем объеме данных. Это свидетельствует о том, что присутствует момент, когда данных слишком много и эффективность работы с ними становится значительно ниже, но чем больше имеется процессов, там позже наступает такой момент декомпозиции. Присутствует область возрастания эффективности, на всех рассмотренных размерах матрицы. Это объясняется тем, что при малом размере задачи данные хорошо укладываются в КЭШ память, что приводит к высокой эффективности работы приложения при малом размере задачи. При дальнейшем увеличении размера эффективность уменьшается при выходе за границы КЭШ-памяти. &lt;br /&gt;
*	По двум направлениям: -0.0001546 – при рассмотрении увеличения, как вычислительной сложности, так и числа процессов по всей рассмотренной области значений уменьшается, интенсивность уменьшения эффективности не очень высока. В совокупности с тем фактом, что разница между максимальной и минимальной эффективностью на рассмотренной области значений параметров составляет около 9% говорит о том, что уменьшение эффективности по всей области довольно равномерное, но интенсивно лишь в не очень больших участках по площади. На остальной области значений параметров изменения эффективности не столь значительны и находятся на приблизительно одном и том же уровне.&lt;br /&gt;
&lt;br /&gt;
[http://git.algowiki-project.org/Teplov/Scalability/blob/master/matrix_vector_mult/mpi_mat_vect_time.c Реализация алгоритма на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28642</id>
		<title>Дифференацильная атака</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%94%D0%B8%D1%84%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D1%86%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B0%D1%82%D0%B0%D0%BA%D0%B0&amp;diff=28642"/>
		<updated>2021-11-04T10:45:58Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: Новая страница: «{{level-a}}   == Свойства и структура алгоритма ==  === Общее описание алгоритма === Дифференциальн...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю {\displaystyle 2^{32}}2^{32}. Является статистической атакой. Применим для взлома DES, FEAL и некоторых других шифров, как правило, разработанных ранее начала 90-х. Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;ΔX=({ΔX_1}{ΔX_2}{ΔX_3}...{ΔX_3})&amp;lt;/math&amp;gt;&lt;br /&gt;
Задачей криптоаналитика является нахождение &lt;br /&gt;
Пусть &amp;lt;math&amp;gt;{p}&amp;lt;/math&amp;gt; - вероя&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифртекстов и возможного значения бит раундового ключа последнего раунда найденной характеристики  происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;gt; раунде совпадает с искомой разницей &amp;lt;math&amp;gt;ΔU&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2с/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;с&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит числе пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем [[глоссарий#Граф алгоритма|граф алгоритма]] как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
[[Файл:YeqAX.png|500px|thumb|center|Рисунок 1. Граф последовательного умножения плотной матрицы на вектор с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма умножения плотной матрицы на вектор состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; константа &amp;lt;math&amp;gt;0.&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, а именно  &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - элемент входных данных &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; n&amp;lt;/math&amp;gt; - &#039;&#039;промежуточным данным&#039;&#039; алгоритма;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = n&amp;lt;/math&amp;gt; - выходным данным.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рисунке, выполненном для случая &amp;lt;math&amp;gt;m = 4, n = 5&amp;lt;/math&amp;gt;. Здесь вершины обозначены голубым цветом. Изображена подача только входных данных из вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, подача элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, идущая во все вершины, на рисунке не представлена.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для алгоритма умножения квадратной матрицы на вектор порядка n в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
Для умножения матрицы размером &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; строк на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; столбцов на вектор порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном (наиболее быстром) варианте требуется:&lt;br /&gt;
 &lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
При этом использование режима накопления требует совершения умножений и сложений в режиме двойной точности, а в параллельном варианте это означает, что практически все промежуточные вычисления для выполнения алгоритма в режиме накопления должны быть двойной точности. В отличие от последовательного варианта это означает некоторое увеличение требуемой памяти.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, таким образом, алгоритм умножения матрицы на вектор относится к алгоритмам &#039;&#039;с линейной сложностью&#039;&#039;. При классификации по ширине ЯПФ его сложность также будет &#039;&#039;линейной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: алгоритм шифрования, константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, вероятность характеристики &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, число бит раундового ключа &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число раундов шифрования &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, входная разница между парами текстов &amp;lt;math&amp;gt;deltafirst&amp;lt;/math&amp;gt;, выходная разница между парами текстов &amp;lt;math&amp;gt;deltalast&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: Объем входных не изменяется, изменяются только сами входные данные. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Биты раундового ключа последнего раунда.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
[[file:Масштабируемость перемножения матрицы и вектора производительность.png|thumb|center|700px|Рисунок 5. Параллельная реализация произведения матрицы на вектор Максимальная производительность. ]]&lt;br /&gt;
[[file:Масштабируемость перемножения матрицы и вектора эффективность.png|thumb|center|700px|Рисунок 6. Параллельная реализация произведения матрицы на вектор Максимальная эффективность. ]]&lt;br /&gt;
Набор изменяемых параметров запуска реализации алгоритма и границы значений параметров алгоритма: &lt;br /&gt;
*	число процессоров [4 : 256]&lt;br /&gt;
*	размерность матрицы [1024 : 51200]&lt;br /&gt;
Эффективность выполнения реализации алгоритма&lt;br /&gt;
*	Минимальная эффективность 0,02%&lt;br /&gt;
*	Максимальная эффективность 9,55%&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
*	По числу процессов: -0.01517 – при увеличении числа процессов эффективность убывает достаточно интенсивно на всей рассмотренной области изменений параметров запуска. Уменьшение эффективности на рассмотренной области работы параллельной программы звязано с увеличением числа пересылок с ростом числа процессов и как следствие ростом накладных расходов на организацию вычислений. Основной вклад в значение эффективности вносит область с малым числом процессов и малой задачей, там эффективность достигает максимума в 9,5%. Далее эффективность очень резко падает до уровня около 1% Присутствует область, на которой при увеличении числа процессов эффективность возрастает, но при дальнейшем росте продолжает снижаться. Это скорее всего объясняется декомпозицей данных, при которой наступает момент, когда размер матрицы позволяет блокам укладываться в КЭШ-память. Так же это подтверждает проявление этого явления, но со смещением по числу процессов, и при увеличении вычислительной сложности задачи.&lt;br /&gt;
*	По размеру задачи: -0.0014 – при увеличении размера задачи эффективность в целом уменьшается по рассматриваемой области, хотя и менее интенсивно, чем при увеличении числа процессов. Снижение эффективности объясняется тем, что при росте вычислительной сложности существенно возрастают объемы передаваемых данных. При увеличении размера данных наступает момент резкого снижения эффективности с значений около 1% к долям процента и минимуму. С увеличением числа процессоров такой переход появляется на большем объеме данных. Это свидетельствует о том, что присутствует момент, когда данных слишком много и эффективность работы с ними становится значительно ниже, но чем больше имеется процессов, там позже наступает такой момент декомпозиции. Присутствует область возрастания эффективности, на всех рассмотренных размерах матрицы. Это объясняется тем, что при малом размере задачи данные хорошо укладываются в КЭШ память, что приводит к высокой эффективности работы приложения при малом размере задачи. При дальнейшем увеличении размера эффективность уменьшается при выходе за границы КЭШ-памяти. &lt;br /&gt;
*	По двум направлениям: -0.0001546 – при рассмотрении увеличения, как вычислительной сложности, так и числа процессов по всей рассмотренной области значений уменьшается, интенсивность уменьшения эффективности не очень высока. В совокупности с тем фактом, что разница между максимальной и минимальной эффективностью на рассмотренной области значений параметров составляет около 9% говорит о том, что уменьшение эффективности по всей области довольно равномерное, но интенсивно лишь в не очень больших участках по площади. На остальной области значений параметров изменения эффективности не столь значительны и находятся на приблизительно одном и том же уровне.&lt;br /&gt;
&lt;br /&gt;
[http://git.algowiki-project.org/Teplov/Scalability/blob/master/matrix_vector_mult/mpi_mat_vect_time.c Реализация алгоритма на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Demiandr&amp;diff=28641</id>
		<title>Участник:Demiandr</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Demiandr&amp;diff=28641"/>
		<updated>2021-11-04T10:06:15Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю {\displaystyle 2^{32}}2^{32}. Является статистической атакой. Применим для взлома DES, FEAL и некоторых других шифров, как правило, разработанных ранее начала 90-х. Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;ΔX=({ΔX_1}{ΔX_2}{ΔX_3}...{ΔX_3})&amp;lt;/math&amp;gt;&lt;br /&gt;
Задачей криптоаналитика является нахождение &lt;br /&gt;
Пусть &amp;lt;math&amp;gt;{p}&amp;lt;/math&amp;gt; - вероя&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифртекстов и возможного значения бит раундового ключа последнего раунда найденной характеристики  происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;gt; раунде совпадает с искомой разницей &amp;lt;math&amp;gt;ΔU&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2с/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;с&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит числе пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем [[глоссарий#Граф алгоритма|граф алгоритма]] как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
[[Файл:YeqAX.png|500px|thumb|center|Рисунок 1. Граф последовательного умножения плотной матрицы на вектор с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма умножения плотной матрицы на вектор состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; константа &amp;lt;math&amp;gt;0.&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, а именно  &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - элемент входных данных &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; n&amp;lt;/math&amp;gt; - &#039;&#039;промежуточным данным&#039;&#039; алгоритма;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = n&amp;lt;/math&amp;gt; - выходным данным.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рисунке, выполненном для случая &amp;lt;math&amp;gt;m = 4, n = 5&amp;lt;/math&amp;gt;. Здесь вершины обозначены голубым цветом. Изображена подача только входных данных из вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, подача элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, идущая во все вершины, на рисунке не представлена.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для алгоритма умножения квадратной матрицы на вектор порядка n в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
Для умножения матрицы размером &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; строк на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; столбцов на вектор порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном (наиболее быстром) варианте требуется:&lt;br /&gt;
 &lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
При этом использование режима накопления требует совершения умножений и сложений в режиме двойной точности, а в параллельном варианте это означает, что практически все промежуточные вычисления для выполнения алгоритма в режиме накопления должны быть двойной точности. В отличие от последовательного варианта это означает некоторое увеличение требуемой памяти.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, таким образом, алгоритм умножения матрицы на вектор относится к алгоритмам &#039;&#039;с линейной сложностью&#039;&#039;. При классификации по ширине ЯПФ его сложность также будет &#039;&#039;линейной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: алгоритм шифрования, константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, вероятность характеристики &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, число бит раундового ключа &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число раундов шифрования &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, входная разница между парами текстов &amp;lt;math&amp;gt;deltafirst&amp;lt;/math&amp;gt;, выходная разница между парами текстов &amp;lt;math&amp;gt;deltalast&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: Объем входных не изменяется, изменяются только сами входные данные. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Биты раундового ключа последнего раунда.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
[[file:Масштабируемость перемножения матрицы и вектора производительность.png|thumb|center|700px|Рисунок 5. Параллельная реализация произведения матрицы на вектор Максимальная производительность. ]]&lt;br /&gt;
[[file:Масштабируемость перемножения матрицы и вектора эффективность.png|thumb|center|700px|Рисунок 6. Параллельная реализация произведения матрицы на вектор Максимальная эффективность. ]]&lt;br /&gt;
Набор изменяемых параметров запуска реализации алгоритма и границы значений параметров алгоритма: &lt;br /&gt;
*	число процессоров [4 : 256]&lt;br /&gt;
*	размерность матрицы [1024 : 51200]&lt;br /&gt;
Эффективность выполнения реализации алгоритма&lt;br /&gt;
*	Минимальная эффективность 0,02%&lt;br /&gt;
*	Максимальная эффективность 9,55%&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
*	По числу процессов: -0.01517 – при увеличении числа процессов эффективность убывает достаточно интенсивно на всей рассмотренной области изменений параметров запуска. Уменьшение эффективности на рассмотренной области работы параллельной программы звязано с увеличением числа пересылок с ростом числа процессов и как следствие ростом накладных расходов на организацию вычислений. Основной вклад в значение эффективности вносит область с малым числом процессов и малой задачей, там эффективность достигает максимума в 9,5%. Далее эффективность очень резко падает до уровня около 1% Присутствует область, на которой при увеличении числа процессов эффективность возрастает, но при дальнейшем росте продолжает снижаться. Это скорее всего объясняется декомпозицей данных, при которой наступает момент, когда размер матрицы позволяет блокам укладываться в КЭШ-память. Так же это подтверждает проявление этого явления, но со смещением по числу процессов, и при увеличении вычислительной сложности задачи.&lt;br /&gt;
*	По размеру задачи: -0.0014 – при увеличении размера задачи эффективность в целом уменьшается по рассматриваемой области, хотя и менее интенсивно, чем при увеличении числа процессов. Снижение эффективности объясняется тем, что при росте вычислительной сложности существенно возрастают объемы передаваемых данных. При увеличении размера данных наступает момент резкого снижения эффективности с значений около 1% к долям процента и минимуму. С увеличением числа процессоров такой переход появляется на большем объеме данных. Это свидетельствует о том, что присутствует момент, когда данных слишком много и эффективность работы с ними становится значительно ниже, но чем больше имеется процессов, там позже наступает такой момент декомпозиции. Присутствует область возрастания эффективности, на всех рассмотренных размерах матрицы. Это объясняется тем, что при малом размере задачи данные хорошо укладываются в КЭШ память, что приводит к высокой эффективности работы приложения при малом размере задачи. При дальнейшем увеличении размера эффективность уменьшается при выходе за границы КЭШ-памяти. &lt;br /&gt;
*	По двум направлениям: -0.0001546 – при рассмотрении увеличения, как вычислительной сложности, так и числа процессов по всей рассмотренной области значений уменьшается, интенсивность уменьшения эффективности не очень высока. В совокупности с тем фактом, что разница между максимальной и минимальной эффективностью на рассмотренной области значений параметров составляет около 9% говорит о том, что уменьшение эффективности по всей области довольно равномерное, но интенсивно лишь в не очень больших участках по площади. На остальной области значений параметров изменения эффективности не столь значительны и находятся на приблизительно одном и том же уровне.&lt;br /&gt;
&lt;br /&gt;
[http://git.algowiki-project.org/Teplov/Scalability/blob/master/matrix_vector_mult/mpi_mat_vect_time.c Реализация алгоритма на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Demiandr&amp;diff=28640</id>
		<title>Участник:Demiandr</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Demiandr&amp;diff=28640"/>
		<updated>2021-11-04T10:03:39Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю {\displaystyle 2^{32}}2^{32}. Является статистической атакой. Применим для взлома DES, FEAL и некоторых других шифров, как правило, разработанных ранее начала 90-х. Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;ΔX=({ΔX_1}{ΔX_2}{ΔX_3}...{ΔX_3})&amp;lt;/math&amp;gt;&lt;br /&gt;
Задачей криптоаналитика является нахождение &lt;br /&gt;
Пусть &amp;lt;math&amp;gt;{p}&amp;lt;/math&amp;gt; - вероя&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифр и возможного значения бит раундового ключа последнего раунда найденной характеристики, происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2с/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;с&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит числе пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем [[глоссарий#Граф алгоритма|граф алгоритма]] как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
[[Файл:YeqAX.png|500px|thumb|center|Рисунок 1. Граф последовательного умножения плотной матрицы на вектор с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма умножения плотной матрицы на вектор состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; константа &amp;lt;math&amp;gt;0.&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, а именно  &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - элемент входных данных &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; n&amp;lt;/math&amp;gt; - &#039;&#039;промежуточным данным&#039;&#039; алгоритма;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = n&amp;lt;/math&amp;gt; - выходным данным.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рисунке, выполненном для случая &amp;lt;math&amp;gt;m = 4, n = 5&amp;lt;/math&amp;gt;. Здесь вершины обозначены голубым цветом. Изображена подача только входных данных из вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, подача элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, идущая во все вершины, на рисунке не представлена.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для алгоритма умножения квадратной матрицы на вектор порядка n в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
Для умножения матрицы размером &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; строк на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; столбцов на вектор порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном (наиболее быстром) варианте требуется:&lt;br /&gt;
 &lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
При этом использование режима накопления требует совершения умножений и сложений в режиме двойной точности, а в параллельном варианте это означает, что практически все промежуточные вычисления для выполнения алгоритма в режиме накопления должны быть двойной точности. В отличие от последовательного варианта это означает некоторое увеличение требуемой памяти.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, таким образом, алгоритм умножения матрицы на вектор относится к алгоритмам &#039;&#039;с линейной сложностью&#039;&#039;. При классификации по ширине ЯПФ его сложность также будет &#039;&#039;линейной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: алгоритм шифрования, константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, вероятность характеристики &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, число бит раундового ключа &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число раундов шифрования &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, входная разница между парами текстов &amp;lt;math&amp;gt;deltafirst&amp;lt;/math&amp;gt;, выходная разница между парами текстов &amp;lt;math&amp;gt;deltalast&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: Объем входных не изменяется, изменяются только сами входные данные. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Биты раундового ключа последнего раунда.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
[[file:Масштабируемость перемножения матрицы и вектора производительность.png|thumb|center|700px|Рисунок 5. Параллельная реализация произведения матрицы на вектор Максимальная производительность. ]]&lt;br /&gt;
[[file:Масштабируемость перемножения матрицы и вектора эффективность.png|thumb|center|700px|Рисунок 6. Параллельная реализация произведения матрицы на вектор Максимальная эффективность. ]]&lt;br /&gt;
Набор изменяемых параметров запуска реализации алгоритма и границы значений параметров алгоритма: &lt;br /&gt;
*	число процессоров [4 : 256]&lt;br /&gt;
*	размерность матрицы [1024 : 51200]&lt;br /&gt;
Эффективность выполнения реализации алгоритма&lt;br /&gt;
*	Минимальная эффективность 0,02%&lt;br /&gt;
*	Максимальная эффективность 9,55%&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
*	По числу процессов: -0.01517 – при увеличении числа процессов эффективность убывает достаточно интенсивно на всей рассмотренной области изменений параметров запуска. Уменьшение эффективности на рассмотренной области работы параллельной программы звязано с увеличением числа пересылок с ростом числа процессов и как следствие ростом накладных расходов на организацию вычислений. Основной вклад в значение эффективности вносит область с малым числом процессов и малой задачей, там эффективность достигает максимума в 9,5%. Далее эффективность очень резко падает до уровня около 1% Присутствует область, на которой при увеличении числа процессов эффективность возрастает, но при дальнейшем росте продолжает снижаться. Это скорее всего объясняется декомпозицей данных, при которой наступает момент, когда размер матрицы позволяет блокам укладываться в КЭШ-память. Так же это подтверждает проявление этого явления, но со смещением по числу процессов, и при увеличении вычислительной сложности задачи.&lt;br /&gt;
*	По размеру задачи: -0.0014 – при увеличении размера задачи эффективность в целом уменьшается по рассматриваемой области, хотя и менее интенсивно, чем при увеличении числа процессов. Снижение эффективности объясняется тем, что при росте вычислительной сложности существенно возрастают объемы передаваемых данных. При увеличении размера данных наступает момент резкого снижения эффективности с значений около 1% к долям процента и минимуму. С увеличением числа процессоров такой переход появляется на большем объеме данных. Это свидетельствует о том, что присутствует момент, когда данных слишком много и эффективность работы с ними становится значительно ниже, но чем больше имеется процессов, там позже наступает такой момент декомпозиции. Присутствует область возрастания эффективности, на всех рассмотренных размерах матрицы. Это объясняется тем, что при малом размере задачи данные хорошо укладываются в КЭШ память, что приводит к высокой эффективности работы приложения при малом размере задачи. При дальнейшем увеличении размера эффективность уменьшается при выходе за границы КЭШ-памяти. &lt;br /&gt;
*	По двум направлениям: -0.0001546 – при рассмотрении увеличения, как вычислительной сложности, так и числа процессов по всей рассмотренной области значений уменьшается, интенсивность уменьшения эффективности не очень высока. В совокупности с тем фактом, что разница между максимальной и минимальной эффективностью на рассмотренной области значений параметров составляет около 9% говорит о том, что уменьшение эффективности по всей области довольно равномерное, но интенсивно лишь в не очень больших участках по площади. На остальной области значений параметров изменения эффективности не столь значительны и находятся на приблизительно одном и том же уровне.&lt;br /&gt;
&lt;br /&gt;
[http://git.algowiki-project.org/Teplov/Scalability/blob/master/matrix_vector_mult/mpi_mat_vect_time.c Реализация алгоритма на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Demiandr&amp;diff=28639</id>
		<title>Участник:Demiandr</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Demiandr&amp;diff=28639"/>
		<updated>2021-11-04T10:03:03Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю {\displaystyle 2^{32}}2^{32}. Является статистической атакой. Применим для взлома DES, FEAL и некоторых других шифров, как правило, разработанных ранее начала 90-х. Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;ΔX=({ΔX_1}{ΔX_2}{ΔX_3}...{ΔX_3})&amp;lt;/math&amp;gt;&lt;br /&gt;
Задачей криптоаналитика является нахождение &lt;br /&gt;
Пусть &amp;lt;math&amp;gt;{p}&amp;lt;/math&amp;gt; - вероя&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифр и возможного значения бит раундового ключа последнего раунда найденной характеристики, происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2с/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;с&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит числе пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем [[глоссарий#Граф алгоритма|граф алгоритма]] как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
[[Файл:YeqAX.png|500px|thumb|center|Рисунок 1. Граф последовательного умножения плотной матрицы на вектор с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма умножения плотной матрицы на вектор состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; константа &amp;lt;math&amp;gt;0.&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, а именно  &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - элемент входных данных &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; n&amp;lt;/math&amp;gt; - &#039;&#039;промежуточным данным&#039;&#039; алгоритма;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = n&amp;lt;/math&amp;gt; - выходным данным.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рисунке, выполненном для случая &amp;lt;math&amp;gt;m = 4, n = 5&amp;lt;/math&amp;gt;. Здесь вершины обозначены голубым цветом. Изображена подача только входных данных из вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, подача элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, идущая во все вершины, на рисунке не представлена.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для алгоритма умножения квадратной матрицы на вектор порядка n в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
Для умножения матрицы размером &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; строк на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; столбцов на вектор порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном (наиболее быстром) варианте требуется:&lt;br /&gt;
 &lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
При этом использование режима накопления требует совершения умножений и сложений в режиме двойной точности, а в параллельном варианте это означает, что практически все промежуточные вычисления для выполнения алгоритма в режиме накопления должны быть двойной точности. В отличие от последовательного варианта это означает некоторое увеличение требуемой памяти.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, таким образом, алгоритм умножения матрицы на вектор относится к алгоритмам &#039;&#039;с линейной сложностью&#039;&#039;. При классификации по ширине ЯПФ его сложность также будет &#039;&#039;линейной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: алгоритм шифрования, константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, вероятность характеристики &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, число бит раундового ключа &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число раундов шифрования &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, входная разница между парами текстов &amp;lt;math&amp;gt;deltafirst&amp;lt;/math&amp;gt;, выходная разница между парами текстов &amp;lt;math&amp;gt;deltalast&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: Объем входных не изменяется, изменяются только сами входные данные. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Биты раундового ключа последнего раунда.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является &#039;&#039;линейным&#039;&#039; (отношение квадратической или билинейной к линейной). &lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма умножения матрицы на вектор, как отношение числа операций к суммарному объему входных и выходных данных – всего лишь &#039;&#039;константа&#039;&#039;.&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
[[file:Масштабируемость перемножения матрицы и вектора производительность.png|thumb|center|700px|Рисунок 5. Параллельная реализация произведения матрицы на вектор Максимальная производительность. ]]&lt;br /&gt;
[[file:Масштабируемость перемножения матрицы и вектора эффективность.png|thumb|center|700px|Рисунок 6. Параллельная реализация произведения матрицы на вектор Максимальная эффективность. ]]&lt;br /&gt;
Набор изменяемых параметров запуска реализации алгоритма и границы значений параметров алгоритма: &lt;br /&gt;
*	число процессоров [4 : 256]&lt;br /&gt;
*	размерность матрицы [1024 : 51200]&lt;br /&gt;
Эффективность выполнения реализации алгоритма&lt;br /&gt;
*	Минимальная эффективность 0,02%&lt;br /&gt;
*	Максимальная эффективность 9,55%&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
*	По числу процессов: -0.01517 – при увеличении числа процессов эффективность убывает достаточно интенсивно на всей рассмотренной области изменений параметров запуска. Уменьшение эффективности на рассмотренной области работы параллельной программы звязано с увеличением числа пересылок с ростом числа процессов и как следствие ростом накладных расходов на организацию вычислений. Основной вклад в значение эффективности вносит область с малым числом процессов и малой задачей, там эффективность достигает максимума в 9,5%. Далее эффективность очень резко падает до уровня около 1% Присутствует область, на которой при увеличении числа процессов эффективность возрастает, но при дальнейшем росте продолжает снижаться. Это скорее всего объясняется декомпозицей данных, при которой наступает момент, когда размер матрицы позволяет блокам укладываться в КЭШ-память. Так же это подтверждает проявление этого явления, но со смещением по числу процессов, и при увеличении вычислительной сложности задачи.&lt;br /&gt;
*	По размеру задачи: -0.0014 – при увеличении размера задачи эффективность в целом уменьшается по рассматриваемой области, хотя и менее интенсивно, чем при увеличении числа процессов. Снижение эффективности объясняется тем, что при росте вычислительной сложности существенно возрастают объемы передаваемых данных. При увеличении размера данных наступает момент резкого снижения эффективности с значений около 1% к долям процента и минимуму. С увеличением числа процессоров такой переход появляется на большем объеме данных. Это свидетельствует о том, что присутствует момент, когда данных слишком много и эффективность работы с ними становится значительно ниже, но чем больше имеется процессов, там позже наступает такой момент декомпозиции. Присутствует область возрастания эффективности, на всех рассмотренных размерах матрицы. Это объясняется тем, что при малом размере задачи данные хорошо укладываются в КЭШ память, что приводит к высокой эффективности работы приложения при малом размере задачи. При дальнейшем увеличении размера эффективность уменьшается при выходе за границы КЭШ-памяти. &lt;br /&gt;
*	По двум направлениям: -0.0001546 – при рассмотрении увеличения, как вычислительной сложности, так и числа процессов по всей рассмотренной области значений уменьшается, интенсивность уменьшения эффективности не очень высока. В совокупности с тем фактом, что разница между максимальной и минимальной эффективностью на рассмотренной области значений параметров составляет около 9% говорит о том, что уменьшение эффективности по всей области довольно равномерное, но интенсивно лишь в не очень больших участках по площади. На остальной области значений параметров изменения эффективности не столь значительны и находятся на приблизительно одном и том же уровне.&lt;br /&gt;
&lt;br /&gt;
[http://git.algowiki-project.org/Teplov/Scalability/blob/master/matrix_vector_mult/mpi_mat_vect_time.c Реализация алгоритма на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Demiandr&amp;diff=28638</id>
		<title>Участник:Demiandr</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Demiandr&amp;diff=28638"/>
		<updated>2021-11-04T10:01:04Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю {\displaystyle 2^{32}}2^{32}. Является статистической атакой. Применим для взлома DES, FEAL и некоторых других шифров, как правило, разработанных ранее начала 90-х. Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;ΔX=({ΔX_1}{ΔX_2}{ΔX_3}...{ΔX_3})&amp;lt;/math&amp;gt;&lt;br /&gt;
Задачей криптоаналитика является нахождение &lt;br /&gt;
Пусть &amp;lt;math&amp;gt;{p}&amp;lt;/math&amp;gt; - вероя&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифр и возможного значения бит раундового ключа последнего раунда найденной характеристики, происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2с/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;с&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит числе пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем [[глоссарий#Граф алгоритма|граф алгоритма]] как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
[[Файл:YeqAX.png|500px|thumb|center|Рисунок 1. Граф последовательного умножения плотной матрицы на вектор с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма умножения плотной матрицы на вектор состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; константа &amp;lt;math&amp;gt;0.&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, а именно  &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - элемент входных данных &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; n&amp;lt;/math&amp;gt; - &#039;&#039;промежуточным данным&#039;&#039; алгоритма;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = n&amp;lt;/math&amp;gt; - выходным данным.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рисунке, выполненном для случая &amp;lt;math&amp;gt;m = 4, n = 5&amp;lt;/math&amp;gt;. Здесь вершины обозначены голубым цветом. Изображена подача только входных данных из вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, подача элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, идущая во все вершины, на рисунке не представлена.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для алгоритма умножения квадратной матрицы на вектор порядка n в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
Для умножения матрицы размером &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; строк на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; столбцов на вектор порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном (наиболее быстром) варианте требуется:&lt;br /&gt;
 &lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
При этом использование режима накопления требует совершения умножений и сложений в режиме двойной точности, а в параллельном варианте это означает, что практически все промежуточные вычисления для выполнения алгоритма в режиме накопления должны быть двойной точности. В отличие от последовательного варианта это означает некоторое увеличение требуемой памяти.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, таким образом, алгоритм умножения матрицы на вектор относится к алгоритмам &#039;&#039;с линейной сложностью&#039;&#039;. При классификации по ширине ЯПФ его сложность также будет &#039;&#039;линейной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: алгоритм шифрования, константа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, вероятность характеристики &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, число бит раундового ключа &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число раундов шифрования &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, входная разница между парами текстов deltafirst&amp;lt;/math&amp;gt;, выходная разница между парами текстов deltalast&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: Объем входных не изменяется, изменяются только сами входные данные. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: Биты раундового ключа последнего раунда.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является &#039;&#039;линейным&#039;&#039; (отношение квадратической или билинейной к линейной). &lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма умножения матрицы на вектор, как отношение числа операций к суммарному объему входных и выходных данных – всего лишь &#039;&#039;константа&#039;&#039;.&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
[[file:Масштабируемость перемножения матрицы и вектора производительность.png|thumb|center|700px|Рисунок 5. Параллельная реализация произведения матрицы на вектор Максимальная производительность. ]]&lt;br /&gt;
[[file:Масштабируемость перемножения матрицы и вектора эффективность.png|thumb|center|700px|Рисунок 6. Параллельная реализация произведения матрицы на вектор Максимальная эффективность. ]]&lt;br /&gt;
Набор изменяемых параметров запуска реализации алгоритма и границы значений параметров алгоритма: &lt;br /&gt;
*	число процессоров [4 : 256]&lt;br /&gt;
*	размерность матрицы [1024 : 51200]&lt;br /&gt;
Эффективность выполнения реализации алгоритма&lt;br /&gt;
*	Минимальная эффективность 0,02%&lt;br /&gt;
*	Максимальная эффективность 9,55%&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
*	По числу процессов: -0.01517 – при увеличении числа процессов эффективность убывает достаточно интенсивно на всей рассмотренной области изменений параметров запуска. Уменьшение эффективности на рассмотренной области работы параллельной программы звязано с увеличением числа пересылок с ростом числа процессов и как следствие ростом накладных расходов на организацию вычислений. Основной вклад в значение эффективности вносит область с малым числом процессов и малой задачей, там эффективность достигает максимума в 9,5%. Далее эффективность очень резко падает до уровня около 1% Присутствует область, на которой при увеличении числа процессов эффективность возрастает, но при дальнейшем росте продолжает снижаться. Это скорее всего объясняется декомпозицей данных, при которой наступает момент, когда размер матрицы позволяет блокам укладываться в КЭШ-память. Так же это подтверждает проявление этого явления, но со смещением по числу процессов, и при увеличении вычислительной сложности задачи.&lt;br /&gt;
*	По размеру задачи: -0.0014 – при увеличении размера задачи эффективность в целом уменьшается по рассматриваемой области, хотя и менее интенсивно, чем при увеличении числа процессов. Снижение эффективности объясняется тем, что при росте вычислительной сложности существенно возрастают объемы передаваемых данных. При увеличении размера данных наступает момент резкого снижения эффективности с значений около 1% к долям процента и минимуму. С увеличением числа процессоров такой переход появляется на большем объеме данных. Это свидетельствует о том, что присутствует момент, когда данных слишком много и эффективность работы с ними становится значительно ниже, но чем больше имеется процессов, там позже наступает такой момент декомпозиции. Присутствует область возрастания эффективности, на всех рассмотренных размерах матрицы. Это объясняется тем, что при малом размере задачи данные хорошо укладываются в КЭШ память, что приводит к высокой эффективности работы приложения при малом размере задачи. При дальнейшем увеличении размера эффективность уменьшается при выходе за границы КЭШ-памяти. &lt;br /&gt;
*	По двум направлениям: -0.0001546 – при рассмотрении увеличения, как вычислительной сложности, так и числа процессов по всей рассмотренной области значений уменьшается, интенсивность уменьшения эффективности не очень высока. В совокупности с тем фактом, что разница между максимальной и минимальной эффективностью на рассмотренной области значений параметров составляет около 9% говорит о том, что уменьшение эффективности по всей области довольно равномерное, но интенсивно лишь в не очень больших участках по площади. На остальной области значений параметров изменения эффективности не столь значительны и находятся на приблизительно одном и том же уровне.&lt;br /&gt;
&lt;br /&gt;
[http://git.algowiki-project.org/Teplov/Scalability/blob/master/matrix_vector_mult/mpi_mat_vect_time.c Реализация алгоритма на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Demiandr&amp;diff=28637</id>
		<title>Участник:Demiandr</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Demiandr&amp;diff=28637"/>
		<updated>2021-11-04T09:50:34Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: /* Программная реализация алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю {\displaystyle 2^{32}}2^{32}. Является статистической атакой. Применим для взлома DES, FEAL и некоторых других шифров, как правило, разработанных ранее начала 90-х. Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;ΔX=({ΔX_1}{ΔX_2}{ΔX_3}...{ΔX_3})&amp;lt;/math&amp;gt;&lt;br /&gt;
Задачей криптоаналитика является нахождение &lt;br /&gt;
Пусть &amp;lt;math&amp;gt;{p}&amp;lt;/math&amp;gt; - вероя&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифр и возможного значения бит раундового ключа последнего раунда найденной характеристики, происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2с/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;с&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит числе пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем [[глоссарий#Граф алгоритма|граф алгоритма]] как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
[[Файл:YeqAX.png|500px|thumb|center|Рисунок 1. Граф последовательного умножения плотной матрицы на вектор с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма умножения плотной матрицы на вектор состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; константа &amp;lt;math&amp;gt;0.&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, а именно  &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - элемент входных данных &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; n&amp;lt;/math&amp;gt; - &#039;&#039;промежуточным данным&#039;&#039; алгоритма;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = n&amp;lt;/math&amp;gt; - выходным данным.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рисунке, выполненном для случая &amp;lt;math&amp;gt;m = 4, n = 5&amp;lt;/math&amp;gt;. Здесь вершины обозначены голубым цветом. Изображена подача только входных данных из вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, подача элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, идущая во все вершины, на рисунке не представлена.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для алгоритма умножения квадратной матрицы на вектор порядка n в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
Для умножения матрицы размером &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; строк на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; столбцов на вектор порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном (наиболее быстром) варианте требуется:&lt;br /&gt;
 &lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
При этом использование режима накопления требует совершения умножений и сложений в режиме двойной точности, а в параллельном варианте это означает, что практически все промежуточные вычисления для выполнения алгоритма в режиме накопления должны быть двойной точности. В отличие от последовательного варианта это означает некоторое увеличение требуемой памяти.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, таким образом, алгоритм умножения матрицы на вектор относится к алгоритмам &#039;&#039;с линейной сложностью&#039;&#039;. При классификации по ширине ЯПФ его сложность также будет &#039;&#039;линейной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;mn+n&amp;lt;/math&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: вектор &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;y_{i}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является &#039;&#039;линейным&#039;&#039; (отношение квадратической или билинейной к линейной). &lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма умножения матрицы на вектор, как отношение числа операций к суммарному объему входных и выходных данных – всего лишь &#039;&#039;константа&#039;&#039;.&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
[[file:Масштабируемость перемножения матрицы и вектора производительность.png|thumb|center|700px|Рисунок 5. Параллельная реализация произведения матрицы на вектор Максимальная производительность. ]]&lt;br /&gt;
[[file:Масштабируемость перемножения матрицы и вектора эффективность.png|thumb|center|700px|Рисунок 6. Параллельная реализация произведения матрицы на вектор Максимальная эффективность. ]]&lt;br /&gt;
Набор изменяемых параметров запуска реализации алгоритма и границы значений параметров алгоритма: &lt;br /&gt;
*	число процессоров [4 : 256]&lt;br /&gt;
*	размерность матрицы [1024 : 51200]&lt;br /&gt;
Эффективность выполнения реализации алгоритма&lt;br /&gt;
*	Минимальная эффективность 0,02%&lt;br /&gt;
*	Максимальная эффективность 9,55%&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
*	По числу процессов: -0.01517 – при увеличении числа процессов эффективность убывает достаточно интенсивно на всей рассмотренной области изменений параметров запуска. Уменьшение эффективности на рассмотренной области работы параллельной программы звязано с увеличением числа пересылок с ростом числа процессов и как следствие ростом накладных расходов на организацию вычислений. Основной вклад в значение эффективности вносит область с малым числом процессов и малой задачей, там эффективность достигает максимума в 9,5%. Далее эффективность очень резко падает до уровня около 1% Присутствует область, на которой при увеличении числа процессов эффективность возрастает, но при дальнейшем росте продолжает снижаться. Это скорее всего объясняется декомпозицей данных, при которой наступает момент, когда размер матрицы позволяет блокам укладываться в КЭШ-память. Так же это подтверждает проявление этого явления, но со смещением по числу процессов, и при увеличении вычислительной сложности задачи.&lt;br /&gt;
*	По размеру задачи: -0.0014 – при увеличении размера задачи эффективность в целом уменьшается по рассматриваемой области, хотя и менее интенсивно, чем при увеличении числа процессов. Снижение эффективности объясняется тем, что при росте вычислительной сложности существенно возрастают объемы передаваемых данных. При увеличении размера данных наступает момент резкого снижения эффективности с значений около 1% к долям процента и минимуму. С увеличением числа процессоров такой переход появляется на большем объеме данных. Это свидетельствует о том, что присутствует момент, когда данных слишком много и эффективность работы с ними становится значительно ниже, но чем больше имеется процессов, там позже наступает такой момент декомпозиции. Присутствует область возрастания эффективности, на всех рассмотренных размерах матрицы. Это объясняется тем, что при малом размере задачи данные хорошо укладываются в КЭШ память, что приводит к высокой эффективности работы приложения при малом размере задачи. При дальнейшем увеличении размера эффективность уменьшается при выходе за границы КЭШ-памяти. &lt;br /&gt;
*	По двум направлениям: -0.0001546 – при рассмотрении увеличения, как вычислительной сложности, так и числа процессов по всей рассмотренной области значений уменьшается, интенсивность уменьшения эффективности не очень высока. В совокупности с тем фактом, что разница между максимальной и минимальной эффективностью на рассмотренной области значений параметров составляет около 9% говорит о том, что уменьшение эффективности по всей области довольно равномерное, но интенсивно лишь в не очень больших участках по площади. На остальной области значений параметров изменения эффективности не столь значительны и находятся на приблизительно одном и том же уровне.&lt;br /&gt;
&lt;br /&gt;
[http://git.algowiki-project.org/Teplov/Scalability/blob/master/matrix_vector_mult/mpi_mat_vect_time.c Реализация алгоритма на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Demiandr&amp;diff=28636</id>
		<title>Участник:Demiandr</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Demiandr&amp;diff=28636"/>
		<updated>2021-11-04T09:42:19Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю {\displaystyle 2^{32}}2^{32}. Является статистической атакой. Применим для взлома DES, FEAL и некоторых других шифров, как правило, разработанных ранее начала 90-х. Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;ΔX=({ΔX_1}{ΔX_2}{ΔX_3}...{ΔX_3})&amp;lt;/math&amp;gt;&lt;br /&gt;
Задачей криптоаналитика является нахождение &lt;br /&gt;
Пусть &amp;lt;math&amp;gt;{p}&amp;lt;/math&amp;gt; - вероя&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифр и возможного значения бит раундового ключа последнего раунда найденной характеристики, происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2с/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;с&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит числе пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем [[глоссарий#Граф алгоритма|граф алгоритма]] как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
[[Файл:YeqAX.png|500px|thumb|center|Рисунок 1. Граф последовательного умножения плотной матрицы на вектор с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма умножения плотной матрицы на вектор состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; константа &amp;lt;math&amp;gt;0.&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, а именно  &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - элемент входных данных &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; n&amp;lt;/math&amp;gt; - &#039;&#039;промежуточным данным&#039;&#039; алгоритма;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = n&amp;lt;/math&amp;gt; - выходным данным.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рисунке, выполненном для случая &amp;lt;math&amp;gt;m = 4, n = 5&amp;lt;/math&amp;gt;. Здесь вершины обозначены голубым цветом. Изображена подача только входных данных из вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, подача элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, идущая во все вершины, на рисунке не представлена.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для алгоритма умножения квадратной матрицы на вектор порядка n в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
Для умножения матрицы размером &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; строк на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; столбцов на вектор порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном (наиболее быстром) варианте требуется:&lt;br /&gt;
 &lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
При этом использование режима накопления требует совершения умножений и сложений в режиме двойной точности, а в параллельном варианте это означает, что практически все промежуточные вычисления для выполнения алгоритма в режиме накопления должны быть двойной точности. В отличие от последовательного варианта это означает некоторое увеличение требуемой памяти.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, таким образом, алгоритм умножения матрицы на вектор относится к алгоритмам &#039;&#039;с линейной сложностью&#039;&#039;. При классификации по ширине ЯПФ его сложность также будет &#039;&#039;линейной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;mn+n&amp;lt;/math&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: вектор &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;y_{i}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является &#039;&#039;линейным&#039;&#039; (отношение квадратической или билинейной к линейной). &lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма умножения матрицы на вектор, как отношение числа операций к суммарному объему входных и выходных данных – всего лишь &#039;&#039;константа&#039;&#039;.&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;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
	DO  I = 1, M&lt;br /&gt;
		S = 0.&lt;br /&gt;
		DO  J = 1, N&lt;br /&gt;
			S = S + DPROD(A(I,J), X(J))&lt;br /&gt;
		END DO	&lt;br /&gt;
	        Y(I) = S&lt;br /&gt;
	END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
При этом для реализации режима накопления переменная &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; должна быть двойной точности.&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
[[file:mv mult 1.PNG|thumb|center|700px|Рисунок 2. Умножение плотной матрицы на вектор. Общий профиль обращений в память]]&lt;br /&gt;
&lt;br /&gt;
На рис.2 представлен профиль обращений в память для реализации умножения плотной матрицы на вектор. В данном алгоритме задействовано три массива. Выделенный зеленым фрагмент 1 образован обращениями к результирующему вектору; фрагмент 2 – обращениями к исходному вектору; остальные обращения (фрагмент 3) выполняются к матрице, на которую умножается исходный вектор.&lt;br /&gt;
&lt;br /&gt;
Если посмотреть на исходный код, становится понятным, что каждый фрагмент устроен очень просто:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
for(int i = 0; i &amp;lt; size; i++)&lt;br /&gt;
for(int j = 0; j &amp;lt; size; j++)&lt;br /&gt;
vec_out[i] += matrix[i][j] * vec_in[j];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Видно, что фрагмент 1 (обращения к массиву vec_out) состоит из последовательного перебора всех элементов вектора, только к каждому элементу происходит подряд size обращений. Во фрагменте 2 (массив vec_in) выполняется обычный последовательный перебор, который затем повторяется size раз. Фрагмент 3 также представляет собой последовательный перебор всех элементов матрицы, который выполняется только один раз.&lt;br /&gt;
&lt;br /&gt;
Самой высокой локальностью обладает фрагмент 1 из-за повторяющихся подряд обращений к одним и тем же элементам. Однако фрагмент 2 также обладает высокой как пространственной, так и временной локальностью, поскольку число повторных проходов достаточно велико. Фрагмент 3, как и остальные, характеризуется высокой пространственной локальностью (из-за последовательного перебора), однако очень низкой временной локальностью – повторные обращения в нем просто отсутствуют.&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
Основной фрагмент реализации, на основе которого были получены количественные оценки, приведен [http://git.algowiki-project.org/Voevodin/locality/blob/master/benchmarks/d_matrix_vect_mult/d_matrix_vect_mult.h здесь] (функция Kernel). Условия запуска описаны [http://git.algowiki-project.org/Voevodin/locality/blob/master/README.md здесь].&lt;br /&gt;
&lt;br /&gt;
Первая оценка выполняется на основе характеристики daps, которая оценивает число выполненных обращений (чтений и записей) в память в секунду. Данная характеристика является аналогом оценки flops применительно к работе с памятью и является в большей степени оценкой производительности взаимодействия с памятью, чем оценкой локальности. Однако она служит хорошим источником информации, в том числе для сравнения с результатами по следующей характеристике cvg.&lt;br /&gt;
&lt;br /&gt;
На рис.3 приведены значения daps для реализаций распространенных алгоритмов, отсортированные по возрастанию (чем больше daps, тем в общем случае выше производительность). Можно увидеть, что производительность данной программы очень высока, даже немного выше, чем производительность теста Linpack. Одна из основных причин этому – очень высокая локальность обращений к векторам.&lt;br /&gt;
&lt;br /&gt;
[[file:mv mult daps ru.PNG|thumb|center|700px|Рисунок 3. Сравнение значений оценки daps]]&lt;br /&gt;
&lt;br /&gt;
Вторая характеристика – cvg – предназначена для получения более машинно-независимой оценки локальности. Она определяет, насколько часто в программе необходимо подтягивать данные в кэш-память. Соответственно, чем меньше значение cvg, тем реже это нужно делать, тем лучше локальность. &lt;br /&gt;
&lt;br /&gt;
На рис.4 приведены значения cvg для того же набора реализаций, отсортированные по убыванию (чем меньше cvg, тем в общем случае выше локальность). Можно увидеть, что, согласно данной оценке, локальность реализации умножения матрицы на вектор высока, хотя и не среди первых значений. Однако можно заметить, что полученное значение лишь совсем немного ниже оценки cvg для, например, реализации метода Гаусса или лучших вариантов перемножения матрицы. &lt;br /&gt;
&lt;br /&gt;
[[file:mv mult cvg.PNG|thumb|center|700px|Рисунок 4. Сравнение значений оценки cvg]]&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
[[file:Масштабируемость перемножения матрицы и вектора производительность.png|thumb|center|700px|Рисунок 5. Параллельная реализация произведения матрицы на вектор Максимальная производительность. ]]&lt;br /&gt;
[[file:Масштабируемость перемножения матрицы и вектора эффективность.png|thumb|center|700px|Рисунок 6. Параллельная реализация произведения матрицы на вектор Максимальная эффективность. ]]&lt;br /&gt;
Набор изменяемых параметров запуска реализации алгоритма и границы значений параметров алгоритма: &lt;br /&gt;
*	число процессоров [4 : 256]&lt;br /&gt;
*	размерность матрицы [1024 : 51200]&lt;br /&gt;
Эффективность выполнения реализации алгоритма&lt;br /&gt;
*	Минимальная эффективность 0,02%&lt;br /&gt;
*	Максимальная эффективность 9,55%&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
*	По числу процессов: -0.01517 – при увеличении числа процессов эффективность убывает достаточно интенсивно на всей рассмотренной области изменений параметров запуска. Уменьшение эффективности на рассмотренной области работы параллельной программы звязано с увеличением числа пересылок с ростом числа процессов и как следствие ростом накладных расходов на организацию вычислений. Основной вклад в значение эффективности вносит область с малым числом процессов и малой задачей, там эффективность достигает максимума в 9,5%. Далее эффективность очень резко падает до уровня около 1% Присутствует область, на которой при увеличении числа процессов эффективность возрастает, но при дальнейшем росте продолжает снижаться. Это скорее всего объясняется декомпозицей данных, при которой наступает момент, когда размер матрицы позволяет блокам укладываться в КЭШ-память. Так же это подтверждает проявление этого явления, но со смещением по числу процессов, и при увеличении вычислительной сложности задачи.&lt;br /&gt;
*	По размеру задачи: -0.0014 – при увеличении размера задачи эффективность в целом уменьшается по рассматриваемой области, хотя и менее интенсивно, чем при увеличении числа процессов. Снижение эффективности объясняется тем, что при росте вычислительной сложности существенно возрастают объемы передаваемых данных. При увеличении размера данных наступает момент резкого снижения эффективности с значений около 1% к долям процента и минимуму. С увеличением числа процессоров такой переход появляется на большем объеме данных. Это свидетельствует о том, что присутствует момент, когда данных слишком много и эффективность работы с ними становится значительно ниже, но чем больше имеется процессов, там позже наступает такой момент декомпозиции. Присутствует область возрастания эффективности, на всех рассмотренных размерах матрицы. Это объясняется тем, что при малом размере задачи данные хорошо укладываются в КЭШ память, что приводит к высокой эффективности работы приложения при малом размере задачи. При дальнейшем увеличении размера эффективность уменьшается при выходе за границы КЭШ-памяти. &lt;br /&gt;
*	По двум направлениям: -0.0001546 – при рассмотрении увеличения, как вычислительной сложности, так и числа процессов по всей рассмотренной области значений уменьшается, интенсивность уменьшения эффективности не очень высока. В совокупности с тем фактом, что разница между максимальной и минимальной эффективностью на рассмотренной области значений параметров составляет около 9% говорит о том, что уменьшение эффективности по всей области довольно равномерное, но интенсивно лишь в не очень больших участках по площади. На остальной области значений параметров изменения эффективности не столь значительны и находятся на приблизительно одном и том же уровне.&lt;br /&gt;
&lt;br /&gt;
[http://git.algowiki-project.org/Teplov/Scalability/blob/master/matrix_vector_mult/mpi_mat_vect_time.c Реализация алгоритма на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Demiandr&amp;diff=28635</id>
		<title>Участник:Demiandr</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Demiandr&amp;diff=28635"/>
		<updated>2021-11-04T09:40:32Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю {\displaystyle 2^{32}}2^{32}. Является статистической атакой. Применим для взлома DES, FEAL и некоторых других шифров, как правило, разработанных ранее начала 90-х. Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;ΔX=({ΔX_1}{ΔX_2}{ΔX_3}...{ΔX_3})&amp;lt;/math&amp;gt;&lt;br /&gt;
Задачей криптоаналитика является нахождение &lt;br /&gt;
Пусть &amp;lt;math&amp;gt;{p}&amp;lt;/math&amp;gt; - вероя&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифр и возможного значения бит раундового ключа последнего раунда найденной характеристики, происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;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;lt;source lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
double p = 0.000001;//вероятность найденной характеристики&lt;br /&gt;
int c = 2;//константа&lt;br /&gt;
int R = 12;//число раундов шифра&lt;br /&gt;
int b = 4;//число бит раундового ключа, которые можно определить найденной характеристикой&lt;br /&gt;
__uint64 deltafirst=(2^34);// найденная характеристика (разница между парой текстов)&lt;br /&gt;
__uint64 deltalast=1;(найденная разница между текстами на предпоследнем раунде_&lt;br /&gt;
__uint64 firsttext;//первый текст из пары&lt;br /&gt;
__uint64 secondtext;//второй текст из пары&lt;br /&gt;
int result[pow(2,b)]={};//массив возможных значений бит раундового ключа&lt;br /&gt;
for (__uint64 i=0; i&amp;lt;(c/p);i++)&lt;br /&gt;
{&lt;br /&gt;
firsttext=i;//генерация первого текста пары&lt;br /&gt;
secondtext=i^deltafirst;//генерация второго текста пары&lt;br /&gt;
  for (int j=0; j&amp;lt;R;j++)&lt;br /&gt;
  {&lt;br /&gt;
  firsttext = cipher(firsttext);&lt;br /&gt;
  secondtext = cipher(secondtext);&lt;br /&gt;
  }&lt;br /&gt;
  for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    firsttext = decipher(firsttext,k)&lt;br /&gt;
    secondtext = decipher(secondtext,k)&lt;br /&gt;
    if (deltalast == firsttext ^ secondtext)&lt;br /&gt;
    {&lt;br /&gt;
    result[k]++&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int max=0&lt;br /&gt;
for (int k=0; k&amp;lt; pow(2,b);k++)&lt;br /&gt;
  {&lt;br /&gt;
    if (result[k] &amp;gt; max) max=result[k]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2с/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;с&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит числе пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем [[глоссарий#Граф алгоритма|граф алгоритма]] как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
[[Файл:YeqAX.png|500px|thumb|center|Рисунок 1. Граф последовательного умножения плотной матрицы на вектор с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма умножения плотной матрицы на вектор состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; константа &amp;lt;math&amp;gt;0.&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, а именно  &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - элемент входных данных &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; n&amp;lt;/math&amp;gt; - &#039;&#039;промежуточным данным&#039;&#039; алгоритма;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = n&amp;lt;/math&amp;gt; - выходным данным.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рисунке, выполненном для случая &amp;lt;math&amp;gt;m = 4, n = 5&amp;lt;/math&amp;gt;. Здесь вершины обозначены голубым цветом. Изображена подача только входных данных из вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, подача элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, идущая во все вершины, на рисунке не представлена.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для алгоритма умножения квадратной матрицы на вектор порядка n в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
Для умножения матрицы размером &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; строк на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; столбцов на вектор порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном (наиболее быстром) варианте требуется:&lt;br /&gt;
 &lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
При этом использование режима накопления требует совершения умножений и сложений в режиме двойной точности, а в параллельном варианте это означает, что практически все промежуточные вычисления для выполнения алгоритма в режиме накопления должны быть двойной точности. В отличие от последовательного варианта это означает некоторое увеличение требуемой памяти.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, таким образом, алгоритм умножения матрицы на вектор относится к алгоритмам &#039;&#039;с линейной сложностью&#039;&#039;. При классификации по ширине ЯПФ его сложность также будет &#039;&#039;линейной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;mn+n&amp;lt;/math&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: вектор &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;y_{i}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является &#039;&#039;линейным&#039;&#039; (отношение квадратической или билинейной к линейной). &lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма умножения матрицы на вектор, как отношение числа операций к суммарному объему входных и выходных данных – всего лишь &#039;&#039;константа&#039;&#039;.&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;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
	DO  I = 1, M&lt;br /&gt;
		S = 0.&lt;br /&gt;
		DO  J = 1, N&lt;br /&gt;
			S = S + DPROD(A(I,J), X(J))&lt;br /&gt;
		END DO	&lt;br /&gt;
	        Y(I) = S&lt;br /&gt;
	END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
При этом для реализации режима накопления переменная &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; должна быть двойной точности.&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
[[file:mv mult 1.PNG|thumb|center|700px|Рисунок 2. Умножение плотной матрицы на вектор. Общий профиль обращений в память]]&lt;br /&gt;
&lt;br /&gt;
На рис.2 представлен профиль обращений в память для реализации умножения плотной матрицы на вектор. В данном алгоритме задействовано три массива. Выделенный зеленым фрагмент 1 образован обращениями к результирующему вектору; фрагмент 2 – обращениями к исходному вектору; остальные обращения (фрагмент 3) выполняются к матрице, на которую умножается исходный вектор.&lt;br /&gt;
&lt;br /&gt;
Если посмотреть на исходный код, становится понятным, что каждый фрагмент устроен очень просто:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
for(int i = 0; i &amp;lt; size; i++)&lt;br /&gt;
for(int j = 0; j &amp;lt; size; j++)&lt;br /&gt;
vec_out[i] += matrix[i][j] * vec_in[j];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Видно, что фрагмент 1 (обращения к массиву vec_out) состоит из последовательного перебора всех элементов вектора, только к каждому элементу происходит подряд size обращений. Во фрагменте 2 (массив vec_in) выполняется обычный последовательный перебор, который затем повторяется size раз. Фрагмент 3 также представляет собой последовательный перебор всех элементов матрицы, который выполняется только один раз.&lt;br /&gt;
&lt;br /&gt;
Самой высокой локальностью обладает фрагмент 1 из-за повторяющихся подряд обращений к одним и тем же элементам. Однако фрагмент 2 также обладает высокой как пространственной, так и временной локальностью, поскольку число повторных проходов достаточно велико. Фрагмент 3, как и остальные, характеризуется высокой пространственной локальностью (из-за последовательного перебора), однако очень низкой временной локальностью – повторные обращения в нем просто отсутствуют.&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
Основной фрагмент реализации, на основе которого были получены количественные оценки, приведен [http://git.algowiki-project.org/Voevodin/locality/blob/master/benchmarks/d_matrix_vect_mult/d_matrix_vect_mult.h здесь] (функция Kernel). Условия запуска описаны [http://git.algowiki-project.org/Voevodin/locality/blob/master/README.md здесь].&lt;br /&gt;
&lt;br /&gt;
Первая оценка выполняется на основе характеристики daps, которая оценивает число выполненных обращений (чтений и записей) в память в секунду. Данная характеристика является аналогом оценки flops применительно к работе с памятью и является в большей степени оценкой производительности взаимодействия с памятью, чем оценкой локальности. Однако она служит хорошим источником информации, в том числе для сравнения с результатами по следующей характеристике cvg.&lt;br /&gt;
&lt;br /&gt;
На рис.3 приведены значения daps для реализаций распространенных алгоритмов, отсортированные по возрастанию (чем больше daps, тем в общем случае выше производительность). Можно увидеть, что производительность данной программы очень высока, даже немного выше, чем производительность теста Linpack. Одна из основных причин этому – очень высокая локальность обращений к векторам.&lt;br /&gt;
&lt;br /&gt;
[[file:mv mult daps ru.PNG|thumb|center|700px|Рисунок 3. Сравнение значений оценки daps]]&lt;br /&gt;
&lt;br /&gt;
Вторая характеристика – cvg – предназначена для получения более машинно-независимой оценки локальности. Она определяет, насколько часто в программе необходимо подтягивать данные в кэш-память. Соответственно, чем меньше значение cvg, тем реже это нужно делать, тем лучше локальность. &lt;br /&gt;
&lt;br /&gt;
На рис.4 приведены значения cvg для того же набора реализаций, отсортированные по убыванию (чем меньше cvg, тем в общем случае выше локальность). Можно увидеть, что, согласно данной оценке, локальность реализации умножения матрицы на вектор высока, хотя и не среди первых значений. Однако можно заметить, что полученное значение лишь совсем немного ниже оценки cvg для, например, реализации метода Гаусса или лучших вариантов перемножения матрицы. &lt;br /&gt;
&lt;br /&gt;
[[file:mv mult cvg.PNG|thumb|center|700px|Рисунок 4. Сравнение значений оценки cvg]]&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
[[file:Масштабируемость перемножения матрицы и вектора производительность.png|thumb|center|700px|Рисунок 5. Параллельная реализация произведения матрицы на вектор Максимальная производительность. ]]&lt;br /&gt;
[[file:Масштабируемость перемножения матрицы и вектора эффективность.png|thumb|center|700px|Рисунок 6. Параллельная реализация произведения матрицы на вектор Максимальная эффективность. ]]&lt;br /&gt;
Набор изменяемых параметров запуска реализации алгоритма и границы значений параметров алгоритма: &lt;br /&gt;
*	число процессоров [4 : 256]&lt;br /&gt;
*	размерность матрицы [1024 : 51200]&lt;br /&gt;
Эффективность выполнения реализации алгоритма&lt;br /&gt;
*	Минимальная эффективность 0,02%&lt;br /&gt;
*	Максимальная эффективность 9,55%&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
*	По числу процессов: -0.01517 – при увеличении числа процессов эффективность убывает достаточно интенсивно на всей рассмотренной области изменений параметров запуска. Уменьшение эффективности на рассмотренной области работы параллельной программы звязано с увеличением числа пересылок с ростом числа процессов и как следствие ростом накладных расходов на организацию вычислений. Основной вклад в значение эффективности вносит область с малым числом процессов и малой задачей, там эффективность достигает максимума в 9,5%. Далее эффективность очень резко падает до уровня около 1% Присутствует область, на которой при увеличении числа процессов эффективность возрастает, но при дальнейшем росте продолжает снижаться. Это скорее всего объясняется декомпозицей данных, при которой наступает момент, когда размер матрицы позволяет блокам укладываться в КЭШ-память. Так же это подтверждает проявление этого явления, но со смещением по числу процессов, и при увеличении вычислительной сложности задачи.&lt;br /&gt;
*	По размеру задачи: -0.0014 – при увеличении размера задачи эффективность в целом уменьшается по рассматриваемой области, хотя и менее интенсивно, чем при увеличении числа процессов. Снижение эффективности объясняется тем, что при росте вычислительной сложности существенно возрастают объемы передаваемых данных. При увеличении размера данных наступает момент резкого снижения эффективности с значений около 1% к долям процента и минимуму. С увеличением числа процессоров такой переход появляется на большем объеме данных. Это свидетельствует о том, что присутствует момент, когда данных слишком много и эффективность работы с ними становится значительно ниже, но чем больше имеется процессов, там позже наступает такой момент декомпозиции. Присутствует область возрастания эффективности, на всех рассмотренных размерах матрицы. Это объясняется тем, что при малом размере задачи данные хорошо укладываются в КЭШ память, что приводит к высокой эффективности работы приложения при малом размере задачи. При дальнейшем увеличении размера эффективность уменьшается при выходе за границы КЭШ-памяти. &lt;br /&gt;
*	По двум направлениям: -0.0001546 – при рассмотрении увеличения, как вычислительной сложности, так и числа процессов по всей рассмотренной области значений уменьшается, интенсивность уменьшения эффективности не очень высока. В совокупности с тем фактом, что разница между максимальной и минимальной эффективностью на рассмотренной области значений параметров составляет около 9% говорит о том, что уменьшение эффективности по всей области довольно равномерное, но интенсивно лишь в не очень больших участках по площади. На остальной области значений параметров изменения эффективности не столь значительны и находятся на приблизительно одном и том же уровне.&lt;br /&gt;
&lt;br /&gt;
[http://git.algowiki-project.org/Teplov/Scalability/blob/master/matrix_vector_mult/mpi_mat_vect_time.c Реализация алгоритма на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Demiandr&amp;diff=28634</id>
		<title>Участник:Demiandr</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Demiandr&amp;diff=28634"/>
		<updated>2021-11-04T09:23:59Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю {\displaystyle 2^{32}}2^{32}. Является статистической атакой. Применим для взлома DES, FEAL и некоторых других шифров, как правило, разработанных ранее начала 90-х. Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;ΔX=({ΔX_1}{ΔX_2}{ΔX_3}...{ΔX_3})&amp;lt;/math&amp;gt;&lt;br /&gt;
Задачей криптоаналитика является нахождение &lt;br /&gt;
Пусть &amp;lt;math&amp;gt;{p}&amp;lt;/math&amp;gt; - вероя&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифр и возможного значения бит раундового ключа последнего раунда найденной характеристики, происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;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;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; по возрастанию выполняются&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_{i} = \sum_{j = 1}^{n} a_{ij} x_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Особо отметим, что вычисления сумм вида &amp;lt;math&amp;gt;\sum_{j = 1}^{n} a_{ij} x_{j}&amp;lt;/math&amp;gt; производят в режиме накопления прибавлением к текущему (временному) значению вычисляемой компоненты вектора &amp;lt;math&amp;gt;y_{i}&amp;lt;/math&amp;gt; произведений &amp;lt;math&amp;gt;a_{ij} x_{j}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &#039;&#039;&#039;c возрастанием&#039;&#039;&#039; &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, вначале все компоненты инициализируются нулями. При суммировании &amp;quot;по убыванию&amp;quot; общая схема принципиально не отличается и потому нами не рассматривается. Другие порядки выполнения суммирования приводят к изменению параллельных свойств алгоритма и будут рассматриваться нами в отдельных описаниях.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2с/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования, где &amp;lt;math&amp;gt;с&amp;lt;/math&amp;gt; - некоторая небольшая константа. Так как основным параметром является вероятность &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, от которой зависит числе пар текстов, данный алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем [[глоссарий#Граф алгоритма|граф алгоритма]] как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
[[Файл:YeqAX.png|500px|thumb|center|Рисунок 1. Граф последовательного умножения плотной матрицы на вектор с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма умножения плотной матрицы на вектор состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; константа &amp;lt;math&amp;gt;0.&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, а именно  &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - элемент входных данных &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; n&amp;lt;/math&amp;gt; - &#039;&#039;промежуточным данным&#039;&#039; алгоритма;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = n&amp;lt;/math&amp;gt; - выходным данным.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рисунке, выполненном для случая &amp;lt;math&amp;gt;m = 4, n = 5&amp;lt;/math&amp;gt;. Здесь вершины обозначены голубым цветом. Изображена подача только входных данных из вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, подача элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, идущая во все вершины, на рисунке не представлена.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для алгоритма умножения квадратной матрицы на вектор порядка n в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
Для умножения матрицы размером &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; строк на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; столбцов на вектор порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном (наиболее быстром) варианте требуется:&lt;br /&gt;
 &lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
При этом использование режима накопления требует совершения умножений и сложений в режиме двойной точности, а в параллельном варианте это означает, что практически все промежуточные вычисления для выполнения алгоритма в режиме накопления должны быть двойной точности. В отличие от последовательного варианта это означает некоторое увеличение требуемой памяти.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, таким образом, алгоритм умножения матрицы на вектор относится к алгоритмам &#039;&#039;с линейной сложностью&#039;&#039;. При классификации по ширине ЯПФ его сложность также будет &#039;&#039;линейной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;mn+n&amp;lt;/math&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: вектор &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;y_{i}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является &#039;&#039;линейным&#039;&#039; (отношение квадратической или билинейной к линейной). &lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма умножения матрицы на вектор, как отношение числа операций к суммарному объему входных и выходных данных – всего лишь &#039;&#039;константа&#039;&#039;.&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;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
	DO  I = 1, M&lt;br /&gt;
		S = 0.&lt;br /&gt;
		DO  J = 1, N&lt;br /&gt;
			S = S + DPROD(A(I,J), X(J))&lt;br /&gt;
		END DO	&lt;br /&gt;
	        Y(I) = S&lt;br /&gt;
	END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
При этом для реализации режима накопления переменная &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; должна быть двойной точности.&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
[[file:mv mult 1.PNG|thumb|center|700px|Рисунок 2. Умножение плотной матрицы на вектор. Общий профиль обращений в память]]&lt;br /&gt;
&lt;br /&gt;
На рис.2 представлен профиль обращений в память для реализации умножения плотной матрицы на вектор. В данном алгоритме задействовано три массива. Выделенный зеленым фрагмент 1 образован обращениями к результирующему вектору; фрагмент 2 – обращениями к исходному вектору; остальные обращения (фрагмент 3) выполняются к матрице, на которую умножается исходный вектор.&lt;br /&gt;
&lt;br /&gt;
Если посмотреть на исходный код, становится понятным, что каждый фрагмент устроен очень просто:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
for(int i = 0; i &amp;lt; size; i++)&lt;br /&gt;
for(int j = 0; j &amp;lt; size; j++)&lt;br /&gt;
vec_out[i] += matrix[i][j] * vec_in[j];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Видно, что фрагмент 1 (обращения к массиву vec_out) состоит из последовательного перебора всех элементов вектора, только к каждому элементу происходит подряд size обращений. Во фрагменте 2 (массив vec_in) выполняется обычный последовательный перебор, который затем повторяется size раз. Фрагмент 3 также представляет собой последовательный перебор всех элементов матрицы, который выполняется только один раз.&lt;br /&gt;
&lt;br /&gt;
Самой высокой локальностью обладает фрагмент 1 из-за повторяющихся подряд обращений к одним и тем же элементам. Однако фрагмент 2 также обладает высокой как пространственной, так и временной локальностью, поскольку число повторных проходов достаточно велико. Фрагмент 3, как и остальные, характеризуется высокой пространственной локальностью (из-за последовательного перебора), однако очень низкой временной локальностью – повторные обращения в нем просто отсутствуют.&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
Основной фрагмент реализации, на основе которого были получены количественные оценки, приведен [http://git.algowiki-project.org/Voevodin/locality/blob/master/benchmarks/d_matrix_vect_mult/d_matrix_vect_mult.h здесь] (функция Kernel). Условия запуска описаны [http://git.algowiki-project.org/Voevodin/locality/blob/master/README.md здесь].&lt;br /&gt;
&lt;br /&gt;
Первая оценка выполняется на основе характеристики daps, которая оценивает число выполненных обращений (чтений и записей) в память в секунду. Данная характеристика является аналогом оценки flops применительно к работе с памятью и является в большей степени оценкой производительности взаимодействия с памятью, чем оценкой локальности. Однако она служит хорошим источником информации, в том числе для сравнения с результатами по следующей характеристике cvg.&lt;br /&gt;
&lt;br /&gt;
На рис.3 приведены значения daps для реализаций распространенных алгоритмов, отсортированные по возрастанию (чем больше daps, тем в общем случае выше производительность). Можно увидеть, что производительность данной программы очень высока, даже немного выше, чем производительность теста Linpack. Одна из основных причин этому – очень высокая локальность обращений к векторам.&lt;br /&gt;
&lt;br /&gt;
[[file:mv mult daps ru.PNG|thumb|center|700px|Рисунок 3. Сравнение значений оценки daps]]&lt;br /&gt;
&lt;br /&gt;
Вторая характеристика – cvg – предназначена для получения более машинно-независимой оценки локальности. Она определяет, насколько часто в программе необходимо подтягивать данные в кэш-память. Соответственно, чем меньше значение cvg, тем реже это нужно делать, тем лучше локальность. &lt;br /&gt;
&lt;br /&gt;
На рис.4 приведены значения cvg для того же набора реализаций, отсортированные по убыванию (чем меньше cvg, тем в общем случае выше локальность). Можно увидеть, что, согласно данной оценке, локальность реализации умножения матрицы на вектор высока, хотя и не среди первых значений. Однако можно заметить, что полученное значение лишь совсем немного ниже оценки cvg для, например, реализации метода Гаусса или лучших вариантов перемножения матрицы. &lt;br /&gt;
&lt;br /&gt;
[[file:mv mult cvg.PNG|thumb|center|700px|Рисунок 4. Сравнение значений оценки cvg]]&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
[[file:Масштабируемость перемножения матрицы и вектора производительность.png|thumb|center|700px|Рисунок 5. Параллельная реализация произведения матрицы на вектор Максимальная производительность. ]]&lt;br /&gt;
[[file:Масштабируемость перемножения матрицы и вектора эффективность.png|thumb|center|700px|Рисунок 6. Параллельная реализация произведения матрицы на вектор Максимальная эффективность. ]]&lt;br /&gt;
Набор изменяемых параметров запуска реализации алгоритма и границы значений параметров алгоритма: &lt;br /&gt;
*	число процессоров [4 : 256]&lt;br /&gt;
*	размерность матрицы [1024 : 51200]&lt;br /&gt;
Эффективность выполнения реализации алгоритма&lt;br /&gt;
*	Минимальная эффективность 0,02%&lt;br /&gt;
*	Максимальная эффективность 9,55%&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
*	По числу процессов: -0.01517 – при увеличении числа процессов эффективность убывает достаточно интенсивно на всей рассмотренной области изменений параметров запуска. Уменьшение эффективности на рассмотренной области работы параллельной программы звязано с увеличением числа пересылок с ростом числа процессов и как следствие ростом накладных расходов на организацию вычислений. Основной вклад в значение эффективности вносит область с малым числом процессов и малой задачей, там эффективность достигает максимума в 9,5%. Далее эффективность очень резко падает до уровня около 1% Присутствует область, на которой при увеличении числа процессов эффективность возрастает, но при дальнейшем росте продолжает снижаться. Это скорее всего объясняется декомпозицей данных, при которой наступает момент, когда размер матрицы позволяет блокам укладываться в КЭШ-память. Так же это подтверждает проявление этого явления, но со смещением по числу процессов, и при увеличении вычислительной сложности задачи.&lt;br /&gt;
*	По размеру задачи: -0.0014 – при увеличении размера задачи эффективность в целом уменьшается по рассматриваемой области, хотя и менее интенсивно, чем при увеличении числа процессов. Снижение эффективности объясняется тем, что при росте вычислительной сложности существенно возрастают объемы передаваемых данных. При увеличении размера данных наступает момент резкого снижения эффективности с значений около 1% к долям процента и минимуму. С увеличением числа процессоров такой переход появляется на большем объеме данных. Это свидетельствует о том, что присутствует момент, когда данных слишком много и эффективность работы с ними становится значительно ниже, но чем больше имеется процессов, там позже наступает такой момент декомпозиции. Присутствует область возрастания эффективности, на всех рассмотренных размерах матрицы. Это объясняется тем, что при малом размере задачи данные хорошо укладываются в КЭШ память, что приводит к высокой эффективности работы приложения при малом размере задачи. При дальнейшем увеличении размера эффективность уменьшается при выходе за границы КЭШ-памяти. &lt;br /&gt;
*	По двум направлениям: -0.0001546 – при рассмотрении увеличения, как вычислительной сложности, так и числа процессов по всей рассмотренной области значений уменьшается, интенсивность уменьшения эффективности не очень высока. В совокупности с тем фактом, что разница между максимальной и минимальной эффективностью на рассмотренной области значений параметров составляет около 9% говорит о том, что уменьшение эффективности по всей области довольно равномерное, но интенсивно лишь в не очень больших участках по площади. На остальной области значений параметров изменения эффективности не столь значительны и находятся на приблизительно одном и том же уровне.&lt;br /&gt;
&lt;br /&gt;
[http://git.algowiki-project.org/Teplov/Scalability/blob/master/matrix_vector_mult/mpi_mat_vect_time.c Реализация алгоритма на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Demiandr&amp;diff=28633</id>
		<title>Участник:Demiandr</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Demiandr&amp;diff=28633"/>
		<updated>2021-11-04T09:16:53Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю {\displaystyle 2^{32}}2^{32}. Является статистической атакой. Применим для взлома DES, FEAL и некоторых других шифров, как правило, разработанных ранее начала 90-х. Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;ΔX=({ΔX_1}{ΔX_2}{ΔX_3}...{ΔX_3})&amp;lt;/math&amp;gt;&lt;br /&gt;
Задачей криптоаналитика является нахождение &lt;br /&gt;
Пусть &amp;lt;math&amp;gt;{p}&amp;lt;/math&amp;gt; - вероя&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифр и возможного значения бит раундового ключа последнего раунда найденной характеристики, происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;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;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; по возрастанию выполняются&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_{i} = \sum_{j = 1}^{n} a_{ij} x_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Особо отметим, что вычисления сумм вида &amp;lt;math&amp;gt;\sum_{j = 1}^{n} a_{ij} x_{j}&amp;lt;/math&amp;gt; производят в режиме накопления прибавлением к текущему (временному) значению вычисляемой компоненты вектора &amp;lt;math&amp;gt;y_{i}&amp;lt;/math&amp;gt; произведений &amp;lt;math&amp;gt;a_{ij} x_{j}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &#039;&#039;&#039;c возрастанием&#039;&#039;&#039; &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, вначале все компоненты инициализируются нулями. При суммировании &amp;quot;по убыванию&amp;quot; общая схема принципиально не отличается и потому нами не рассматривается. Другие порядки выполнения суммирования приводят к изменению параллельных свойств алгоритма и будут рассматриваться нами в отдельных описаниях.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2с/p)(R+2^b)&amp;lt;/math&amp;gt; операций шифрования.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, алгоритм умножения матрицы на вектор относится к алгоритмам &#039;&#039;с квадратической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем [[глоссарий#Граф алгоритма|граф алгоритма]] как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
[[Файл:YeqAX.png|500px|thumb|center|Рисунок 1. Граф последовательного умножения плотной матрицы на вектор с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма умножения плотной матрицы на вектор состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; константа &amp;lt;math&amp;gt;0.&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, а именно  &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - элемент входных данных &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; n&amp;lt;/math&amp;gt; - &#039;&#039;промежуточным данным&#039;&#039; алгоритма;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = n&amp;lt;/math&amp;gt; - выходным данным.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рисунке, выполненном для случая &amp;lt;math&amp;gt;m = 4, n = 5&amp;lt;/math&amp;gt;. Здесь вершины обозначены голубым цветом. Изображена подача только входных данных из вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, подача элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, идущая во все вершины, на рисунке не представлена.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для алгоритма умножения квадратной матрицы на вектор порядка n в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
Для умножения матрицы размером &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; строк на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; столбцов на вектор порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном (наиболее быстром) варианте требуется:&lt;br /&gt;
 &lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
При этом использование режима накопления требует совершения умножений и сложений в режиме двойной точности, а в параллельном варианте это означает, что практически все промежуточные вычисления для выполнения алгоритма в режиме накопления должны быть двойной точности. В отличие от последовательного варианта это означает некоторое увеличение требуемой памяти.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, таким образом, алгоритм умножения матрицы на вектор относится к алгоритмам &#039;&#039;с линейной сложностью&#039;&#039;. При классификации по ширине ЯПФ его сложность также будет &#039;&#039;линейной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;mn+n&amp;lt;/math&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: вектор &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;y_{i}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является &#039;&#039;линейным&#039;&#039; (отношение квадратической или билинейной к линейной). &lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма умножения матрицы на вектор, как отношение числа операций к суммарному объему входных и выходных данных – всего лишь &#039;&#039;константа&#039;&#039;.&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;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
	DO  I = 1, M&lt;br /&gt;
		S = 0.&lt;br /&gt;
		DO  J = 1, N&lt;br /&gt;
			S = S + DPROD(A(I,J), X(J))&lt;br /&gt;
		END DO	&lt;br /&gt;
	        Y(I) = S&lt;br /&gt;
	END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
При этом для реализации режима накопления переменная &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; должна быть двойной точности.&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
[[file:mv mult 1.PNG|thumb|center|700px|Рисунок 2. Умножение плотной матрицы на вектор. Общий профиль обращений в память]]&lt;br /&gt;
&lt;br /&gt;
На рис.2 представлен профиль обращений в память для реализации умножения плотной матрицы на вектор. В данном алгоритме задействовано три массива. Выделенный зеленым фрагмент 1 образован обращениями к результирующему вектору; фрагмент 2 – обращениями к исходному вектору; остальные обращения (фрагмент 3) выполняются к матрице, на которую умножается исходный вектор.&lt;br /&gt;
&lt;br /&gt;
Если посмотреть на исходный код, становится понятным, что каждый фрагмент устроен очень просто:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
for(int i = 0; i &amp;lt; size; i++)&lt;br /&gt;
for(int j = 0; j &amp;lt; size; j++)&lt;br /&gt;
vec_out[i] += matrix[i][j] * vec_in[j];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Видно, что фрагмент 1 (обращения к массиву vec_out) состоит из последовательного перебора всех элементов вектора, только к каждому элементу происходит подряд size обращений. Во фрагменте 2 (массив vec_in) выполняется обычный последовательный перебор, который затем повторяется size раз. Фрагмент 3 также представляет собой последовательный перебор всех элементов матрицы, который выполняется только один раз.&lt;br /&gt;
&lt;br /&gt;
Самой высокой локальностью обладает фрагмент 1 из-за повторяющихся подряд обращений к одним и тем же элементам. Однако фрагмент 2 также обладает высокой как пространственной, так и временной локальностью, поскольку число повторных проходов достаточно велико. Фрагмент 3, как и остальные, характеризуется высокой пространственной локальностью (из-за последовательного перебора), однако очень низкой временной локальностью – повторные обращения в нем просто отсутствуют.&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
Основной фрагмент реализации, на основе которого были получены количественные оценки, приведен [http://git.algowiki-project.org/Voevodin/locality/blob/master/benchmarks/d_matrix_vect_mult/d_matrix_vect_mult.h здесь] (функция Kernel). Условия запуска описаны [http://git.algowiki-project.org/Voevodin/locality/blob/master/README.md здесь].&lt;br /&gt;
&lt;br /&gt;
Первая оценка выполняется на основе характеристики daps, которая оценивает число выполненных обращений (чтений и записей) в память в секунду. Данная характеристика является аналогом оценки flops применительно к работе с памятью и является в большей степени оценкой производительности взаимодействия с памятью, чем оценкой локальности. Однако она служит хорошим источником информации, в том числе для сравнения с результатами по следующей характеристике cvg.&lt;br /&gt;
&lt;br /&gt;
На рис.3 приведены значения daps для реализаций распространенных алгоритмов, отсортированные по возрастанию (чем больше daps, тем в общем случае выше производительность). Можно увидеть, что производительность данной программы очень высока, даже немного выше, чем производительность теста Linpack. Одна из основных причин этому – очень высокая локальность обращений к векторам.&lt;br /&gt;
&lt;br /&gt;
[[file:mv mult daps ru.PNG|thumb|center|700px|Рисунок 3. Сравнение значений оценки daps]]&lt;br /&gt;
&lt;br /&gt;
Вторая характеристика – cvg – предназначена для получения более машинно-независимой оценки локальности. Она определяет, насколько часто в программе необходимо подтягивать данные в кэш-память. Соответственно, чем меньше значение cvg, тем реже это нужно делать, тем лучше локальность. &lt;br /&gt;
&lt;br /&gt;
На рис.4 приведены значения cvg для того же набора реализаций, отсортированные по убыванию (чем меньше cvg, тем в общем случае выше локальность). Можно увидеть, что, согласно данной оценке, локальность реализации умножения матрицы на вектор высока, хотя и не среди первых значений. Однако можно заметить, что полученное значение лишь совсем немного ниже оценки cvg для, например, реализации метода Гаусса или лучших вариантов перемножения матрицы. &lt;br /&gt;
&lt;br /&gt;
[[file:mv mult cvg.PNG|thumb|center|700px|Рисунок 4. Сравнение значений оценки cvg]]&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
[[file:Масштабируемость перемножения матрицы и вектора производительность.png|thumb|center|700px|Рисунок 5. Параллельная реализация произведения матрицы на вектор Максимальная производительность. ]]&lt;br /&gt;
[[file:Масштабируемость перемножения матрицы и вектора эффективность.png|thumb|center|700px|Рисунок 6. Параллельная реализация произведения матрицы на вектор Максимальная эффективность. ]]&lt;br /&gt;
Набор изменяемых параметров запуска реализации алгоритма и границы значений параметров алгоритма: &lt;br /&gt;
*	число процессоров [4 : 256]&lt;br /&gt;
*	размерность матрицы [1024 : 51200]&lt;br /&gt;
Эффективность выполнения реализации алгоритма&lt;br /&gt;
*	Минимальная эффективность 0,02%&lt;br /&gt;
*	Максимальная эффективность 9,55%&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
*	По числу процессов: -0.01517 – при увеличении числа процессов эффективность убывает достаточно интенсивно на всей рассмотренной области изменений параметров запуска. Уменьшение эффективности на рассмотренной области работы параллельной программы звязано с увеличением числа пересылок с ростом числа процессов и как следствие ростом накладных расходов на организацию вычислений. Основной вклад в значение эффективности вносит область с малым числом процессов и малой задачей, там эффективность достигает максимума в 9,5%. Далее эффективность очень резко падает до уровня около 1% Присутствует область, на которой при увеличении числа процессов эффективность возрастает, но при дальнейшем росте продолжает снижаться. Это скорее всего объясняется декомпозицей данных, при которой наступает момент, когда размер матрицы позволяет блокам укладываться в КЭШ-память. Так же это подтверждает проявление этого явления, но со смещением по числу процессов, и при увеличении вычислительной сложности задачи.&lt;br /&gt;
*	По размеру задачи: -0.0014 – при увеличении размера задачи эффективность в целом уменьшается по рассматриваемой области, хотя и менее интенсивно, чем при увеличении числа процессов. Снижение эффективности объясняется тем, что при росте вычислительной сложности существенно возрастают объемы передаваемых данных. При увеличении размера данных наступает момент резкого снижения эффективности с значений около 1% к долям процента и минимуму. С увеличением числа процессоров такой переход появляется на большем объеме данных. Это свидетельствует о том, что присутствует момент, когда данных слишком много и эффективность работы с ними становится значительно ниже, но чем больше имеется процессов, там позже наступает такой момент декомпозиции. Присутствует область возрастания эффективности, на всех рассмотренных размерах матрицы. Это объясняется тем, что при малом размере задачи данные хорошо укладываются в КЭШ память, что приводит к высокой эффективности работы приложения при малом размере задачи. При дальнейшем увеличении размера эффективность уменьшается при выходе за границы КЭШ-памяти. &lt;br /&gt;
*	По двум направлениям: -0.0001546 – при рассмотрении увеличения, как вычислительной сложности, так и числа процессов по всей рассмотренной области значений уменьшается, интенсивность уменьшения эффективности не очень высока. В совокупности с тем фактом, что разница между максимальной и минимальной эффективностью на рассмотренной области значений параметров составляет около 9% говорит о том, что уменьшение эффективности по всей области довольно равномерное, но интенсивно лишь в не очень больших участках по площади. На остальной области значений параметров изменения эффективности не столь значительны и находятся на приблизительно одном и том же уровне.&lt;br /&gt;
&lt;br /&gt;
[http://git.algowiki-project.org/Teplov/Scalability/blob/master/matrix_vector_mult/mpi_mat_vect_time.c Реализация алгоритма на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Demiandr&amp;diff=28632</id>
		<title>Участник:Demiandr</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Demiandr&amp;diff=28632"/>
		<updated>2021-11-04T08:53:17Z</updated>

		<summary type="html">&lt;p&gt;Demiandr: Новая страница: «{{level-a}}   == Свойства и структура алгоритма ==  === Общее описание алгоритма === Дифференциальн...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Дифференциальный криптоанализ — метод криптоанализа симметричных блочных шифров (и других криптографических примитивов, в частности, хеш-функций и поточных шифров).&lt;br /&gt;
Дифференциальный криптоанализ основан на изучении преобразования разностей между шифруемыми значениями на различных раундах шифрования. В качестве разности, как правило, применяется операция побитового суммирования по модулю 2, хотя существуют атаки и с вычислением разности по модулю {\displaystyle 2^{32}}2^{32}. Является статистической атакой. Применим для взлома DES, FEAL и некоторых других шифров, как правило, разработанных ранее начала 90-х. Количество раундов современных шифров (AES, Camellia и др.) рассчитывалось с учётом обеспечения стойкости, в том числе и к дифференциальному криптоанализу.&lt;br /&gt;
Все существующие блочные алгоритмы шифрования являются итеративными алгоритмами, то есть при шифровании информация подвергается большому числу одних и тех же подряд идущих преобразований (раундов). В начале алгоритма шифрования из одного длинного секретного ключа при помощи алгоритма генерации раундовых ключей создаются мини-ключи, которые применяются на каждом раунде шифрования. Дифференциальный криптоанализ направлен на нахождение таких раундовых ключей, для последующего определения по ним основного секретного ключа криптосистемы, причем первым определяемым раундовым ключом является ключ последнего раунда шифрования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;ΔX=({ΔX_1}{ΔX_2}{ΔX_3}...{ΔX_3})&amp;lt;/math&amp;gt;&lt;br /&gt;
Задачей криптоаналитика является нахождение &lt;br /&gt;
Пусть &amp;lt;math&amp;gt;{p}&amp;lt;/math&amp;gt; - вероя&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядром алгоритма является генерация и шифрование большого числа входных пар текстов алгоритма шифрования с заданной разницей &amp;lt;math&amp;gt;ΔX&amp;lt;/math&amp;gt;, получая в итоге пары шифртекстов. После генерации текстов для каждой комбинации пары шифр и возможного значения бит раундового ключа последнего раунда найденной характеристики, происходит частичное расшифрование шифртекстов. Если разница между парами текстов &amp;lt;math&amp;gt;ΔY_{R-1}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;{R-1}&amp;lt;/math&amp;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;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; по возрастанию выполняются&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_{i} = \sum_{j = 1}^{n} a_{ij} x_{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Особо отметим, что вычисления сумм вида &amp;lt;math&amp;gt;\sum_{j = 1}^{n} a_{ij} x_{j}&amp;lt;/math&amp;gt; производят в режиме накопления прибавлением к текущему (временному) значению вычисляемой компоненты вектора &amp;lt;math&amp;gt;y_{i}&amp;lt;/math&amp;gt; произведений &amp;lt;math&amp;gt;a_{ij} x_{j}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, &#039;&#039;&#039;c возрастанием&#039;&#039;&#039; &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, вначале все компоненты инициализируются нулями. При суммировании &amp;quot;по убыванию&amp;quot; общая схема принципиально не отличается и потому нами не рассматривается. Другие порядки выполнения суммирования приводят к изменению параллельных свойств алгоритма и будут рассматриваться нами в отдельных описаниях.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Cчитая базовой операцией операцию шифрования текста на одном раунде с использование дифференциальной характеристики с вероятностью &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, на нахождение &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; бит раундового ключа &amp;lt;math&amp;gt;R-1&amp;lt;/math&amp;gt; раунда шифрования потребуется около &amp;lt;math&amp;gt;(2*с/p)*(R+2^b)&amp;lt;/math&amp;gt; операций шифрования.&lt;br /&gt;
При классификации по последовательной сложности, таким образом, алгоритм умножения матрицы на вектор относится к алгоритмам &#039;&#039;с квадратической сложностью&#039;&#039; (в случае неквадратной матрицы - с &#039;&#039;билинейной&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем [[глоссарий#Граф алгоритма|граф алгоритма]] как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
[[Файл:YeqAX.png|500px|thumb|center|Рисунок 1. Граф последовательного умножения плотной матрицы на вектор с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма умножения плотной матрицы на вектор состоит из одной группы вершин, расположенной в целочисленных узлах двумерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a+bc&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
* &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, принимая все целочисленные значения;&lt;br /&gt;
* &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; — меняется в диапазоне от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
*&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;j = 1&amp;lt;/math&amp;gt; константа &amp;lt;math&amp;gt;0.&amp;lt;/math&amp;gt;; &lt;br /&gt;
** при &amp;lt;math&amp;gt;j &amp;gt; 1&amp;lt;/math&amp;gt; — результат срабатывания операции, соответствующей вершине с координатами &amp;lt;math&amp;gt;i, j-1&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — элемент &#039;&#039;входных данных&#039;&#039;, а именно  &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*&amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; - элемент входных данных &amp;lt;math&amp;gt;x_{j}&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
Результат срабатывания операции является:&lt;br /&gt;
* при &amp;lt;math&amp;gt;j &amp;lt; n&amp;lt;/math&amp;gt; - &#039;&#039;промежуточным данным&#039;&#039; алгоритма;&lt;br /&gt;
* при &amp;lt;math&amp;gt;j = n&amp;lt;/math&amp;gt; - выходным данным.&lt;br /&gt;
&lt;br /&gt;
Описанный граф можно посмотреть на рисунке, выполненном для случая &amp;lt;math&amp;gt;m = 4, n = 5&amp;lt;/math&amp;gt;. Здесь вершины обозначены голубым цветом. Изображена подача только входных данных из вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, подача элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, идущая во все вершины, на рисунке не представлена.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для алгоритма умножения квадратной матрицы на вектор порядка n в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
Для умножения матрицы размером &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; строк на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; столбцов на вектор порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном (наиболее быстром) варианте требуется:&lt;br /&gt;
 &lt;br /&gt;
* по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений (в каждом из ярусов — &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; операций).&lt;br /&gt;
&lt;br /&gt;
При этом использование режима накопления требует совершения умножений и сложений в режиме двойной точности, а в параллельном варианте это означает, что практически все промежуточные вычисления для выполнения алгоритма в режиме накопления должны быть двойной точности. В отличие от последовательного варианта это означает некоторое увеличение требуемой памяти.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, таким образом, алгоритм умножения матрицы на вектор относится к алгоритмам &#039;&#039;с линейной сложностью&#039;&#039;. При классификации по ширине ЯПФ его сложность также будет &#039;&#039;линейной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;x_{i}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;mn+n&amp;lt;/math&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: вектор &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;y_{i}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является &#039;&#039;линейным&#039;&#039; (отношение квадратической или билинейной к линейной). &lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма умножения матрицы на вектор, как отношение числа операций к суммарному объему входных и выходных данных – всего лишь &#039;&#039;константа&#039;&#039;.&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;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
	DO  I = 1, M&lt;br /&gt;
		S = 0.&lt;br /&gt;
		DO  J = 1, N&lt;br /&gt;
			S = S + DPROD(A(I,J), X(J))&lt;br /&gt;
		END DO	&lt;br /&gt;
	        Y(I) = S&lt;br /&gt;
	END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
При этом для реализации режима накопления переменная &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; должна быть двойной точности.&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
[[file:mv mult 1.PNG|thumb|center|700px|Рисунок 2. Умножение плотной матрицы на вектор. Общий профиль обращений в память]]&lt;br /&gt;
&lt;br /&gt;
На рис.2 представлен профиль обращений в память для реализации умножения плотной матрицы на вектор. В данном алгоритме задействовано три массива. Выделенный зеленым фрагмент 1 образован обращениями к результирующему вектору; фрагмент 2 – обращениями к исходному вектору; остальные обращения (фрагмент 3) выполняются к матрице, на которую умножается исходный вектор.&lt;br /&gt;
&lt;br /&gt;
Если посмотреть на исходный код, становится понятным, что каждый фрагмент устроен очень просто:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
for(int i = 0; i &amp;lt; size; i++)&lt;br /&gt;
for(int j = 0; j &amp;lt; size; j++)&lt;br /&gt;
vec_out[i] += matrix[i][j] * vec_in[j];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Видно, что фрагмент 1 (обращения к массиву vec_out) состоит из последовательного перебора всех элементов вектора, только к каждому элементу происходит подряд size обращений. Во фрагменте 2 (массив vec_in) выполняется обычный последовательный перебор, который затем повторяется size раз. Фрагмент 3 также представляет собой последовательный перебор всех элементов матрицы, который выполняется только один раз.&lt;br /&gt;
&lt;br /&gt;
Самой высокой локальностью обладает фрагмент 1 из-за повторяющихся подряд обращений к одним и тем же элементам. Однако фрагмент 2 также обладает высокой как пространственной, так и временной локальностью, поскольку число повторных проходов достаточно велико. Фрагмент 3, как и остальные, характеризуется высокой пространственной локальностью (из-за последовательного перебора), однако очень низкой временной локальностью – повторные обращения в нем просто отсутствуют.&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
Основной фрагмент реализации, на основе которого были получены количественные оценки, приведен [http://git.algowiki-project.org/Voevodin/locality/blob/master/benchmarks/d_matrix_vect_mult/d_matrix_vect_mult.h здесь] (функция Kernel). Условия запуска описаны [http://git.algowiki-project.org/Voevodin/locality/blob/master/README.md здесь].&lt;br /&gt;
&lt;br /&gt;
Первая оценка выполняется на основе характеристики daps, которая оценивает число выполненных обращений (чтений и записей) в память в секунду. Данная характеристика является аналогом оценки flops применительно к работе с памятью и является в большей степени оценкой производительности взаимодействия с памятью, чем оценкой локальности. Однако она служит хорошим источником информации, в том числе для сравнения с результатами по следующей характеристике cvg.&lt;br /&gt;
&lt;br /&gt;
На рис.3 приведены значения daps для реализаций распространенных алгоритмов, отсортированные по возрастанию (чем больше daps, тем в общем случае выше производительность). Можно увидеть, что производительность данной программы очень высока, даже немного выше, чем производительность теста Linpack. Одна из основных причин этому – очень высокая локальность обращений к векторам.&lt;br /&gt;
&lt;br /&gt;
[[file:mv mult daps ru.PNG|thumb|center|700px|Рисунок 3. Сравнение значений оценки daps]]&lt;br /&gt;
&lt;br /&gt;
Вторая характеристика – cvg – предназначена для получения более машинно-независимой оценки локальности. Она определяет, насколько часто в программе необходимо подтягивать данные в кэш-память. Соответственно, чем меньше значение cvg, тем реже это нужно делать, тем лучше локальность. &lt;br /&gt;
&lt;br /&gt;
На рис.4 приведены значения cvg для того же набора реализаций, отсортированные по убыванию (чем меньше cvg, тем в общем случае выше локальность). Можно увидеть, что, согласно данной оценке, локальность реализации умножения матрицы на вектор высока, хотя и не среди первых значений. Однако можно заметить, что полученное значение лишь совсем немного ниже оценки cvg для, например, реализации метода Гаусса или лучших вариантов перемножения матрицы. &lt;br /&gt;
&lt;br /&gt;
[[file:mv mult cvg.PNG|thumb|center|700px|Рисунок 4. Сравнение значений оценки cvg]]&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
[[file:Масштабируемость перемножения матрицы и вектора производительность.png|thumb|center|700px|Рисунок 5. Параллельная реализация произведения матрицы на вектор Максимальная производительность. ]]&lt;br /&gt;
[[file:Масштабируемость перемножения матрицы и вектора эффективность.png|thumb|center|700px|Рисунок 6. Параллельная реализация произведения матрицы на вектор Максимальная эффективность. ]]&lt;br /&gt;
Набор изменяемых параметров запуска реализации алгоритма и границы значений параметров алгоритма: &lt;br /&gt;
*	число процессоров [4 : 256]&lt;br /&gt;
*	размерность матрицы [1024 : 51200]&lt;br /&gt;
Эффективность выполнения реализации алгоритма&lt;br /&gt;
*	Минимальная эффективность 0,02%&lt;br /&gt;
*	Максимальная эффективность 9,55%&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
*	По числу процессов: -0.01517 – при увеличении числа процессов эффективность убывает достаточно интенсивно на всей рассмотренной области изменений параметров запуска. Уменьшение эффективности на рассмотренной области работы параллельной программы звязано с увеличением числа пересылок с ростом числа процессов и как следствие ростом накладных расходов на организацию вычислений. Основной вклад в значение эффективности вносит область с малым числом процессов и малой задачей, там эффективность достигает максимума в 9,5%. Далее эффективность очень резко падает до уровня около 1% Присутствует область, на которой при увеличении числа процессов эффективность возрастает, но при дальнейшем росте продолжает снижаться. Это скорее всего объясняется декомпозицей данных, при которой наступает момент, когда размер матрицы позволяет блокам укладываться в КЭШ-память. Так же это подтверждает проявление этого явления, но со смещением по числу процессов, и при увеличении вычислительной сложности задачи.&lt;br /&gt;
*	По размеру задачи: -0.0014 – при увеличении размера задачи эффективность в целом уменьшается по рассматриваемой области, хотя и менее интенсивно, чем при увеличении числа процессов. Снижение эффективности объясняется тем, что при росте вычислительной сложности существенно возрастают объемы передаваемых данных. При увеличении размера данных наступает момент резкого снижения эффективности с значений около 1% к долям процента и минимуму. С увеличением числа процессоров такой переход появляется на большем объеме данных. Это свидетельствует о том, что присутствует момент, когда данных слишком много и эффективность работы с ними становится значительно ниже, но чем больше имеется процессов, там позже наступает такой момент декомпозиции. Присутствует область возрастания эффективности, на всех рассмотренных размерах матрицы. Это объясняется тем, что при малом размере задачи данные хорошо укладываются в КЭШ память, что приводит к высокой эффективности работы приложения при малом размере задачи. При дальнейшем увеличении размера эффективность уменьшается при выходе за границы КЭШ-памяти. &lt;br /&gt;
*	По двум направлениям: -0.0001546 – при рассмотрении увеличения, как вычислительной сложности, так и числа процессов по всей рассмотренной области значений уменьшается, интенсивность уменьшения эффективности не очень высока. В совокупности с тем фактом, что разница между максимальной и минимальной эффективностью на рассмотренной области значений параметров составляет около 9% говорит о том, что уменьшение эффективности по всей области довольно равномерное, но интенсивно лишь в не очень больших участках по площади. На остальной области значений параметров изменения эффективности не столь значительны и находятся на приблизительно одном и том же уровне.&lt;br /&gt;
&lt;br /&gt;
[http://git.algowiki-project.org/Teplov/Scalability/blob/master/matrix_vector_mult/mpi_mat_vect_time.c Реализация алгоритма на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
[[Категория:Матрично-векторные операции]]&lt;br /&gt;
&lt;br /&gt;
[[En:Dense matrix-vector multiplication]]&lt;/div&gt;</summary>
		<author><name>Demiandr</name></author>
	</entry>
</feed>