Рейтинг:0

Код Python для «Проверяемой канонической генерации генератора g», FIPS 186-4, возвращает False

флаг in

Редактировать: если кто-то, неопытный, как я, приземлится на этот вопрос, на него был дан ответ в переполнение стека.

Почему код Python, см. ниже, возвращает false?

Больше контекста: я прохожу через ФИПС 186-4 а на странице 43 есть алгоритм, A.2.3 Верифицируемая каноническая генерация генератора g, чтобы генерировать генераторы. Я написал код Python, см. ниже, который кодирует этот алгоритм. Однако он всегда возвращает false в отношении тестовых данных, которые я взял из Тестовые векторы NIST (Тестовые векторы, FIPS-186-4, DSA. Я также разместил весь файл по адресу [gist][3).

введите описание изображения здесь

из Crypto.Hash импортировать SHA256


P = 0xfbdf34147bf5d8a45671c906923c1dbe86e9123fae5750d6c1986e00a9946f7f833372a436f98f75dc798bb454825eb625d49011d1e4401baacb653bb9dac6cc8ac91e61ba4310458ff6d6ddabcba29db025eedba6e2f837344dee4814e2a7e2e92ceb1e6e665ee08ce187ffd420fee7a99e046a4af719fa8c689630e88f8729
Q = 0x93db61194cb0b9236eea63617d149cd6dd8e2bf1
domain_parameter_seed = 0x75709e9ca555a80cb7ab154e9d29d2775fe215d8
индекс = 0xae
G = 0x7db10e27fffe43fc9582367a449f7be217130cdf89a5eff65fbebefc9478ba39ad03d1b0d0254c0f1b8246d914c0d1df25f55a5dabbb51caa1942403fdc22c832e4d7048ce0ad64cb76252fdcfaecd78722c2e10417495ee9d4e0d8376f891a3042b103de915355c0e60e168cf48c0fa232a13bf9b58a0f9b3ad7db7ad39c536



деф Хэш(число):
    string = number.to_bytes((number.bit_length()+7)//8, 'большой')
    return int(SHA256.new(string).hexdigest(), 16)


защита вычислений_gen():
    k = (P - 1) // Q
    для количества в диапазоне (1, 0xffff):
  
        U = количество + 2 ^ 16 * (индекс + 2 ^ 16 * (0x6767656e + 2 ^ 32 * семя_параметра_домена))
        W = Хэш (U)
        g = pow(W, k, P)
        печать (шестнадцатеричный (г))
        если г != 1:
            сломать
 
    вернуть г


печать (compute_gen() == G)
Рейтинг:2
флаг ng

Наиболее близкая к криптографической причина, по которой код не работает, заключается в том, что он не реализует предписание

показатель это битовая строка длины 8

когда это произойдет

U = количество + 2 ^ 16 * (индекс + 2 ^ 16 * (0x6767656e + 2 ^ 32 * семя_параметра_домена))

где второй 2^16 предназначен для $2^8$.

Ошибка программирования в той же строке заключается в том, что ^ означает XOR, а не мощность; и имеет более низкий приоритет, чем сложение и умножение.

В более общем случае код использует целые числа там, где должны быть байты. Цепочки байтов упрощают конкатенацию и предотвращают ошибки, подобные той, которая в настоящее время возникает, когда первый байт domain_parameter_seed изменения от 0x75 к 0x00, что вполне законно.

С использованием шестнадцатеричный дайджест и преобразование его обратно в целое работает в контексте, но это ужасная практика программирования. Использовать переваривать.

флаг in
Спасибо за ответ. Извините, я не очень хорошо разбираюсь в здешнем этикете.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.