Почему получаются разные ключи в Диффи-Хеллмане? Здравствуйте. Проблема: Пишу чат на сокетах и при создании общего секретного ключа с помощью протокола Диффи-Хеллмана не получается этот самый общий секретный. Функции ниже.Вопрос: как сделать так, чтобы корректно генерировался общий секретный ключ.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. возможно, я где-то ошибся с пониманием протокола и приведённые выше цифры должны быть иными
Проблема здесь заключается в том, что вы используете простейшую реализацию алгоритма Диффи-Хеллмана, которая не учитывает особенности вычислений в конечных полях. Ваш код работает с целыми числами, но протокол Диффи-Хеллмана оперирует с элементами конечного поля.
Для корректной генерации общего секретного ключа вам следует реализовать вычисления в конечном поле. Вот пример исправленного кода на 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 будут равны и представляют собой общий секретный ключ для обеих сторон.
Проблема здесь заключается в том, что вы используете простейшую реализацию алгоритма Диффи-Хеллмана, которая не учитывает особенности вычислений в конечных полях. Ваш код работает с целыми числами, но протокол Диффи-Хеллмана оперирует с элементами конечного поля.
Для корректной генерации общего секретного ключа вам следует реализовать вычисления в конечном поле. Вот пример исправленного кода на 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 будут равны и представляют собой общий секретный ключ для обеих сторон.