Реализация криптографического протокола Диффи-Хеллмана обмена ключами с использованием GMP

Как реализовать протокол Диффи-Хеллмана на C с использованием библиотеки GMP

Криптографический протокол Диффи–Хеллмана (Diffie-Hellman Key Exchange) — алгоритм, позволяющий двум сторонам получить общий секретный ключ, используя частично защищенный канал связи. Под частично защищенным понимается канал, данные в котором защищены от модификации, но не от прослушивания (как утверждает Wikipedia, такие условия имеют место довольно часто). В данной статье я приведу реализацию криптографического протокола Диффи-Хеллмана на языке С с использованием [...]

← Вернуться к полной версии записи «Реализация криптографического протокола Диффи-Хеллмана обмена ключами с использованием GMP»…

Автор: ; опубликовано в: C/C++, Безопасность; метки: C/C++, Diffie-Hellman, GMP, алгоритмы, закрытый ключ, обмен ключами, открытый ключ, простые числа, Софи Жермен
15
Апр
2008

RSS Комментарии к статье «Реализация криптографического протокола Диффи-Хеллмана обмена ключами с использованием GMP» (5)  »

  1. Подсмотрено у Mozilla: коррекция для dh_generate_p_g().

    Пусть p — сгенерированное безопасное простое число. Тогда q = (p-1)/2 — число Софи Жермен. Генерируем случайное число g, принадлежащее интервалу [2; p-1].

    [-]
    View Code C
    do {
        if (mpz_cmp_ui(p, 2) < 0 || mpz_cmp(p, g) > 0) {
            mpz_set(g, 2); //Mozilla устанавливает g в 3
        }

        mpz_powm(x, g, q, p);
        if (0 != mpz_cmp_ui(x, 1)) {
            //Мы нашли число g
            break;
        }

        mpz_add_ui(g, g, 1);
    } while(1);

    Я код еще не тестировал, но выглядит он довольно интересно :-)

  2. Обещанная генерация безопасных простых чисел.

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

    Я привожу только базовый код, без всяких лишних проверок.

    [-]
    View Code C
    void generate_prime(size_t size_bytes, mpz_t result)
    {
        mpz_t q;

        mpz_init(q);

        while (1) {
            unsigned char* r = (unsigned char*)generate_key(size_bytes);
            r[size_bytes-1] |= (unsigned char)0x40;
            r[0] |= (unsigned char)1;  /* Если число простое, оно как минимум нечетное */
     
            mpz_import(q, 1, -1, size_bytes, -1, 0, (const void*)r);
            while (0 == mpz_probab_prime_p(q, 10)) {
                mpz_add_ui(q, q, 2);
            }

            //Число q сгенерировано, мы знаем, что оно простое.
            //Теперь нам нужно убедиться, что число 2q+1 тоже является простым
            mpz_mul_ui(result, q, 2);
            mpz_add_ui(result, result, 1);
            if (0 != mpz_probab_prime_p(result, 10)) {
                //2q+1 тоже является простым, следовательно, q - число Софи Жермен,
                //а p - безопасное простое число
                break;
            }
        }
    }
  3. Еще один (дешевый) вариант проверки числа на простоту: использование теста на псевдо-простоту, основанного на малой теореме Ферма:

    [-]
    View Code C
    int fermat_test(mpz_t a, unsigned int w)
    {
        mpz_t base;
        mpz_t test;
        int res;

        mpz_init(base);
        mpz_init(test);
        mpz_set_ui(base, w);

        mpz_powm(test, base, a, a);
        res = (0 == mpz_cmp(base, test)) ? 1 : 0;

        mpz_clear(base);
        mpz_clear(test);

        return res;
    }

    В Mozilla проверяемое число тестируется с двойкой:

    [-]
    View Code C
    if (0 == fermat_test(value_being_tested, 2)) {
    //Составное число
    }
  4. [...] Год назад я писал о простых числах Софи Жермен. [...]

  5. [...] реализации: Реализация криптографического протокола Диффи-Хеллма… Еще одна реализация на [...]

Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.

Оставить комментарий к записи «Реализация криптографического протокола Диффи-Хеллмана обмена ключами с использованием GMP»

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя

गते गते पारगते पारसंगते बोधि स्वाहा