Esempio n. 1
0
NTL_CLIENT

// Программа для генерации задачи дискретного логарифмирования заданной размерности 
// Образующая и модуль - D1 гладкие

int main() {
ZZ a,b,p,r; //основание, степень, модуль, порядок циклической группы, образованной основанием
ZZ x; //Показатель
long len; //Длина модуля

//Спросим длину модуля
//Фактически, модуль будет иметь длину len+1 двоичных разрядов
cin >> len;

//Простое число Жермен - p - простое и 2*p+1 - тоже простое
//Генерируем число заданной размерности (в двоичных разрядах)
p=GenGermainPrime_ZZ(len);

//Порядок циклической группы будет p-1. Мы будем искать образующую :)
//Всё так, как учил нас Великий Шнайер в Красной Книге
r=2*p;
//Модуль
p=2*p+1;

a=2;
//Найдём образующую
while ((PowerMod(a,2,p)==1) || (PowerMod(a,(p-1)/2,p)==1)) {
	a=NextPrime(a+1);
	}

//Получим степень b
b=2;
if (b==a)
	b=NextPrime(b+1);

//Выдадим задачу на стандартный вывод
cout << a << endl << b << endl << p << endl << r << endl;
//Вот программе и конец, а кто - кодил - молодец!
return 0;
}
Esempio n. 2
0
void IndexCalc::GeneratePandQ(long bits){
	ic_Q = GenGermainPrime_ZZ(bits);
    ic_P = 2*ic_Q + 1;
	ic_G = RandomBits_ZZ(bits/6);
	ic_X = GenPrime_ZZ(bits/8);
}
Esempio n. 3
0
void PaillierParty::initPaiilier() {
    uint32_t symSecurityParameter = stoi(getValFromConfig(m_config, "General", "symsecurityparameter"));
    uint32_t bitSize;
    switch(symSecurityParameter) {
        case 80:
            bitSize = 1024; // some suggest 2048
            break;
        case 128:
            bitSize = 3072; // some suggest 2048(ANSSI) or 2560
            break;
        default:
            throw(system_error());
    }

    uint32_t leaderId = stoi(getValFromConfig(m_config, "General", "leaderid"));

    if (m_partyId == leaderId) {
        m_pTag = GenGermainPrime_ZZ(bitSize/2-1);
        m_qTag = GenGermainPrime_ZZ(bitSize/2-1);

        m_p = 2 * m_pTag + 1;
        m_q = 2 * m_qTag + 1;
        m_n = m_p * m_q;
        m_m = m_pTag * m_qTag;

        // TODO: there is some bug here when I use different m_a,m_b
        //m_a = getRandomInNStar(m_n);
        //m_b = getRandomInNStar(m_n);
        m_a = 1;
        m_b = 1;

        for (auto &party : m_parties) {
            sendZZTo(m_pTag,party.second);
            sendZZTo(m_qTag,party.second);
            sendZZTo(m_a,party.second);
            sendZZTo(m_b,party.second);
        }
    }
    else {
        receiveZZFrom(m_pTag, m_parties[leaderId]);
        receiveZZFrom(m_qTag, m_parties[leaderId]);
        receiveZZFrom(m_a, m_parties[leaderId]);
        receiveZZFrom(m_b, m_parties[leaderId]);

        m_p = 2 * m_pTag + 1;
        m_q = 2 * m_qTag + 1;
        m_n = m_p * m_q;
        m_m = m_pTag * m_qTag;
    }

    m_field = m_n * m_n;
    m_delta = factorial(m_numOfParties);
    m_g = MulMod(PowerMod(1+m_n, m_a,m_field),PowerMod(m_b,m_n,m_field),m_field);

    for (uint32_t j = 1; j <= m_parties.size()+1; j++) {
        double prod = m_delta;
        for (uint32_t jTag = 1; jTag <= m_parties.size()+1; jTag++) {
            if (j == jTag) {
                continue;
            }
            prod = prod*jTag;
            int divisor = jTag-j;
            prod = prod/divisor;
        }
        m_lagrangeBasis[j] = ZZ(static_cast<int>(prod));
    }

    secretShare();
}