示例#1
0
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)
示例#2
0
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
示例#3
0
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
示例#4
0
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)
示例#5
0
    
    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"