Продолжаю изучать криптографию, делюсь опытом. Нашел интересную особенность дискретного логарифма, которая превращается в математический бэкдор протокола Диффи — Хеллмана (далее DH).

Пробежимся по теории

Вспомним дискретный логарифм (далее DLOG) https://ru.wikipedia.org/wiki/Дискретное_логарифмирование

Нам нужен вариант DLOG в конечном поле GF(p), где p - простое число https://ru.wikipedia.org/wiki/Конечное_поле

g^x \equiv a \pmod p

Общеизвестно что задача DLOG является односторонней функцией https://ru.wikipedia.org/wiki/Односторонняя_функция т.е. поиск x является трудной задачей.

Кроме полного перебора, существует много алгоритмов решения данной задачи https://ru.wikipedia.org/wiki/Дискретное_логарифмирование#Алгоритмы_решения (не будем их рассматривать).

Иногда поиск x является тривиальной задачей, например:

если a = 1, то x = 0

если a = g, то x = 1

Следует сказать что g является первообразным корнем или примитивом https://ru.wikipedia.org/wiki/Первообразный_корень_(теория_чисел)

Для GF(7) примитив g = 3, проверим:

3^0 \equiv 1 \pmod 7
3^1 \equiv 3 \pmod 7
3^2 \equiv 2 \pmod 7
3^3 \equiv 6 \pmod 7
3^4 \equiv 4 \pmod 7
3^5 \equiv 5 \pmod 7
3^6 \equiv 1 \pmod 7

Обращаем внимание на последнюю строку, т.е. если a = 1, то x = 0 или x = p-1

Итак, у нас есть уже три случая, когда поиск x тривиален:

x  \in \{ 0, 1, p-1\}

Как правило для анализа DLOG строят таблицу логарифмов:

Таблица логарифмов для  (нулевое значение  обычно опускают)
Таблица логарифмов для GF(7), \ g = 3 (нулевое значение x обычно опускают)

По таблице логарифмов нарисуем график:

График таблицы логарифмов для
График таблицы логарифмов для GF(7), \ g = 3

На графике ничего интересного, только хаотичное изменение показателя x

Криптографический протокол DH построен на задаче DLOG https://ru.wikipedia.org/wiki/Протокол_Диффи_—_Хеллмана

Посмотрим пример прямо из вики:

Скрин из викистатьи Протокол Диффи — Хеллмана
Скрин из викистатьи Протокол Диффи — Хеллмана

Ничего сложного.

Далее пойдет новая или непубличная информация.

Основная часть

Будем анализировать DLOG как таблицу степеней. Таблица степеней это перевернутая таблица логарифмов (см. рис. ниже), слева — таблица степеней, справа — таблица логарифмов. Об этом я писал в статье "Как сгенерировать порождающие полиномы для конечных полей." https://habr.com/ru/articles/844300

Таблица степеней и таблица логарифмов для
Таблица степеней и таблица логарифмов для GF(7)

Таблица степеней удобнее, так как можно наблюдать сразу несколько примитивов (g), синим подчеркнута строка для примитива g = 3, колонка для x = 0 не обозначена.

Далее посмотрим несколько таблиц степеней и обратим внимание на среднюю колонку x = (p-1)/2

Несколько таблиц степеней
Несколько таблиц степеней

Имея ввиду экстраполяцию, можно предположить, что данная особенность распространяется на все множество таблиц степеней GF(p).

В средней колонке число p-1 показывает строки с уникальными значениями, значит в начале строки - примитив, наблюдаем также:

  • не касается последней строки, там \{1, (p-1), 1, (p-1), \cdots \};

  • (p-1)/2 - простое число, иначе, например для GF(13) \ \Longrightarrow \ (p-1)/2 = 6 - непростое, поэтому будут "лишние" строки: \{5, 8\}.

Математически это выглядит так:

g^{(p-1)/2} \equiv p-1\ |\ 1 \pmod p \quad  (1)

Математики знакомые с критериями Эйлера https://ru.wikipedia.org/wiki/Критерий_Эйлера и квадратичным вычетом https://ru.wikipedia.org/wiki/Квадратичный_вычет увидят знакомое:

  • a^{(p-1)/2}\equiv 1 \pmod p

  • a^{(p-1)/2}\equiv -1 \pmod p

но здесь вместо (p-1) установлено (-1) !

Надо вспомнить модулярную арифметику https://en.wikipedia.org/wiki/Modular_arithmetic (статья в en-вики более понятна), фактически в данном случае (-1) = (p-1), вернее так:

(-1) \pmod p = (p-1) \pmod p

Используя вышесказанное, можно находить все примитивы конечного поля:

Таблица степеней
Таблица степеней GF(11)

Общее количество примитивов конечного поля равно \varphi(p-1), где \varphi — функция Эйлера totient https://ru.wikipedia.org/wiki/Функция_Эйлера

Посмотрим на таблицу степеней GF(11) в виде графика, добавил нулевое значение x для симметричности, похож на "паука":

Таблица степеней  в виде графика
Таблица степеней GF(11) в виде графика

Вернемся в протоколу DH, изменим наименования переменных:

для Алисы:A=g^a \bmod {p}, A - открытый ключ, a - закрытый ключ.

для Боба: B=g^b \bmod {p}, B - открытый ключ, b - закрытый ключ.

S - общий секретный ключ, используется для шифровки - расшифровки сообщений.

Алиса вычисляет S_{alice} = B^a  \bmod {p}

Боб вычисляет S_{bob} = A^b  \bmod {p}

Рассмотрим канонический пример:

  1. p=11, g = 2

  2. Алиса выбирает закрытый ключ a=3

  3. Боб выбирает закрытый ключ b=9

  4. Алиса вычисляет открытый ключ A = 2^3 \bmod 11 = 8

  5. Боб вычисляет открытый ключ B = 2^9 \bmod 11 = 6

  6. Алиса и Боб обмениваются открытыми ключами

  7. Алиса вычисляет общий секретный ключ S_{alice} = 6^3  \bmod 11 = 7

  8. Боб вычисляет общий секретный ключ S_{bob} = 8^9  \bmod 11 = 7

  9. Алиса и Боб получили один и тот-же секретный ключ S, не передавая его по сети.

Теперь пример, когда закрытый ключ равен (p-1)/2:

  1. p=11, g = 2

  2. Алиса выбирает закрытый ключ a=5 = (p-1)/2

  3. Боб выбирает закрытый ключ b=9

  4. Алиса вычисляет открытый ключ A = 2^5 \bmod 11 = 10

  5. Боб вычисляет открытый ключ B = 2^9 \bmod 11 = 6

  6. Алиса и Боб обмениваются открытыми ключами

  7. Алиса вычисляет общий секретный ключ S_{alice} = 6^5  \bmod 11 = 10

  8. Боб вычисляет общий секретный ключ S_{bob} = 10^9  \bmod 11 = 10

Злоумышленник перехватил открытый ключ A = (p-1) = 10 и вычисляет закрытый ключ той-же Алисы по формуле (1): (p-1) = 10 \Longrightarrow a = (p-1)/2 = (11-1)/2 = 5

Далее, для получения секретного ключа S есть два способа:

1 способ. С помощью открытого ключа Боба B = 6

S_{alice} = 6^5  \bmod 11 = 10

2 способ. Сразу, если хотя бы один из открытых ключей равен (p-1), то S = (p-1) или , по формуле:

S = (p-1)^n \bmod p = (p-1)\ |\ 1, \mbox{ где } n - \mbox{ любой элемент конечного поля } GF(p)

Внимательно посмотрите на последнюю строку любого GF, например см. рис. выше "Несколько таблиц степеней".

Я не нашел в открытых источниках запрета на использование в качестве закрытого ключа (p-1)/2.

Данное выражение упоминается в статье: S. C. Pohlig and M. E. Hellman, "An improved algorithm for computing logarithms in GF(p) and its cryptographic significance." https://ee.stanford.edu/~hellman/publications/28.pdf, IEEE Trans. Info. Theory 24 (1978), 106–111.

В статье указано что (p-1)/2 должно быть простым числом для повышения безопасности.

Еще в статье можно встретить упоминание тривиального случая : "Also, restrictions might be imposed on K (e.g., K \ne 1) to avoid simple but improbable transformations." В переводе: "Кроме того, на K могут быть наложены ограничения (например, K \ne 1), чтобы избежать простых, но маловероятных преобразований." (K - ключ).

Решение: запретить использовать в качестве закрытого ключа (p-1)/2, дополняем список тривиальных случаев:

x \in  \{0, 1, (p-1)/2, p-1\}

Можно найти еще? Попробуем.

Рассмотрим внимательно "паука", см. рис. выше, почему он симметричен?

Примитивы сгруппированы парами:

Парные примитивы
Парные примитивы GF(11)

Когда-то я неправильно предположил, что эти пары взаимно простые, на самом деле они мультипликативно обратны по модулю https://ru.wikipedia.org/wiki/Обратное_по_модулю_число

g \times g' \equiv 1 \pmod p

Проверим:

  • 2 \times 6 \equiv 1 \pmod {11}

  • 7 \times 8 \equiv 1 \pmod {11}

Посмотрим график первой пары \{2, 6\}

Таблица степеней  в виде графика для пары примитивов
Таблица степеней GF(11) в виде графика для пары примитивов \{2,6\}

Симметрично, не правда ли? и в табличном виде:

Таблица степеней  для примитивов
Таблица степеней GF(11) для примитивов \{2,6\}

Мы выяснили выше, что \{2,6\} мультипликативно обратны, проверим остальные пары:

  • 1 \times 1 \equiv 1 \pmod {11}

  • 4 \times 3 \equiv 1 \pmod {11}

  • 8 \times 7 \equiv 1 \pmod {11}

  • 5 \times 9 \equiv 1 \pmod {11}

  • 10 \times 10 \equiv 1 \pmod {11}

Все пары мультипликативно обратны по модулю p.

Возвращаемся к DH, рассмотрим пример:

  1. p=11, g = 7

  2. Алиса выбирает закрытый ключ a=4

  3. Боб выбирает закрытый ключ b=9

  4. Алиса вычисляет открытый ключ A = 7^4 \bmod 11 = 3

  5. Боб вычисляет открытый ключ B = 7^9 \bmod 11 = 8

  6. Алиса и Боб обмениваются открытыми ключами

  7. Алиса вычисляет общий секретный ключ S_{alice} = 8^4  \bmod 11 = 4

  8. Боб вычисляет общий секретный ключ S_{bob} = 3^9  \bmod 11 = 4

Вроде все нормально, но!

  1. Нам известен примитив g = 7, мы можем получить мультипликативно обратный g' = 8 при помощи расширенного алгоритма Евклида https://ru.wikipedia.org/wiki/Расширенный_алгоритм_Евклида

  2. Сравниваем g' = 8 с открытыми ключами, у Боба открытый ключ B = 8, значит закрытый ключ Боба равен b = (p-2) = 9, см. рис. ниже

  3. Вычисляем секретный ключ S_b = A^b  \bmod 11 = 3^9  \bmod 11 = 4

Определение закрытого ключа  по
Определение закрытого ключа (p-2) по g'

Бинго - вот вторая "дырка", согласно формуле:

g^{(p-2)} \equiv g' \pmod p

Эту формулу можно вывести из Малой теоремы Ферма https://ru.wikipedia.org/wiki/Малая_теорема_Ферма

  1. g^{(p-1)} \equiv 1 \pmod p

  2. g * g^{(p-2)} \equiv 1 \pmod p

  3. g^{(p-2)} \equiv g^{-1} \pmod p.

  4. g^{-1} - это и есть обратное число - g'

Дополняем список тривиальных случаев:

x \in  \{ 0, 1, (p-1)/2, p-2, p-1\}

Больше уязвимостей пока не нашел.

Можно еще посмотреть график поля GF(47) (симметричность также видна) и таблицу, см. рисунки ниже:

График  по двум парам примитивов:
График GF(47) по двум парам примитивов: \{5, 19\}, \{10, 33\}
Таблица степеней
Таблица степеней GF(47)

Заключение

Предупреждения о предполагаемой сложности задачи DLOG, например:

  • "Криптографическая стойкость алгоритма Диффи — Хеллмана (то есть сложность вычисления K=g^{ab} \bmod {p} по известным p, g, A=g^{a} \bmod {p} \mbox{ и }  B=g^{b} \bmod {p}) основана на предполагаемой сложности задачи дискретного логарифмирования." Форматирование сохранено, источник: https://ru.wikipedia.org/wiki/Протокол_Диффи_—_Хеллмана#Криптографическая_стойкость

  • "A cryptographic system is described which is secure if and only if computing logarithms over GF(p) is infeasible." (мой перевод: "Описывается криптографическая система, которая является безопасной тогда и только тогда, когда вычисление логарифмов по GF(p) невозможно.") Источник: S. C. Pohlig and M. E. Hellman, "An improved algorithm for computing logarithms in GF(p) and its cryptographic significance." https://ee.stanford.edu/~hellman/publications/28.pdf IEEE Trans. Info. Theory 24 (1978), 106–111.

Что касается описанных в данной статье уязвимостях, то проблемы не такие большие. Необходимо в программное обеспечение, генерирующее закрытые ключи, добавить исключения: \{(p-1)/2, \ p-2\}, остальные были известны и ранее.

Математические уязвимости существуют и должны быть общеизвестны.

Если нашли ошибки, пишите камменты.

"Поиграться" с таблицами степеней и определить примитивы можно в сервисе https://dlog.vladlin.ru/ (AS IS)

На задаче DLOG, кроме протокола Диффи-Хеллмана, базируются и другие, например:

Надо проверить :-)

Комментарии (28)


  1. vened
    16.06.2025 10:17

    Я не нашел в открытых источниках запрета на использование в качестве закрытого ключа (p-1)/2

    В мультипликативном DH (FFDH) давно есть типовое требование: использовать для алгоритма циклическую подгруппу (простого) порядка (p-1)/2. Это то же самое. См., например, RFC 7919 (группы FFDH для TLS) или документы NIST 800.


    1. mvladlin Автор
      16.06.2025 10:17

      Спасибо, почитаю, не слишком ли глубоко спрятано "циклическую подгруппу (простого) порядка (p-1)/2 " и у меня в статье имеется ввиду классический DH


      1. vened
        16.06.2025 10:17

        у меня в статье имеется ввиду классический DH

        А в упомянутых документах - как раз тоже классический. FFDH (Finite Field DH) или "мультипликативный" - это и есть классический.


  1. wataru
    16.06.2025 10:17

    Я правильно понимаю, что основная "новая не публичная информация" - это про то что задача обратного логарифма, оказывается, легко решается в для p-1 и p-2?

    Я не нашел в открытых источниках запрета на использование в качестве закрытого ключа (p-1)/2.

    На практике p очень большое. Очень-очень большое. Сотни бит. И выбрать в качестве ключа именно (p-1)/2 - практически не возможно. Выбираются же закрытые ключи случайно для каждой сессии.

    Кроме того, этот косяк давно известен и проверяется во всех криптографических системах. Например, openssh: https://github.com/openssh/openssh-portable/blob/master/dh.c#L260

    Что касается p-2 - то этот случай тоже давно известен. Там открытый ключ окажется маленьким и маленькие открытые ключи тоже исключаются: https://github.com/openssh/openssh-portable/blob/master/dh.c#L275


    1. mvladlin Автор
      16.06.2025 10:17

      Спасибо, для математики не важно - большое p или маленькое.

      Проверять заранее невалидный закрытый ключ на уровне публичного ключа неверно, так как тратятся лишние ресурсы на ненужное вычисление того-же публичного ключа.

      Что касается p-2 - то этот случай тоже давно известен. Там открытый ключ окажется маленьким

      Сможете математически доказать?


      1. wataru
        16.06.2025 10:17

        Сначала не то написал, сейчас подумаю.

        Нет, оно не маленькое. Там получается публичный ключ g^(-1) = (p+1)/2.

        Это какой-то очень частный случай. Так-то, действительно, можно руками найти логарифм для какого-нибудь (p-1)/2 и тоже его записывать в запрещенные.

        Шанс что кому-то выпадет именно этот ключ - ничтожен.


  1. seregablog
    16.06.2025 10:17

    Далее пойдет новая или непубличная информация

    Информация далее не новая и известная

    Я не нашел в открытых источниках запрета на использование в качестве закрытого ключа (p-1)/2.

    Находится в гугле за минуту


    Всю статью можно записать в одну строку: Если публичный ключ Алисы A = p-1, то её закрытый ключ a = (p-1)/2.

    Это, конечно, верно. В плане атаки на ключ с таким же успехом можно рассчитать A42 = g^42 mod p, и когда публичный ключ Алисы совпадёт A = A42, сказать, что её закрытый ключ a = 42


    1. mvladlin Автор
      16.06.2025 10:17

      Находится в гугле за минуту

      Ccылку пришлите где вы нашли запрет на использование в качестве закрытого ключа (p-1)/2 ?


      1. seregablog
        16.06.2025 10:17

        1. mvladlin Автор
          16.06.2025 10:17

          Спасибо, но это обсуждение с двумя минусовыми ответами, а не утверждение.


          1. seregablog
            16.06.2025 10:17

            В этих "минусовых ответах" (в отличие от вашей статьи) доказано, что g^((p - 1) / 2) = p - 1 (mod p). Это лаконичнее и полезнее всех ваших таблиц-графиков-примеров

            Это просто первая ссылка, которая мне попалась. Поскольку само утверждение простое, оно наверняка есть в учебниках в виде какого-нибудь примера или упражнения. Полагаю, всерьёз вы не думаете, что первым это заметили


            1. mvladlin Автор
              16.06.2025 10:17

              Насчет (p-1)/2 точно не думаю - уж слишком "наверху" находится, смущает что не описано в какой-нибудь вики или открытой статье, чтобы быстро находилось.

              Я думаю что и известен пример с (p-2) хотя спрятан дальше.


              1. seregablog
                16.06.2025 10:17

                Утверждение о том, что g^(p-2) = g^(-1) известно, это простое следствие малой теоремы ферма, написано даже в википедии

                Ключ p-2 "плохой" настолько же, насколько плох ключ 42 из моего примера выше


                1. mvladlin Автор
                  16.06.2025 10:17

                  Утверждение о том, что g^(p-2) = g^(-1) известно, это простое следствие малой теоремы ферма, написано даже в википедии

                  Да, и описана у меня в статье


                  1. seregablog
                    16.06.2025 10:17

                    А ещё у вас написано, что ключ p-2 плохой, что неверно


  1. cpud47
    16.06.2025 10:17

    Вам для понимания стоит сформулировать формально, что такое "уязвимость в криптосистеме DH". Тогда станет ясно, почему это не проблема.

    Например, можно сформулировать так: это такой вероятностный алгоритм, что для случайного обмена публичных ключами, алгоритм даёт ответ с неисчезающей вероятностью. Неисчезающая вероятность означает, что еслиp(n)- вероятность угадать ответ при длине ключа в n бит, то

    \lim_{n \to \infty} p(n) > 0

    В такой постановке, Ваши примеры не являются уязвимостями.


    1. mvladlin Автор
      16.06.2025 10:17

      Нет уязвимости в DH, есть (не уязвимость) а особенность DLOG.

      А насчет вероятности стремящейся к 0 - Вы правы на 100%


      1. cpud47
        16.06.2025 10:17

        Я не очень понял, с чем Вы соглашаетесь, или что опровергаете :)

        описанные уязвимости - математические

        Прежде чем серьёзно говорить про "математические" уязвимости нужно строго (математически!) сформулировать, а что такое вообще уязвимость. А после этого математически доказать, что описанное в статье уязвимостями являются.

        А статья будет полезна начинающим криптографам - к которым причисляю и себя

        Нормальные вводные курсы по криптографии собственно начинаются со строгого определения, что такое вообще уязвимость. Выше я привёл упрощённое определение.

        Потому что без определения, это просто махание руками, без какой либо математики. Так можно дойти и до того, что я объявлю функцию f(x), которая решает DLOG для заданной группы (просто предпосчитаю её например) - и у нас будет "математическая" уязвимость. И вот попробуйте мне доказать, что это не так? ;) (серьёзно - попробуйте опровергнуть этот тезис)

        Статья у Вас в целом неплохая, но посыл чуть не тот. У Вас как раз очень хорошая иллюстрация, почему понятие "уязвимость" - довольно неоднозначное, и почему для него нужны строгие определения. Вот если Вы этими определниями(с разборами Ваших примеров по определениям) дополните статью - тогда действительно будет хороший материал для начинающих. А пока, она немного вводит в заблуждение неискушённого читателя.


        1. mvladlin Автор
          16.06.2025 10:17

          Извините, просто некогда "воду в ступе толочь"


          1. Imaginarium
            16.06.2025 10:17

            Хех. Вам предложили сделать из статьи что-то стоящее и даже указали как именно, чтобы статья обрела смысл и математическое содержание, потратили время на Вас и на объяснения Вам, а Вы отвечаете вот так))

            Без предложенных корректировок как раз Ваша статья и является толчением воды в ступе)


  1. MasterMentor
    16.06.2025 10:17

    Статья - норм! Нужно очень хорошо зубы на алгебраистике наточить, чтобы писать (и читать) такие статьи. :)

    PS А был известен этот "баг" в математике DH либо нет, пофиг. :)


    1. mvladlin Автор
      16.06.2025 10:17

      Спасибо :)


  1. mvladlin Автор
    16.06.2025 10:17

    Наверное моя вина - в статье неправильно расставлены акценты.

    У меня нет претензий к DH, описанные уязвимости - математические.

    Они "пришли" в протокол DH вместе с дискретным логарифмом (DLOG).

    Создатели DH всегда подчеркивали что зависят от DLOG.

    И вообще протокол DH - прекрасная идея.

    Другое дело тривиальные случаи DLOG (не DH), (в терминах DH - когда закрытый ключ может быть вычислен легко), освещены в публичной сфере очень слабо, в комментах исходного кода, в обсуждениях на форумах и прочее.

    А статья будет полезна начинающим криптографам - к которым причисляю и себя.


  1. VZ1
    16.06.2025 10:17

    Остается только добавить, что золотое правило — не городить огород самому, а использовать уже существующие библиотеки, где такие бэкдоры уже предусмотрены. Например:

    from cryptography.hazmat.primitives.asymmetric import dh
    
    parameters = dh.generate_parameters(generator=2, key_size=2048)
    private_key = parameters.generate_private_key()
    public_key = private_key.public_key()
    

    Эта библиотека автоматически избегает небезопасных значений ключей и поддерживает современные стандарты.


    1. cpud47
      16.06.2025 10:17

      Золотое правило - не использовать криптографические примитивы. Стоит сразу брать библиотеки высокого уровня с пуленепробиваемыми апи: всякие tls и sodium.

      AES, DH, RSA и прочие - слишком тяжело использовать без ошибок.


  1. lgorSL
    16.06.2025 10:17

    Имея ввиду экстраполяцию, можно предположить, что данная особенность распространяется на все множество таблиц степеней GF(p).

    Так это же логично. Примерно как для обычных чисел у нас есть два корня из единицы (равные 1 и -1), а так же четыре корня четвёртой степени (-1, 1, i, -i), так и для вычетов простого числа так же, только вместо -1 там будет (p-1) и для четвёртой степени чуть сложнее.

    Если внимательно посмотреть на таблицу степеней в gf(17), то в 8 колонке будут корни второй степени (которых ровно два и они 1 и 16), а в колонке 4 - корни четвёртой степени (1, 16, 4, 13)

    А например в таблице степеней по модулю 19 можно корни третьей степени найти в колонках 6 и 12, их ровно три: 1, 7, 11

    P. S. Ещё можно заметить что сумма всех корней степени n снова равна нулю, как и с комплексными числами.

    P. P. S. а ещё можно в кольце вычетов по модулю простого числа найти подходящий корень из единицы и сделать преобразование Фурье на целых числах, примерно как с e(-ikw) на комплексных.


  1. y_u_h
    16.06.2025 10:17

    Будем анализировать DLOG как таблицу степеней

    ЭтоНикогда не понимал подобных утверждений, ключевых, с которых начигаются многие нетривиальные вещи. Потому и не близок к сложной математике. Может кто пояснить, на каком основании это использовано?


    1. mvladlin Автор
      16.06.2025 10:17

      Дискретный логарифм (DLOG) по модулю p \quad g^x \equiv a \pmod p

      Пример для GF(7) для примитива g = 3

      3^0 \equiv 1 \pmod 7
      3^1 \equiv 3 \pmod 7
      3^2 \equiv 2 \pmod 7
      3^3 \equiv 6 \pmod 7
      3^4 \equiv 4 \pmod 7
      3^5 \equiv 5 \pmod 7
      3^6 \equiv 1 \pmod 7

      Обычно для DLOG строят таблицу логарифмов, главный минус которой - можно построить только по одному g.

      Таблица степеней - это перевернутая таблица логарифмов, строка x переносится в шапку таблицы степеней и сортируется, строка a переносится вниз, а слева появляется возможность добавить колонку для g, см. рис.

      таблица степеней слева, таблица логарифмов справа
      таблица степеней слева, таблица логарифмов справа

      По идее в таблицу степеней можно добавить колонку дляx=0но ее обычно опускают.