예제 #1
0
def generate_h(p_s, p, q_s, q):
    """Compute a generator of a subgroup of Z^*_n that has order
    p_s mod p and order q_s mod q"""
    rs = PRNG()
    while True:
        hp = gmpy2.powmod(rs.random_Zsp(p), mpz((p-1)/p_s), p)
        if hp != 1:
            break
    while True:
        hq = gmpy2.powmod(rs.random_Zsp(q), mpz((q-1)/q_s), q)
        if hq != 1:
            break
    return crt([p, q], [hp, hq])
예제 #2
0
def generate_g(b, d, p, q):
    """Compute a generator of a subgroup of Z^*_n that has order
    b**d mod p and order b**d mod q"""
    rs = PRNG()
    b_to_the_d = b ** d
    while True:
        x = rs.random_Zsp(p)
        if gmpy2.powmod(x, mpz((p-1)/b), p) != 1:
            gp = gmpy2.powmod(x, mpz((p-1)/b_to_the_d), p)
            break
    while True:
        x = rs.random_Zsp(q)
        if gmpy2.powmod(x, mpz((q-1)/b), q) != 1:
            gq = gmpy2.powmod(x, mpz((q-1)/b_to_the_d), q)
            break
    return crt([p, q], [gp, gq])
예제 #3
0
파일: pohlig.py 프로젝트: AvyChanna/ecc-dlp
def pohlig(curve, g, f, n, limit=0):
    subgroups = n
    if isinstance(n, int):
        subgroups = factorint(n)
    factors = [i**j for i, j in subgroups.items()]
    prod = 1
    for i in factors:
        prod *= i
    exponents = [prod // i for i in factors]
    remainders = []
    for factor, power in zip(factors, exponents):
        if limit != 0 and factor > limit:
            continue
        g_power_k = curve.mult(power, g)
        assert curve.check(g_power_k)
        r_power_k = curve.mult(power, f)
        remainders.append(bsgs(curve, g_power_k, r_power_k, factor))
    return crt(remainders, factors)
예제 #4
0
def pohlig_hellman_attack(h, g, p):
	primes = get_factor_counts_dict(p - 1)
	crt_dict = dict()
	for prime, power in primes.items():
		x_list = []
		h_sub = h
		for j in range(1, power + 1):
			i = 0
			q = (p - 1) // pow(prime, j)
			h_pow = pow(h_sub, q, p)
			g_pow = pow(g, (p - 1) // prime, p)
			while True:
				if pow(g_pow, i, p) == h_pow:
					x_list += [i]
					break
				i += 1
			h_sub = (h_sub * pow(ext_euc(g, p)[1], i * pow(prime, j - 1))) % p
		res_mod_prime = 0
		for j in range(power):
			res_mod_prime += pow(prime, j) * x_list[j]
		crt_dict[res_mod_prime % pow(prime, power)] = pow(prime, power)
	return crt(crt_dict)
예제 #5
0
파일: day13.py 프로젝트: iKevinY/advent
    nums = parse_nums(line)
    data = parse_line(r'', line)

    for x, c in enumerate(line):
        board[Point(x, y)] = c

    if y == 0:
        timestamp = int(line)
    else:
        for x in line.split(','):
            if x == 'x':
                buses.append(None)
            else:
                buses.append(int(x))

m = []
x = []
for i, b in enumerate(buses):
    if b:
        m.append(b)
        x.append(i)

print crt(x, m)

num = 1777307553937916
l1 = 2265213528143033

num2 = num - l1

print abs(num2) < abs(num)