Алгоритм обмена секретным ключом Диффи-Хеллмана
Министерство образования Республики БеларусьУчреждение образования
Могилёвский
государственный университет
Физико-математический факультет
Кафедра информатики
КУРСОВОЙ ПРОЕКТ
Алгоритм обмена секретным ключом Диффи-Хеллмана
Выполнил:
Студент
Физико-математического факультета
3курса группы “В-Г”
Рудницкий Сергей Вячеславович
Научный руководитель:
Старший преподаватель
Каменская
Наталья Евгеньевна
Оглавление
ВВЕДЕНИЕ 3
1. ТЕОРЕТИЧЕСКИЕ ОСНОВЫ 4
1.1. История создателей алгоритма 4
1.2. Описание алгоритма 6
1.3. Блок-Схема 8
2. ПРАКТИЧЕСКАЯ РЕАЛИЗАЦИЯ АЛГОРИТМА 9
2.1. Вычисление компонент ключа 9
3. КРИПТОСТОЙКОСТЬ АЛГОРИТМА 10
3.1. Решение проблемы “человек посередине” с помощью ЭЦП 11
3.2. Решение проблемы “человек посередине” протоколом MQV 12
ЗАКЛЮЧЕНИЕ 15
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 16
ПРИЛОЖЕНИЕ 17
ВВЕДЕНИЕ
Криптография — это наука об обеспечении безопасности данных. Она занимается поисками решений четырех важных проблем безопасности - конфиденциальности, аутентификации, целостности и контроля участников взаимодействия. Шифрование - это преобразование данных в нечитабельную форму, используя ключи шифрования-расшифровки. Шифрование позволяет обеспечить конфиденциальность, сохраняя информацию в тайне от того, кому она не предназначена.
Криптосистема работает по определенной методологии (процедуре). Она состоит из : одного или более алгоритмов шифрования (математических формул); ключей, используемых этими алгоритмами шифрования; системы управления ключами; незашифрованного текста; и зашифрованного текста (шифртекста).
Согласно методологии сначала к тексту применяются алгоритм шифрования и ключ для получения из него шифртекста. Затем шифртекст передается к месту назначения, где тот же самый алгоритм используется для его расшифровки, чтобы получить снова текст. Также в методологию входят процедуры создания ключей и их передачи (не показанные на рисунке).
Проблема передачи ключа
по открытым каналам была большой
проблемой криптографии прошлого века.
Но эту проблему удалось решить после
появления алгоритма Диффи-
ТЕОРЕТИЧЕСКИЕ ОСНОВЫ
История создателей алгоритма
В 1970 году Мартин Хеллман, молодой профессор, занимавшийся вопросами проектирования электрических систем в Стенфордском университете в Пало-Альто (шт. Калифорния), увлекся проблемой передачи ключа в 1968 году, когда работал в IBM в Пенсильвании.
Хеллман рассказывает, что он прозрел после того, как прочитал статьи Клода Шенона по теории информации и криптографии, которые опубликовались в 1948 и 1949 годах.
«До этого я и представить себе не мог, насколько тесно связано шифрование и теория информации», -говорит он.В статьях Шенона вопросы кодирования рассматривались в связи с задачей снижения электростатических помех, мешающих передаче радиосигналов.
«Шифрование, - заметил Хеллман , - решает диаметрально противоположную задачу. Вы вносите искажения при помощи ключа. Для того, кто слышит сигнал и не знает ключа, он будет выглядеть максимально искаженным. Но легитимный получатель, которому известен секретный ключ, может удалить эти помехи».
Хеллман искал пути для решения проблемы, в то время как некий студент из MIT по имени Уайтфилд Диффи заинтересовался тем же самым. Но поиски Диффи начались значительно раньше.
«Я увлекся шифрованием, когда мне было всего десять лет, - вспоминает он. - У меня был учитель, который посвящал проблеме шифрования буквально целые дни. Я шел домой, а там меня ждали книги по этому предмету. Отец приносил мне их из библиотеки колледжа».
К 1973 году Диффи стал лаборантом
и раздражал профессоров
А в это самое время Ральф Меркл, студент Университета Беркли (шт. Калифорния), занимающийся исключительно проектированием электрических систем, бродил по университетскому городку, снедаемый мыслями о шифровании.
«Я думал о том, как
Пытаясь объединить разрозненные идеи по шифрованию данных, Хеллман продолжал искать единомышленников. Однако получилось наоборот: в сентябре 1973 года его нашел Диффи. Их получасовая встреча плавно перешла в обед у Хеллмана, причем разговоры затянулись далеко за полночь.
Хеллман и Диффи начали работать
над созданием алгоритма
Хеллман и Диффи сообщили, что их первая статья по теории цифровых подписей вышла в декабре 1975 года. Представлена она была полгода спустя на Национальной компьютерной конференции в Нью-Йорке.
Оставаясь невидимым для конечных
пользователей, открытый ключ использует
открытый и секретный ключи для
После Беркли в 1975 году Меркл сформулировал задачу защиты коммуникаций, несвязанную с подписью и сертификатом. Он взялся за решение проблемы распространения открытого ключа, исходя из предпосылки применения смешения случайных чисел. Прочитав статью Хеллмана-Диффи, Меркл встретился с первым, который уговорил Меркла перенести свою аспирантскую работу в Стенфорд.
1976 г. Мерклу удалось при помощи Хеллмана и Диффи справиться с задачей распространения открытого ключа и развить аппарат цифровой подписи. Они создали и запатентовали систему, получившую имя Диффи-Хеллмана. Открытие обеспечило этому трио внимание со стороны средств массовой информации.
Но внимание это улетучилось так же быстро, как и возникло. Изобретатели опередили свое время:
Задача, решение которой они
Описание алгоритма
Существуют два абонента: Алиса и Боб. Обоим абонентам известны некоторые два числа g и p, которые не являются секретными и могут быть известны также другим заинтересованным лицам. Для того, чтобы создать неизвестный более никому секретный ключ, оба абонента генерируют большие случайные числа: Алиса — число a, Боб— число b. Затем Алиса вычисляет значение
A = gamod p (1)
и пересылает его Бобу , а Боб вычисляет
B = gbmod p (2)
и передаёт Алисе. Предполагается, что злоумышленник может получить оба этих значения, но не модифицировать их (то есть у него нет возможности вмешаться в процесс передачи). На втором этапе первый абонент на основе имеющегося у него a и полученного по сети B вычисляет значение Bamod p = gabmod p (3), а второй абонент на основе имеющегося у него b и полученного по сети A вычисляет значение Abmod p =gabmod p (4). Как нетрудно видеть, у Алисы и Боба получилось одно и то же число: K = gabmod p (5). Его они и могут использовать в качестве секретного ключа, поскольку здесь злоумышленник встретится с практически неразрешимой (за разумное время) проблемой вычисления (3) или (4) по перехваченным gamod p и gbmod p, если числа p,a,b выбраны достаточно большими. Наглядная работа алгоритма показана на рис.1.
Рис.1 Алгоритм Диффи — Хеллмана, где K — итоговый общий секретный ключ
При работе алгоритма, каждая сторона:
- генерирует случайное натуральное число a/b — закрытый ключ
- совместно с удалённой стороной устанавливает открытые параметры p и g (обычно значения p и g генерируются на одной стороне и передаются другой), где
p является случайным простым числом
g является первообразным корнем по модулю p
- вычисляет открытый ключ A/B, используя преобразование над закрытым ключом
A = ga mod p/ B=gbmod p
- обменивается открытыми ключами с удалённой стороной
- вычисляет общий секретный ключ K, используя открытый ключ удаленной стороны B/ A и свой закрытый ключ a/b
K = Ba mod p/ K=Abmod p
К получается равным с обоих сторон, потому что:
Ba mod p = (gb mod p)a mod p = gab mod p = (ga mod p)b mod p = Ab mod p
В практических реализациях, для a и b используются числа порядка 10100 и p порядка 10300. Число g не обязано быть большим и обычно имеет значение в пределах первого десятка.
Блок-Схема
- Генерируются два числа p и g;
- Первая сторона генерирует случайное число a, вторая – b;
- Каждая сторона генерирует открытый ключ A и B соответственно;
- Стороны обмениваются ключами;
- Благодаря полученным ключам стороны получают секретный ключ, который и используют в дальнейшем.
ПРАКТИЧЕСКАЯ РЕАЛИЗАЦИЯ АЛГОРИТМА
Демонстрационная программа, созданная с помощью Borland C++ Builder 6, позволяет наглядно продемонстрировать алгоритм обмена ключами Диффи – Хеллмана. Так же, для работы с большими числами была использована библиотека NTL.
Вычисление компонент ключа
Большую сложность представляет собой задача проверки большого числа на простоту.Определение простоты заданного числа в общем случае не такая уж тривиальная задача. Только в 2002 году было доказано, что она полиномиально разрешима за.
Различают детерминированные и вероятностные тесты.
Детерминированный алгоритм — алгоритмический процесс, который выдаёт уникальный и предопределённый результат для заданных входных данных.
Вероятностный алгоритм – алгоритмический процесс, который быстро (за полиномиальное время) вычислим и дающий ответ с высокой вероятностью (причём, жертвуя временем, можно добиться сколь угодно высокой точности ответа).
Воспользуемся вероятностным полиномиальным тестом простоты Миллера — Рабина, основанный на наблюдении. Тест Миллера — Рабина позволяет эффективно определять, является ли данное число составным. Однако, с его помощью нельзя строго доказать простоту числа.
Для того, что бы значительно ускорить проверку числа на простоту, перед вызовом теста Миллера-Рабина, разделим проверяемое число по порядку на простые числа до 256 .Это исключает все четные числа и 80% нечетных чисел.
Таким образом, чтобы выбрать случайное большое простое число нужно сгенерировать любое случайное число из задаваемого отрезка и проверить его на простоту.
Рассмотрим теперь генерацию числа g, которое должно являтся первообразным корнем по модулю p.
Первообразным корнем по модулю p называется такое число g, что все его степени по модулю p пробегают по всем числам, взаимно простым с p.
В частности, для случая простого p степени первообразного корня пробегают по всем числам от до p-1.
Таким образом, алгоритм нахождения первообразного корня такой. Находим значение функции Эйлера в p, факторизуем его. Теперь перебираем все числа g=1…p , и для каждого считаем все величины . Если для текущего g все эти числа оказались отличными от , то это g и является искомым первообразным корнем.
Про скорость роста первообразных корней с ростом p известны лишь приблизительные оценки. Известно, что первообразные корни — сравнительно небольшие величины. Одна из известных оценок — оценка Шупа (Shoup), что, в предположении истинности гипотезы Римана, первообразный корень есть .
КРИПТОСТОЙКОСТЬ АЛГОРИТМА
Криптографическая стойкость алгоритма Диффи — Хеллмана (то есть сложность вычисления K=gab mod p по известным p, g, A=ga mod p и B=gb modp), основана на предполагаемой сложности проблемы дискретного логарифмирования.
Протокол Диффи-Хеллмана отлично противостоит пассивному нападению, но в случае реализации атаки «человек посередине» он не устоит. В самом деле, в протоколе ни Алиса, ни Боб не могут достоверно определить, кем является их собеседник, поэтому вполне возможно представить следующую ситуацию, при которой Боб и Алиса установили связь с Меллори, который Алисе выдает себя за Боба, а Бобу представляется Алисой. И тогда вместо протокола Диффи-Хеллмана получаем, что-то похожее на следующее:
То есть, Меллори получает один ключ общий с Алисой (которая считает, что это Боб), и один ключ общий с Бобом(который считает, что это Алиса). А, следовательно, он может получать от Алисы любое сообщение для Боба расшифровать его ключом , прочитать, зашифровать ключом и передать Бобу. Таким образом, подлог может оставаться незамеченным очень долгое время.
Решение проблемы “человек посередине” с помощью ЭЦП
Для борьбы с уязвимостью
“человека посередине” нужна
взаимная аутентификация. И тут на
помощь приходит ЭЦП.
Если у Боба имеется открытый ключ Алисы,
и он уверен на сто процентов, что это действительно
ключ Алисы, то тогда для защиты от атаки
«человек посередине» Алисе достаточно
подписать своим закрытым ключом число
на шаге 1. Теперь Меллори может сколько
угодно пытаться выдать себя за Алису,
но подделать ее подпись он не сможет,
а Боба сразу начнут терзать «смутные
сомненья».
Казалось бы решение найдено, протокол
доработан, уязвимость устранена. Но…
Как всегда есть одно но. И в данном
случае в роли такового выступает
чрезмерное увеличение размера сообщений
за счет добавления подписи. Наглядно
этот эффект демонстрирует следующая
таблица:
Как видно из этой таблицы размер сообщений увеличивается в разы. Для решение этой новой проблемы был придуман протокол MQV, избавляющий Диффи-Хеллман от уязвимости и при этом не использующий ЭЦП.
Решение проблемы “человек посередине” протоколом MQV
Итак, протокол MQV – протокол распределения ключей, поддерживающий взаимную аутентификацию сторон и тем самым устраняющий уязвимость к атаке «человек посередине», присущей классическому Диффи-Хеллману. Помимо прочего, для аутентификации пользователей не используется никакая вспомогательная информация, наподобие ЭЦП, что позволяет существенно сократить размер передаваемых сообщений.
Теперь
о самом протоколе.
Алиса и Боб имеют каждый свою ключевую
пару, состоящие из открытых и закрытых
ключей:
и
. Разумеется, Бобу известен открытый ключ
Алисы, а той в свою очередь известен открытый
ключ Боба.
Далее, Алиса и Боб генерируют сеансовую
пару ключей:
и
.
Затем происходит обмен как в классическом
протоколе Диффи-Хеллмана:
Алиса к Бобу:
Боб к Алисе:
Теперь Алиса знает: A, B, C, D, a,
.
А Бобу известны: A, B, C, D, b,
.
Чтобы получить общий ключ K они должны
проделать следующие операции.
Алиса:
Выбирает число l, равное размеру
сообщения в битах деленному на 2. Так если
используется EC-MQV и длина сообщения равна
160 бит, то l=80.
1. Задает
2. Находит
3. Задает
4. Вычисляет
5. Находит
6. Вычисляет
Боб проделывает те же действия, но со
своими закрытыми ключами:
1. Задает
2. Находит
3. Задает
4. Вычисляет
5. Находит
6. Вычисляет
Получившиеся в результате вычислений
числа
и есть общий секретный ключ. Убедимся
в этом:
, т.к.
и
;
, т.к.
;
, т.к.
и
;
, т.к.
;
.
Обратите внимание, что в преобразованиях
используются секретные ключи как Алисы,
так и Боба. Т.е. любой пользователь протокола
может быть уверен, что кроме того человека,
с которым он хочет установить соединение,
получить общий ключ не удастся никому.
Несмотря на кажущуюся сложность,
в скорости протокол MQV ничего не теряет
по сравнению со схемой использующей ЭЦП,
ведь и там и там используется одна и та
же операция возведения в степень по модулю
простого числа. Выгода же от использования
протокола заключается в следующем. Это,
во-первых, устойчивость к атаке «человек
посередине», во-вторых, небольшой размер
сообщений, а, в-третьих, удобная реализация
протокола, избавляющая пользователя
от необходимости подписывать каждое
отправляемое сообщение.
ЗАКЛЮЧЕНИЕ
В ходе курсовой работы был изучен и проанализирован алгоритм обмена ключами Диффи - Хеллмана, были рассмотрены основные недостатки этого алгоритма и предложены варианты защиты от атак “человек посередине”, такие как:
- Электронная цифровая подпись;
- Протокол MQV (Менезес-Кью-Ванстоун);
Сам алгоритм предоставляет лишь возможность безопасного обмена ключом по закрытому каналу, и не является самостоятельной криптосистемой.
Итогом моей работы стало создание демонстрационного приложения, показывающего основные пункты работы рассматриваемого в этом проекте алгоритма.
У программного продукта есть недостатки:
- В программном продукте нереализована полная очистка оперативной памяти.
- Секретные ключи хранятся в открытом виде на диске.
- Возможна модификация ключей.
- Не реализована аппаратная система.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
- Коблиц Н. Курс теории чисел и криптографии – Москва: Научное издательство ТВП, 2001. -254с
- Завгородний В. И. Комплексная защита информации в компьютерных системах – Москва: Логос, 2001 г. -264 с.
- http://e-maxx.ru/algo/
primitive_root (Статья) - http://ru.wikipedia.org/wiki/
Алгоритм_Диффи_—_Хеллмана (Энциклопедия) - http://www.intuit.ru/departmen
t/security/networksec/7/3.html (Лекция) - http://ru.wikipedia.org/wiki/
Тест_Миллера_—_Рабина (Энциклопедия) - http://www.shoup.net/ntl/doc/
ZZ.txt (Описание класса ZZ)
ПРИЛОЖЕНИЕ
{ZZ g; ZZ p;} DH_OpenKey;
/* Закрытый ключ*//* Открытые параметры */
typedef
typedef ZZ DH_PrivateKey;
/* Путь к открытому ключу абонента A и абонента B соответственно */
char A = ”D:\\opka.txt”, B = “D:\\opkb.txt”;
/* Количество бит при генерации чисел: */
long Length = 256;
/* Возведение числа a в степень b по модулю p.
x =a^b (mod p)
Скорость вычисление достигается за счет следующих замен (в
зависимости от четности/
- b четное (b = 2*k):
a^(2*k) (mod p) = (a^2 (mod p))^k
- b нечетное (b = 2*k+1):
a^(2*k+1) (mod p) = (a*b) (mod p)
*/
ZZ PowMod(const ZZ &a, const ZZ &b, const ZZ &p)
{
ZZ x;
x = to_ZZ(1);
for (long BitNum = NumBits(b) - 1; BitNum>= 0; BitNum--)
{
x = (x * x) % p;
if (bit(b, BitNum) == 1) x = (x * a) % p;
}
return x;
}
/*Функция, проверяющая является ли число a свидетелем простоты для
числа p:
1) Представляем p-1 в виде (2^s)*t. t - нечетное
2) x = a^t (mod p)
3) Если x = 1 или x = p - 1, то a - свидетель простоты для числа p.
Завершаем выполнение функции.
4) Повторяем s - 1 раз
5) x = x^2 (mod p)
6) Если x = p - 1, то a - свидетель простоты для числа p. Завершаем
выполнение функции.
7) a - не является свидетелем простоты для числа p.Завершаем
выполнение функции.
*/
bool PrmWtnss(const ZZ &p, const ZZ &a)
{
ZZ t;
T = p - 1, y, x;
longs = 0;
// Разложение p - 1 многократным делением на 2
do
{
t >>= 1;
s++;
}while (bit(t, 0) == 0);
x = PowMod(a, t, p);
if (x == 1 || x == p - 1) return true;
for(long i = 0; i< s - 1; i++)
{
x = (x * x) % p;
if(x == p - 1) return true;
}
Return false;
}
/*
Тест Миллера-Рабина на
1) В дальнейшем будем повторять 31 раз (rounds = 31)
2) Выберем случайное число a в отрезке [2, p − 2]
3) Проверим является ли a свидетелем простоты для числа p.
4) Если все a являются свидетелями простоты, то число p вероятно
простое
*/
bool MillerRabinTest(const ZZ &p, long rounds)
{
ZZ a;
Long i;
for (i = 0; i< rounds; i++)
{
a = RandomBnd(p-3) + 2;
if (PrmWtnss(p, a) == false) return false;
}
Return true;
}
/*Тест числа на простоту делением его на простые числа до 256
Этот тест исключает все четные числа и 80%
нечетных
*/
bool TestDiv(const ZZ &p)
{
unsigned int i, prost[55]={2,3,4,5,7,11,13,
61,67,71,73,79,83,89,97,101,
151,157,163,167,173,179,181,
239,241,251};
for(i = 0; i< 55; i++)
if(p % prost[i] == 0) return p == prost[i];
return true;
}
/*Общий
тест числа на простоту
(тест Миллера-Рабина и тест делением).
*/
bool TestProst(const ZZ &p)
{
return (TestDiv(p) && MillerRabinTest(p, 31));
}
/* Генерация случайного простого числа:
- Генерируем число разрядностью SizeBits
- Делаем его нечетным (т.к. четное неможет быть простым)
- Проверяем его, является ли оно простым. Если число простое, то функция возвращает это число. Если число не является простым, то мы проверяем на простоту последовательно, каждое предыдущее нечетное число, пока не получим простое.
*/
ZZ RandomProst(long SizeBits)
{
ZZ a;
a = RandomLen_ZZ(SizeBits);
SetBit(a, 0);
while(!TestProst(a)) a -= 2;
return a;
}
/* Функция находит первообразный корень по простому модулю p */
ZZ generator (ZZ &p) {
vector<ZZ> fact;
ZZ phi = p-1, n = phi, i, res;
for (i=2; i*i<=n; ++i)
if (n % i == 0) {
fact.push_back (i);
while (n % i == 0)
n /= i;
}
if (n > 1)
fact.push_back (n);
for (res=2; res<=p; ++res) {
bool ok = true;
for (size_t i=0; i<fact.size() && ok; ++i)
ok &= PowMod (res, phi / fact[i], p) != 1;
if (ok) return res;
}
return -1;
}
/* Генерация открытых параметров */
void DH_GenerateParam (DH_OpenKey &OpenKey, long Length)
{ OpenKey.p = RandomProst(Length);
OpenKey.g = generator (OpenKey.p);
}
/* Генерация закрытого ключа */
void DH_GenerateKey (DH_PrivateKey &PrivateKey, long Length)
{
PrivateKey = RandomProst (Length);
}
/* Вычисление открытого ключа: */
ZZ CalculateOpenKey(DH_OpenKey &OpenKey, DH_PrivateKey &PrivateKey)
{
return(PowMod(OpenKey.g, PrivateKey, OpenKey.p);
/* Передача открытых параметров: */
void DH_SendOpPar (DH_OpenKey &OpenKey)
{ ofstream fg (D:\\parg.txt, ios::out),
fp (D:\\parp.txt, ios::out);
fg << OpenKey.g;
fp << OpenKey.p;
}
/* Передача открытого ключа от абонента Person: */
void DH_SendOpKey(DH_OpenKey &OpenKey, DH_PrivateKey &PrivateKey, char Person)
{ ofstream opk (Person, ios::out);
opk << CalculateOpenKey(OpenKey, PrivateKey);
}
/* Получение абонентом открытых параметров: */
DH_OpenKey DH_ReceiveOpPar ()
{ DH_OpenKey OpenKey;
ifstream fg (D:\\parg.txt, ios::in),
fp (D:\\parp.txt,ios::in);
fg >> OpenKey.g;
fp >> OpenKey.p;
return (OpenKey);
}
/* Получение открытого ключа от абонента Person: */
ZZ DH_ReceiveOpKey (char Person)
{ DH_PrivateKey PrivateKey;
ifstream opk (Person,ios::in);
opk >> PrivateKey;
return (PrivateKey);
}
/* Вычисление для абонента A общего ключа K: */
void DH_forA()
{ //Инициализация переменных:
DH_OpenKey par;
DH_PrivateKey a1,K;
char c;
// Генерация переменных:
DH_GenerateParam (par, Length);
DH_GenerateKey (a1, Length/2);
// Передача открытых параметров и открытого ключа абоненту B:
DH_SendOpPar (par);
DH_SendOpKey (par, a1, A);
//Ожидание обработки абонентом B:
scanf(“%c”, &c);
// Вычисление общего ключа K:
K = PowMod (DH_ReceiveOpKey (B), a1, par.p);
}
/* Вычисление для абонента B общего ключа K: */
Void DH_forB()
{ // Инициализация переменных:
DH_OpenKey par2;
DH_PrivateKeay b2, K;
char c2;
// Генерация переменных:
DH_GenerateKey (b1,Length/2);
// Ожидание обработки абонентом A:
scanf (“%c”, &c2);
// Получение открытых параметров от абонента A:
par2 = DH_ReceiveOpPar ();
// Передача открытого ключа
DH_SendOpKey (par2, b2, B);
// Вычисление общего ключа K:
K = PowMod(DH_ReceiveOpKey (A), b2, par2.p);
}
Могилёв, 2012

- Алгоритм обработки данных с помощью метода однофакторного дисперсионного анализа (ANOVA) и критерия Н-Краскала-Уоллеса
- Алгоритм обратного распространения ошибки
- Алгоритм осмотра места происшествия
- Алгоритм планирования потребности в кадрах
- Алгоритм планирования пути на местности
- Алгоритм поиска гамильтонова пути в графе
- Алгоритм поиска кратчайшего пути
- Алгоритмізація та програмування задачі обробки економічної інформації
- Алгоритм кодирования речевых сигналов GSM. Его алгоритм функционирования, параметры, область применения, показатели качества, сравнение с
- Алгоритм Кока-Янгера-Касами
- Алгоритм краскала
- Алгоритм Краскала
- Алгоритм метода простой итерации при решении систем нелинейных уравнений
- Алгоритмнің құрылым негіздері мен қолдану тәсілдері