LINUX.ORG.RU

Свертка массива байт и разбиение на байты в реализации RSA при помощи GMP

 ,


0

1

Кто-нибудь пытался реализовывать криптосистемы при помощи библиотеки 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

result же по идее указатель на массив char, которые на x86 со знаком.

А %u ожидает varargs аргумент unsigned int. Как именно (и корректно ли вообще) передаётся char в varargs сказать затрудняюсь, но в любом случае преобразованпе знакового char в unsigned int будет давать неожиданный результат для отрицательных величин. Вряд ли -2 станет 254.

GPFault ()
Ответ на: комментарий от GPFault

char на x86 обычно знаковый, и преобразуется для передачи в int с расширением знака. Надо или спецификатор %hhu, или явный каст к unsigned int.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.