Basi c группа арифметических c в libsodium - PullRequest
0 голосов
/ 10 февраля 2020

Я пытаюсь реализовать простой криптографический c примитив.

Под следующим кодом: учитывая sa, sk, hn, я хочу вычислить sb: так, чтобы sg * G = (sb + sk. Hn) * G.

Однако после нахождения sb следующее равенство не выполняется: sb * G + (sk.hn) G = sa G.

Я понимаю, что в показателе степени есть арифметика c по модулю порядка группы вместо L.

Однако у меня есть несколько вопросов, касающихся их реализации:

  1. почему скаляр должен быть выбран из [0, L], где L - порядок подгруппы?

  2. есть ли «вспомогательная» функция, которая умножает два больших скаляра без выполнения по модулю L?

int main(void)
{
    if (sodium_init() < 0) {
        /* panic! the library couldn't be initialized, it is not safe to use */
        return -1;
    }
    uint8_t sb[crypto_core_ed25519_SCALARBYTES];
    uint8_t sa[crypto_core_ed25519_SCALARBYTES];
    uint8_t hn[crypto_core_ed25519_SCALARBYTES];
    uint8_t sk[crypto_core_ed25519_SCALARBYTES];
    crypto_core_ed25519_scalar_random(sa); // s_a <- [0,l]
    crypto_core_ed25519_scalar_random(sk);  // sk  <- [0,l]
    crypto_core_ed25519_scalar_random(hn);  // hn  <- [0,l]

    uint8_t product[crypto_core_ed25519_SCALARBYTES];
    crypto_core_ed25519_scalar_mul(product, sk,hn);  // sk*hn
    crypto_core_ed25519_scalar_sub(sb, sa, product); // sb = sa-hn*sk

    uint8_t point1[crypto_core_ed25519_BYTES];
    crypto_scalarmult_ed25519_base(point1, sa);

    uint8_t point2[crypto_core_ed25519_BYTES];
    uint8_t sum[crypto_core_ed25519_BYTES];

    // equal
    // crypto_core_ed25519_scalar_add(sum, sb, product);
    // crypto_scalarmult_ed25519_base(point2, sum);

    // is not equal
    uint8_t temp1[crypto_core_ed25519_BYTES];
    uint8_t temp2[crypto_core_ed25519_BYTES];
    crypto_scalarmult_ed25519_base(temp1, sb);      // sb*G
    crypto_scalarmult_ed25519_base(temp2, product); //
    crypto_core_ed25519_add(point2, temp1, temp2);
    if(memcmp(point1, point2, 32) != 0)
    {
        printf("[-] Not equal ");
        return -1;
    }
    printf("[+] equal");

    return 0;
}

1 Ответ

0 голосов
/ 14 февраля 2020

Я получил ответ от jedisct1, автора libsodium, и я опубликую его здесь:

crypto_scalarmult_ed25519_base () зажимает скаляр (очищает 3 младших бита, устанавливает старший бит) перед выполнением умножение.

Используйте crypto_scalarmult_ed25519_base_noclamp (), чтобы предотвратить это.

Или, что еще лучше, используйте вместо этого группу Ristretto.

...