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; }
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); }
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(); }