SIGSEGV с MPZ_Class и самым острымC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 SIGSEGV с MPZ_Class и самым острым

Сообщение Anonymous »

Я новичок в программировании на C++, и для улучшения я хотел реализовать атаку Блейхенбахера. Ранее я создал один на Python и подумал, что это будет хорошим упражнением, чтобы немного изучить C++.
Чтобы использовать большое количество, я нашел библиотеку gmp. Я пытаюсь писать модульные тесты по ходу работы, чтобы быть уверенным, что все работает правильно. Для модульных тестов я использую острый.
В настоящее время возникает проблема: я получаю сообщение «TEST INTERRUPTED BY SIGSEGV», когда пытаюсь выполнить слишком много операторов?
Итак, тест здесь работает:

Код: Выделить всё

void createRSA(void) {
gmp_randstate_ptr state;
gmp_randinit_default(state);
RSA rsa1(state);
RSA rsa2(state);
RSA rsa3(state);
RSA rsa4(state);
// RSA rsa5(state);
}
Но если бы я захотел создать еще один объект RSA, я получил бы SIGSEGV. Аналогично, этот тест также не пройден, если я раскомментирую последнюю строку:

Код: Выделить всё

void createRSA(void) {
gmp_randstate_ptr state;
gmp_randinit_default(state);
RSA rsa(state);

mpz_class d = rsa.getD();
mpz_class e = rsa.getE();
mpz_class n = rsa.getN();

TEST_ASSERT(((mpz_sizeinbase(n.get_mpz_t(), 2) + 7) / 8) == 128);
TEST_ASSERT(((mpz_sizeinbase(n.get_mpz_t(), 2) + 7) / 8) == 128);
TEST_ASSERT(rsa.getE() == 65537);
// RSA rsa2(state);
}
Класс RSA также очень прост:

Код: Выделить всё

class RSA {
private:
mpz_class e, d, n;
public:
RSA(gmp_randstate_ptr state);
getE() { return e; };
getD() { return d; };
getN() { return n; };
}

#include "rsa.hpp"
#include "gmp.h"
#include "gmpxx.h"

RSA::RSA(gmp_randstate_ptr state) {
// create rsa pair and set the values
mpz_t p, q, E, D, N, x, y, phi, u, t, gcd;
mpz_inits(p, q, E, D, N, x, y, phi, u, t, gcd, NULL);
mpz_set_ui(E, 65537);

mpz_setbit(u, 511);
mpz_setbit(t, 512);

mpz_urandomb(x, state, 512);
mpz_add(x, x, u);
mpz_mod(x, x, t);
mpz_urandomb(y, state, 512);
mpz_add(y, y, u);
mpz_mod(y, y, t);
mpz_nextprime(p, x);
mpz_nextprime(q, y);

mpz_mul(N, p, q);

int k = (mpz_sizeinbase(N, 2) + 7) / 8;

while (k != 128) {
mpz_urandomb(x, state, 512);
mpz_add(x, x, u);
mpz_mod(x, x, t);
mpz_urandomb(y, state, 512);
mpz_add(y, y, u);
mpz_mod(y, y, t);
mpz_nextprime(p, x);
mpz_nextprime(q, y);

mpz_mul(N, p, q);

k = (mpz_sizeinbase(N, 2) + 7) / 8;
}

mpz_sub_ui(p, p, 1);
mpz_sub_ui(q, q, 1);
mpz_mul(phi, p, q);
mpz_gcd(gcd, E, phi);

int res = mpz_invert(D, E, phi);

if (res == 0) {
printf("Failed to compute inverse of e!\n");
exit(1);
}

e = mpz_class(E);
d = mpz_class(D);
n = mpz_class(N);

mpz_clears(p, q, E, D, N, x, y, phi, u, t, gcd, NULL);
}
Конструктор вычисляет действительную пару rsa, а затем устанавливает частные поля.
Я действительно не понимаю, почему тест в какой-то момент начинает давать сбой.
/>Если у кого-то есть идеи, любая помощь будет очень признательна!
Я попробовал несколько разных методов тестирования, чтобы выяснить, где именно что-то идет не так, но не смог определить точку сбоя. Тесты также терпят неудачу, когда я создаю 3 объекта RSA и читаю более 2 полей. Таким образом, тест, который создает два объекта, а затем сравнивает n полей обоих объектов, ПРОЙДЕТ, но если я добавлю в этот тест третий объект и попытаюсь прочитать поле n этого объекта, я получу SIGSEGV.
Я также создал очень простой конструктор, в котором я буквально просто установил для полей заданное число:

Код: Выделить всё

RSA::RSA(gmp_randstate_ptr state) {
e = mpz_class(1); // the wrapper is not needed but also without I get SIGSEGV
d = mpz_class(2);
n = mpz_class(4);
}
Но даже в этом случае я получаю SIGSEGV, поэтому понятия не имею, что еще можно сделать.


Подробнее здесь: https://stackoverflow.com/questions/787 ... nd-acutest
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Редактор тегов Python MPZ DZ
    Anonymous » » в форуме Python
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Что это значит, двойное бесплатное, обнаруженное в TCACHE 2 при использовании MPZ?
    Anonymous » » в форуме C++
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Классифицируйте обрезанные лица изображения как истинные, если лицо является острым и содержит все особенности лица и не
    Anonymous » » в форуме Python
    0 Ответы
    29 Просмотры
    Последнее сообщение Anonymous
  • Разница между class.__init__() и class()?
    Anonymous » » в форуме Python
    0 Ответы
    94 Просмотры
    Последнее сообщение Anonymous
  • В чем разница между AndroidJUnit4::class и AndroidJUnit4ClassRunner::class?
    Гость » » в форуме Android
    0 Ответы
    99 Просмотры
    Последнее сообщение Гость

Вернуться в «C++»