⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 randompp.cpp

📁 flint库 RSA算法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
  if (p.iseven ())    {      p += q;    }  while (p > pmax)    {      p = pmin + p % (t + 1);      w = p % twotimesq;      p += (twotimesq - w) + a;      if (p.iseven ())        {          p += q;        }    }  while (1 != gcd (p - 1, f) || !p.isprime ())    {      Assert (twotimesq < pmax);      p += twotimesq;      while (p > pmax)        {          p += sRand_l (&xrstate);          p = pmin + p % (t + 1);          Assert (p < pmax);          w = p % twotimesq;          p += (twotimesq - w) + a;          Assert (p < pmax);          if (p.iseven ())            {              p += q;            }          Assert (p < pmax);        }    }  Assert ((p - a) % q == 0);  return p; // p is prime with p = a mod q, ggT (p - 1, f) = 1}// Find random prime number p of length pmin <= p <= pmax// with p = a mod q and gcd (p - 1, f) = 1.// Input parameter: 2 < q prime, a mod q != 0, 0 < f oddLINT ExtendPrime (USHORT l,                  const LINT& a,                  const LINT& q,                  const LINT& f,                  STATEPRNG& xrstate){  if (l > CLINTMAXBIT)     LINT::panic (E_LINT_INV, "ExtendPrime", 1, __LINE__, __FILE__);  LINT pmin = LINT(0).setbit (l - 1);  LINT pmax = LINT(0).setbit (l);  --pmax;  return (ExtendPrime (pmin, pmax, a, q, f, xrstate));}// Find strong prime p of length 2^(l-1) <= p <= 2^l - 1// with primes r, s, t, such that//    r divides p - 1//    t divides r - 1//    s divides p + 1//// Input parameter: Binary length l of pLINT StrongPrime (USHORT l, STATEPRNG& xrstate){  if (l >= CLINTMAXBIT)     LINT::panic (E_LINT_OFL, "StrongPrime", 1, __LINE__, __FILE__);  LINT pmin = LINT(0).setbit (l - 1);  LINT pmax = LINT(0).setbit (l);  --pmax;  return (StrongPrime (pmin, pmax, (l>>2)-8, (l>>1)-8, (l>>1)-8, 1, xrstate));}// Find strong prime p of length 2^(l-1) <= p <= 2^l - 1// with gcd (p - 1, f) = 1 and primes r, s, t such that//    r divides p - 1//    t divides r - 1//    s divides p + 1//// Input parameter: Binary length l of p,//                  0 < f oddLINT StrongPrime (USHORT l, const LINT& f, STATEPRNG& xrstate){  if (l >= CLINTMAXBIT)     LINT::panic (E_LINT_OFL, "StrongPrime", 1, __LINE__, __FILE__);  LINT pmin = LINT(0).setbit (l - 1);  LINT pmax = LINT(0).setbit (l);  --pmax;  return (StrongPrime (pmin, pmax, (l>>2)-8, (l>>1)-8, (l>>1)-8, f, xrstate));}// Find strong prime p of length 2^(l-1) <= p <= 2^l - 1// with gcd (p - 1, f) = 1 and primes r, s, t such that//    r divides p - 1//    t divides r - 1//    s divides p + 1//// Input parameter: Binary length l of p,//                  Lengths lt, lr and ls of primes t, r and s resp.//                     lt <~ l/4, lr ~ ls <~ l/2 of l//                  <~ means: smaller than, close to//                  0 < f oddLINT StrongPrime (USHORT l,                  USHORT lt,                  USHORT lr,                  USHORT ls,                  const LINT& f,                  STATEPRNG& xrstate){  if (l >= CLINTMAXBIT)     LINT::panic (E_LINT_OFL, "StrongPrime", 1, __LINE__, __FILE__);  if (lt >= CLINTMAXBIT)     LINT::panic (E_LINT_OFL, "StrongPrime", 2, __LINE__, __FILE__);  if (lr >= CLINTMAXBIT)     LINT::panic (E_LINT_OFL, "StrongPrime", 3, __LINE__, __FILE__);  if (ls >= CLINTMAXBIT)     LINT::panic (E_LINT_OFL, "StrongPrime", 4, __LINE__, __FILE__);  LINT pmin = LINT(0).setbit (l - 1);  LINT pmax = LINT(0).setbit (l);  --pmax;  return (StrongPrime (pmin, pmax, lt, ls, lr, f, xrstate));}// Find strong prime p with pmin <= p <= pmax// with gcd (p - 1, f) = 1 and primes r, s, t such that//    r divides p - 1//    t divides r - 1//    s divides p + 1//// Input parameter: pmin, pmax//                  0 < f oddLINT StrongPrime (const LINT& pmin,                  const LINT& pmax,                  const LINT& f,                  STATEPRNG& xrstate){  if (pmin.status == E_LINT_INV)     LINT::panic (E_LINT_INV, "StrongPrime", 1, __LINE__, __FILE__);  if (pmax.status == E_LINT_INV)     LINT::panic (E_LINT_INV, "StrongPrime", 2, __LINE__, __FILE__);  if (f.status == E_LINT_INV)     LINT::panic (E_LINT_INV, "StrongPrime", 6, __LINE__, __FILE__);  // 0 < f muss ungerade sein  if (f.iseven ())     LINT::panic (E_LINT_INV, "StrongPrime", 5, __LINE__, __FILE__);  int lt = (ld (pmin) >> 2) - 8;  int lr = (ld (pmin) >> 1) - 8;  int ls = lr;  return StrongPrime (pmin, pmax, lt, ls, lr, f, xrstate);}// Find strong prime p with pmin <= p <= pmax// with gcd (p - 1, f) = 1 and primes r, s, t such that//    r divides p - 1//    t divides r - 1//    s divides p + 1//// Input parameters: pmin, pmax,//                   Lengths lt, lr and ls of primes t, r and s resp.//                     lt <~ l/4, lr ~ ls <~ l/2 of l//                   <~ means: smaller than, close to//                   0 < f oddLINT StrongPrime (const LINT& pmin,                  const LINT& pmax,                  USHORT lt,                  USHORT lr,                  USHORT ls,                  const LINT& f,                  STATEPRNG& xrstate){  if (pmin.status == E_LINT_INV)     LINT::panic (E_LINT_INV, "StrongPrime", 1, __LINE__, __FILE__);  if (pmax.status == E_LINT_INV)     LINT::panic (E_LINT_INV, "StrongPrime", 2, __LINE__, __FILE__);  if (lt >= CLINTMAXBIT)     LINT::panic (E_LINT_OFL, "StrongPrime", 3, __LINE__, __FILE__);  if (lr >= CLINTMAXBIT)     LINT::panic (E_LINT_OFL, "StrongPrime", 4, __LINE__, __FILE__);  if (ls >= CLINTMAXBIT)     LINT::panic (E_LINT_OFL, "StrongPrime", 5, __LINE__, __FILE__);  if (f.status == E_LINT_INV)     LINT::panic (E_LINT_INV, "StrongPrime", 6, __LINE__, __FILE__);  // 0 < f muss ungerade sein  if (f.iseven ())     LINT::panic (E_LINT_INV, "StrongPrime", 5, __LINE__, __FILE__);  LINT t = FindPrime (lt, 1, xrstate);  LINT r = ExtendPrime (lr, 1, t, 1, xrstate);  LINT s = FindPrime (ls, 1, xrstate);  LINT p = inv (r,s);  // p := r^(-1) mod s  p *= r;              // p := r^(-1) * r  p <<= 1;             // p := 2*r^(-1) * r  LINT rs = r*s;  p = msub (1,p,rs);   // p := 1 - 2*r^(-1) * r mod r*s = s*u - r*v mod r*s                       // mit u := s^(-1) mod r und v := r^(-1) mod s  Assert ((p - 1) % r == 0);  Assert ((p + 1) % s == 0);  p = ExtendPrime (pmin, pmax, p, rs, f, xrstate);  Assert ((p - 1) % r == 0);  Assert ((p + 1) % s == 0);  return p;}// Compatibility functions for prior versions of Blum-Blum-Shub-Generator// not thread-safe!static STATEPRNG xrstate_loc;int seedBBS (const LINT& seed){  if (seed.status == E_LINT_INV) LINT::panic (E_LINT_INV, "seedBBS", 0, __LINE__);  xrstate_loc.Generator = FLINT_RNDBBS;  return (seedBBS_l (&xrstate_loc.StateBBS, seed.n_l));}LINT randBBS (int l){  return RandLINT (l, xrstate_loc);}LINT randBBS (const LINT& rmin, const LINT& rmax){  return RandLINT (rmin, rmax, xrstate_loc);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -