У меня есть программа, которая является своего рода экспериментом в криптографии. В моей попытке выделить показатель степени c и модуль, я использовал вышеупомянутую функцию. Это работает некоторое время, но всякий раз, когда я выполняю вычисление достаточно раз, адрес переменной mpz_t изменяется, а затем выдает ошибку сегментации.
// get N and e from public key of format
// {e}FFFFFFFFFFFFFFFF{N}
void get_N_e(mpz_t retvalN, mpz_t retvale, mpz_t key) {
// create 0xFF as a mpz_t to use AND on it later
mpz_t ff;
mpz_init(ff);
mpz_set_ui(ff, 0xff);
// store the huge number to be imported later
char data[4096];
// count the number of consecutive 0xFFs
int no_ffs = 0;
// index for data
long i = 0;
while (no_ffs < 8) {
// test = key & 0xFF
mpz_t test;
mpz_init(test);
mpz_set_ui(test, 0);
mpz_and(test, key, ff);
// tmp = (unsigned int) test
unsigned int tmp;
tmp = mpz_get_ui(test);
mpz_clear(test);
if (tmp == 0xff) {
++no_ffs;
}
else {
data[i++] = tmp;
no_ffs = 0;
}
// key >>= 8
// source of the segfault
mpz_tdiv_q_2exp(key, key, 8);
}
mpz_clear(ff);
mpz_import(retvalN, 4096, 1, sizeof(char), 1, 0, data);
}