Кто-нибудь пытался реализовывать криптосистемы при помощи библиотеки GMP? Я хочу написать функцию, которая получает на вход блок исходного текста в виде массива байт, сворачивает байты в длинное число по основанию 256 и шифрует это число стандартным способом. После этого полученное число разбивается на байты и записывается в выходной массив. Получилось как-то так:
void rsa_encrypt_block(char *result, char *source, struct RSA_CONTEXT *rsa)
{
mpz_t base_256_encoded;
mpz_t encrypted;
mpz_t next_256_power;
mpz_t quotient;
int i;
mpz_init(base_256_encoded);
mpz_init(next_256_power);
mpz_init(encrypted);
mpz_init(quotient);
// Переводим в систему счисления по основанию 256
for (i = 0; i < RSA_BLOCK_SIZE_BYTES; i++)
{
mpz_ui_pow_ui(next_256_power, 256, i);
mpz_addmul_ui(base_256_encoded, next_256_power, source[i]);
}
// Шифруем полученное на предыдущем шаге значение
rsa_encrypt(&encrypted, &base_256_encoded, rsa);
gmp_printf("Encrypted in [rsa_encrypt_block] = %Zd\n", encrypted);
// Преобразуем зашифрованное сообщение в масив байт
for (i = 0; i < RSA_BLOCK_SIZE_BYTES; i++)
{
result[i] = mpz_tdiv_q_ui(quotient, encrypted, 256);
mpz_set(encrypted, quotient);
printf("%u ", result[i]);
}
}
Строка printf(«%u », result); показывает, что что-то пошло не так: часть значение со знаком минус. Такого быть не должно. Поэтому я думаю, что я выбрал неправильную функцию для деления. Как можно исправить эту ошибку?
Документацию читал здесь: https://gmplib.org/manual/Integer-Division.html