Как рассчитать модульное умножение элементов массива на целые числа в c? - PullRequest
0 голосов
/ 05 мая 2019

Рассмотрим следующее:

uint8_t message[15] = {
     0x32, 0xdc, 0x21, 0x55, 0x3f, 0x87, 0xc8, 0x1e,
     0x85, 0x10, 0x43, 0xf9, 0x93, 0x34, 0x1a
};
uint64_t num = 0xa1b2c33412;

Я хочу умножить вышеуказанную переменную num на массив message[].Псевдокод для того, что мне нужно, выглядит следующим образом:

uint8_t message[15] = {
     0x32, 0xdc, 0x21, 0x55, 0x3f, 0x87, 0xc8, 0x1e,
     0x85, 0x10, 0x43, 0xf9, 0x93, 0x34, 0x1a
};
uint64_t num = 0xa1b2c33412;
uint64_t p = 0x31ba62ca3037;
uint64_t result = 0x00;
result = moduloMultiplication(message, num, p); // (message * num) (mod p)

Я ожидаю следующие результаты:

num * msg = num*msg mod p
num * msg = 0x2bf2d18cdf92   (Final result)

Есть ли способ умножить массив на значение типаuint64_t?

Любая помощь по этому вопросу будет оценена ...

1 Ответ

2 голосов
/ 05 мая 2019

Предполагая, что число, хранящееся в 15-байтовом массиве, имеет порядок с прямым порядком байтов, вот простое решение:

#include <stdio.h>
#include <stdint.h>

uint64_t moduloMultiplication(const uint8_t message[15], size_t n,
                              uint64_t num, uint64_t p)
{
    uint64_t res = 0;
    for (size_t i = 0; i < n; i++) {
        // assuming `p < 1ULL << 56`
        res = (res * 256 + message[i] * num) % p;
    }
    return res;
}

int main() {
    uint8_t message[15] = {
        0x32, 0xdc, 0x21, 0x55, 0x3f, 0x87, 0xc8, 0x1e,
        0x85, 0x10, 0x43, 0xf9, 0x93, 0x34, 0x1a
    };
    uint64_t num = 0xa1b2c33412;
    uint64_t p = 0x31ba62ca3037;
    // result = (message * num) (mod p)
    uint64_t result = moduloMultiplication(message, sizeof message, num, p);

    printf("%#"PRIx64"\n", result);
    return 0;
}

Выход: 0x2bf2d18cdf92

Результат отличается от результата в вопросе, потому что либо message неверен, либо ваш промежуточный результат является приблизительным: 201FF4CDCFE8C0000000000000000000000000000 кажется неверным.

...