def generate_keys(bitlen, name): """Генерация ключей Генерируется случайное простое число p длины n битов. Выбирается случайный элемент g поля Zp. Выбирается случайное целое число x такое, что 1 < x < p-1. Вычисляется y = g^x (mod p). Открытым ключом является тройка (p,g,y), закрытым ключом — число x. """ p = primes.GeneratePrime(bitlen) g = bigNumber.GenerateRandomMax(p) x = bigNumber.GenerateRandomMax(p) y = bigNumber.Pow(g, x, p) pub_key = "\n".join(map(str, (p, g, y))) priv_key = "\n".join(map(str, (p, x))) with open(name + '.pub', 'w') as pub_file: pub_file.write(pub_key) with open(name + '.priv', 'w') as priv_file: priv_file.write(priv_key)
def encrypt(p, g, y, m): """Сообщение M шифруется следующим образом: Выбирается сессионный ключ — случайное целое число k такое, что 1 < k < p - 1 Вычисляются числа a = g^k (mod p) и b = y^k * M (mod p) Пара чисел (a, b) является шифротекстом. """ if m >= p: raise ValueError('Message is too large!') k = bigNumber.GenerateRandomMax(p - 2) + 1 a = bigNumber.Pow(g, k, p) b = bigNumber.Pow(y, k, p) b = (b * m) % p return a, b
def MillerRabin(m): """Тест Миллера-Рабина на простоту числа """ t = m - 1 s = bigNumber.bigNumber(0) while t % 2 == 0: t /= 2 s += 1 for repeat in range(20): a = 0 while a == 0: a = bigNumber.GenerateRandomMax(m - 4) + 2 if not MillerRabinPass(a, s, t, m): return False return True
def generate_keys(bitlen, name): p_const = "48731" q_const = "443" g_const = "11444" p = bigNumber.bigNumber(p_const) q = bigNumber.bigNumber(q_const) g = bigNumber.bigNumber(g_const) w = bigNumber.GenerateRandomMax(q) y = bigNumber.Pow(g, q - w, p) pub_key = "\n".join(map(str, (p, q, g, y))) priv_key = str(w) with open(name + '.pub', 'w') as pub_file: pub_file.write(pub_key) with open(name + '.priv', 'w') as priv_file: priv_file.write(priv_key)
with open(args.keychain + '.pub') as key_file: (p, q, g, y) = key_file.read().split("\n") p = bigNumber.bigNumber(p) q = bigNumber.bigNumber(q) g = bigNumber.bigNumber(g) y = bigNumber.bigNumber(y) with open(args.keychain + '.priv') as key_file: w = key_file.read().split("\n") w = bigNumber.bigNumber(w[0]) # Алгоритм работы протокола # Предварительная обработка. Алиса выбирает случайное число r, меньшее q, # и вычисляет x = g^r mod p. r = bigNumber.GenerateRandomMax(q) x = bigNumber.Pow(g, r, p) # Инициирование. Алиса посылает x Бобу. # Боб выбирает случайное число e из диапазона от 0 до 2^t-1 и отправляет его Алисе. pow2t = bigNumber.GenerateRandomLen(72) e = bigNumber.GenerateRandomMax(pow2t) # Алиса вычисляет s=r+we mod q и посылает s Бобу. s = (r + w * e) % q # Подтверждение. Боб проверяет что x=g^s * y^e mod p from_alice = (bigNumber.Pow(g, s, p) * bigNumber.Pow(y, e, p)) % p if x == from_alice: print "Access granted"