private EG_Secret_Key GenerateKey(int nBits) { BigInteger q = new BigInteger(); BigInteger p; BigInteger g; BigInteger gPowTwo; BigInteger gPowQ; EG_Secret_Key eskKey = new EG_Secret_Key(); /* // construct a prime p = 2q + 1 do { q = BigInteger.genRandom(nBits - 1); System.Windows.Forms.Application.DoEvents(); p = (2*q) + 1; } while ((!p.isProbablePrime()) || (!q.isProbablePrime())); */ q = BigInteger.genPseudoPrime(nBits - 1); p = BigInteger.genPseudoPrime(nBits); // find a generator do { g = new BigInteger(); g = BigInteger.genRandom(nBits - 1); gPowTwo = g.modPow(new BigInteger(2), p); gPowQ = g.modPow(q, p); } while ((gPowTwo == 1) || (gPowQ == 1)); BigInteger x; do { x = new BigInteger(); x = BigInteger.genRandom(nBits); } while (x >= p-1); BigInteger y = g.modPow(x, p); eskKey.p = p; eskKey.g = g; eskKey.x = x; eskKey.y = y; return eskKey; }
private DSA_Secret_Key GenerateParams(int keyLength) { byte[] seed = new byte[20]; byte[] part1 = new byte[20]; byte[] part2 = new byte[20]; byte[] u = new byte[20]; RandomNumberGenerator rng = RandomNumberGenerator.Create(); BigInteger p = new BigInteger(); // prime BigInteger q = new BigInteger(); // group order BigInteger g; // group generator DSA_Secret_Key dskKey = new DSA_Secret_Key(); SHA1 sha = SHA1.Create(); int n = (keyLength - 1) / 160; byte[] w = new byte [keyLength / 8]; bool primesFound = false; while (!primesFound) { do { rng.GetBytes(seed); part1 = sha.ComputeHash(seed); Array.Copy(seed, 0, part2, 0, seed.Length); add(part2, seed, 1); part2 = sha.ComputeHash(part2); for (int i = 0; i != u.Length; i++) u[i] = (byte)(part1[i] ^ part2[i]); // first bit must be set (to respect key length) u[0] |= (byte)0x80; // last bit must be set (prime are all odds - except 2) u[19] |= (byte)0x01; q = new BigInteger(u); } while (!q.isProbablePrime()); int counter = 0; int offset = 2; while (counter < 4096) { for (int k = 0; k < n; k++) { add(part1, seed, offset + k); part1 = sha.ComputeHash(part1); Array.Copy(part1, 0, w, w.Length - (k + 1) * part1.Length, part1.Length); } add(part1, seed, offset + n); part1 = sha.ComputeHash(part1); Array.Copy(part1, part1.Length - ((w.Length - (n) * part1.Length)), w, 0, w.Length - n * part1.Length); w[0] |= (byte)0x80; BigInteger xx = new BigInteger (w); BigInteger c = xx % (q * 2); p = xx - (c - 1); if (p.testBit((uint)(keyLength - 1))) { if (p.isProbablePrime()) { primesFound = true; break; } } counter += 1; offset += n + 1; } } // calculate the generator g BigInteger pMinusOneOverQ = (p - 1) / q; for (;;) { BigInteger h = new BigInteger(); h = BigInteger.genRandom(keyLength); if ((h <= 1) || (h >= (p - 1))) continue; g = h.modPow(pMinusOneOverQ, p); if (g <= 1) continue; break; } dskKey.p = p; dskKey.q = q; dskKey.g = g; return dskKey; }
private BigInteger[] Encrypt(BigInteger biPlain, RSA_Public_Key rpkKey) { if ((rpkKey.e == 0) || (rpkKey.n == 0)) throw new System.ArgumentException("This is not a valid public key"); BigInteger biCipher = biPlain.modPow(rpkKey.e, rpkKey.n); BigInteger[] biOutput = new BigInteger[1]; biOutput[0] = biCipher; return biOutput; }