// randomSafePrime returns a number, p, of the given size, such that p and // (p-1)/2 are both prime with high probability. func randomSafePrime(rand io.Reader, bits int) (p *big.Int, err os.Error) { if bits < 1 { err = os.EINVAL } bytes := make([]byte, (bits+7)/8) p = new(big.Int) p2 := new(big.Int) for { _, err = io.ReadFull(rand, bytes) if err != nil { return } // Don't let the value be too small. bytes[0] |= 0x80 // Make the value odd since an even number this large certainly isn't prime. bytes[len(bytes)-1] |= 1 p.SetBytes(bytes) if big.ProbablyPrime(p, 20) { p2.Rsh(p, 1) // p2 = (p - 1)/2 if big.ProbablyPrime(p2, 20) { return } } } return }
// Prime returns a number, p, of the given size, such that p is prime // with high probability. func Prime(rand io.Reader, bits int) (p *big.Int, err error) { if bits < 1 { err = os.EINVAL } b := uint(bits % 8) if b == 0 { b = 8 } bytes := make([]byte, (bits+7)/8) p = new(big.Int) for { _, err = io.ReadFull(rand, bytes) if err != nil { return nil, err } // Clear bits in the first byte to make sure the candidate has a size <= bits. bytes[0] &= uint8(int(1<<b) - 1) // Don't let the value be too small, i.e, set the most significant bit. bytes[0] |= 1 << (b - 1) // Make the value odd since an even number this large certainly isn't prime. bytes[len(bytes)-1] |= 1 p.SetBytes(bytes) if big.ProbablyPrime(p, 20) { return } } return }
func Euler35() string { num := 0 sieve := primes.FastSieve() circularPrimes := make(map[int]int) for a := <-sieve; a < 1000000; a = <-sieve { _, tested := circularPrimes[a] if tested { continue } else { //Test if it's circular circular := true primesTested := make(map[int]int) digits := []byte(strconv.Itoa(a)) finishedRotations := false for ; ; arithmetics.Rotate(digits) { number, _ := strconv.Atoi(string(digits)) _, finishedRotations = primesTested[number] if finishedRotations { break } primesTested[number] = 0 if circular && !big.ProbablyPrime(big.NewInt(int64(number)), 1) { circular = false } } for n := range primesTested { if circular { num += 1 } circularPrimes[n] = 0 } } } return fmt.Sprint(num) }
func (priv *PrivateKey) Validate() os.Error { // Check that p, q and, maybe, r are prime. Note that this is just a // sanity check. Since the random witnesses chosen by ProbablyPrime are // deterministic, given the candidate number, it's easy for an attack // to generate composites that pass this test. if !big.ProbablyPrime(priv.P, 20) { return os.ErrorString("P is composite") } if !big.ProbablyPrime(priv.Q, 20) { return os.ErrorString("Q is composite") } if priv.R != nil && !big.ProbablyPrime(priv.R, 20) { return os.ErrorString("R is composite") } // Check that p*q*r == n. modulus := new(big.Int).Mul(priv.P, priv.Q) if priv.R != nil { modulus.Mul(modulus, priv.R) } if modulus.Cmp(priv.N) != 0 { return os.ErrorString("invalid modulus") } // Check that e and totient(p, q, r) are coprime. pminus1 := new(big.Int).Sub(priv.P, bigOne) qminus1 := new(big.Int).Sub(priv.Q, bigOne) totient := new(big.Int).Mul(pminus1, qminus1) if priv.R != nil { rminus1 := new(big.Int).Sub(priv.R, bigOne) totient.Mul(totient, rminus1) } e := big.NewInt(int64(priv.E)) gcd := new(big.Int) x := new(big.Int) y := new(big.Int) big.GcdInt(gcd, x, y, totient, e) if gcd.Cmp(bigOne) != 0 { return os.ErrorString("invalid public exponent E") } // Check that de ≡ 1 (mod totient(p, q, r)) de := new(big.Int).Mul(priv.D, e) de.Mod(de, totient) if de.Cmp(bigOne) != 0 { return os.ErrorString("invalid private exponent D") } return nil }
// Create random numbers until it finds a prime func create_random_prime(bits int) (prime *big.Int) { for true { prime = create_random_bignum(bits) // Create a random number if big.ProbablyPrime(prime, 20) { // Do 20 rabin-miller tests to check if it's prime return } } return // This is just here to keep the compiler happy }
func Euler41() string { maxPandigital := "123456789" max := 0 for i := len(maxPandigital); i > 3; i-- { pandigital := []byte(maxPandigital[0:i]) for arithmetics.Permute(pandigital) { number, _ := strconv.Atoi(string(pandigital)) if big.ProbablyPrime(big.NewInt(int64(number)), 1) { if number > max { max = number } } } if max != 0 { return fmt.Sprint(max) } } return "Error not prime found" }
func (priv *PrivateKey) Validate() os.Error { // Check that the prime factors are actually prime. Note that this is // just a sanity check. Since the random witnesses chosen by // ProbablyPrime are deterministic, given the candidate number, it's // easy for an attack to generate composites that pass this test. for _, prime := range priv.Primes { if !big.ProbablyPrime(prime, 20) { return os.ErrorString("Prime factor is composite") } } // Check that Πprimes == n. modulus := new(big.Int).Set(bigOne) for _, prime := range priv.Primes { modulus.Mul(modulus, prime) } if modulus.Cmp(priv.N) != 0 { return os.ErrorString("invalid modulus") } // Check that e and totient(Πprimes) are coprime. totient := new(big.Int).Set(bigOne) for _, prime := range priv.Primes { pminus1 := new(big.Int).Sub(prime, bigOne) totient.Mul(totient, pminus1) } e := big.NewInt(int64(priv.E)) gcd := new(big.Int) x := new(big.Int) y := new(big.Int) big.GcdInt(gcd, x, y, totient, e) if gcd.Cmp(bigOne) != 0 { return os.ErrorString("invalid public exponent E") } // Check that de ≡ 1 (mod totient(Πprimes)) de := new(big.Int).Mul(priv.D, e) de.Mod(de, totient) if de.Cmp(bigOne) != 0 { return os.ErrorString("invalid private exponent D") } return nil }
// GenerateParameters puts a random, valid set of DSA parameters into params. // This function takes many seconds, even on fast machines. func GenerateParameters(params *Parameters, rand io.Reader, sizes ParameterSizes) (err os.Error) { // This function doesn't follow FIPS 186-3 exactly in that it doesn't // use a verification seed to generate the primes. The verification // seed doesn't appear to be exported or used by other code and // omitting it makes the code cleaner. var L, N int switch sizes { case L1024N160: L = 1024 N = 160 case L2048N224: L = 2048 N = 224 case L2048N256: L = 2048 N = 256 case L3072N256: L = 3072 N = 256 default: return os.ErrorString("crypto/dsa: invalid ParameterSizes") } qBytes := make([]byte, N/8) pBytes := make([]byte, L/8) q := new(big.Int) p := new(big.Int) rem := new(big.Int) one := new(big.Int) one.SetInt64(1) GeneratePrimes: for { _, err = io.ReadFull(rand, qBytes) if err != nil { return } qBytes[len(qBytes)-1] |= 1 qBytes[0] |= 0x80 q.SetBytes(qBytes) if !big.ProbablyPrime(q, numMRTests) { continue } for i := 0; i < 4*L; i++ { _, err = io.ReadFull(rand, pBytes) if err != nil { return } pBytes[len(pBytes)-1] |= 1 pBytes[0] |= 0x80 p.SetBytes(pBytes) rem.Mod(p, q) rem.Sub(rem, one) p.Sub(p, rem) if p.BitLen() < L { continue } if !big.ProbablyPrime(p, numMRTests) { continue } params.P = p params.Q = q break GeneratePrimes } } h := new(big.Int) h.SetInt64(2) g := new(big.Int) pm1 := new(big.Int).Sub(p, one) e := new(big.Int).Div(pm1, q) for { g.Exp(h, e, p) if g.Cmp(one) == 0 { h.Add(h, one) continue } params.G = g return } panic("unreachable") }