Почему получаются разные ключи в Диффи-Хеллмане? Здравствуйте. Проблема: Пишу чат на сокетах и при создании общего секретного ключа с помощью протокола Диффи-Хеллмана не получается этот самый общий секретный. Функции ниже.Вопрос: как сделать так, чтобы корректно генерировался общий секретный ключ.function computePartial(base, module, secret) {
return Math.pow(base, secret) % module;
}
function computeCommon(module, partial, secret) {
return Math.pow(partial, secret) % module;
}
module - простое трёхзначное число(719)
base - трехзначное число(736)
secret - любое двухзначное число
P.S. возможно, я где-то ошибся с пониманием протокола и приведённые выше цифры должны быть иными

4 Окт 2020 в 19:46
181 +1
0
Ответы
1

Проблема здесь заключается в том, что вы используете простейшую реализацию алгоритма Диффи-Хеллмана, которая не учитывает особенности вычислений в конечных полях. Ваш код работает с целыми числами, но протокол Диффи-Хеллмана оперирует с элементами конечного поля.

Для корректной генерации общего секретного ключа вам следует реализовать вычисления в конечном поле. Вот пример исправленного кода на JavaScript:

const module = 719;
const base = 736;
const secretA = 23;
const secretB = 56;
function computePartial(base, module, secret) {
return Math.pow(base, secret) % module;
}
function computeCommon(module, partial, secret) {
return Math.pow(partial, secret) % module;
}
function modPow(base, exp, mod) {
if (exp == 0) return 1;
let result = 1;
base = base % mod;
while (exp > 0) {
if (exp % 2 === 1) {
result = (result * base) % mod;
}
exp = Math.floor(exp / 2);
base = (base * base) % mod
}
return result;
}
const partialA = modPow(base, secretA, module);
const partialB = modPow(base, secretB, module);
const commonSecretA = modPow(partialB, secretA, module);
const commonSecretB = modPow(partialA, secretB, module);
console.log(commonSecretA); // общий секретный ключ для А
console.log(commonSecretB); // общий секретный ключ для B

Вычисления в конечном поле реализованы через функцию modPow, которая вычисляет возведение в степень по модулю. В этом коде commonSecretA и commonSecretB будут равны и представляют собой общий секретный ключ для обеих сторон.

17 Апр в 23:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 648 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир