Пример #1
0
def dh_encode(msg_to_encode):

    # переводим символы в числа
    numbers_list = convert_chars_to_int(msg_to_encode)

    print(numbers_list)

    # генерируем простые числа
    a_priv = primegen.prime_gen(40)
    b_priv = primegen.prime_gen(40)

    p = primegen.prime_gen(50)
    q = primroot(p)

    print(f"prime = {p}\n")

    print(f"primitive root = {q}\n")

    A_pub = pow(q, a_priv, p)
    B_pub = pow(q, b_priv, p)

    print(f"A_pub = {A_pub}, A_priv = {a_priv}\n")

    print(f"B_pub = {B_pub}, A_priv = {b_priv}\n")

    K_a = pow(B_pub, a_priv, p)
    K_b = pow(A_pub, b_priv, p)

    print(f"secret key = {K_a}\n")

    print("Use cesar for encoding with sec. key\n")
    encoded_num = [(num + K_a) % 255 for num in numbers_list]
    print(encoded_num)

    return convert_int_to_chars(encoded_num), K_a
Пример #2
0
def gen_keys(dimension):
    """
    Функция, которая генерирует ключи абонента 

    """

    p = primegen.prime_gen(dimension)

    while p % 4 != 3:
        p = primegen.prime_gen(dimension)

    q = primegen.prime_gen(dimension)

    while q % 4 != 3:
        q = primegen.prime_gen(dimension)

    N = p * q

    for i in range(2, N - 1):
        s = jacobi_symbol(i, N)
        if s == -1:
            s = i
            break

    k = ((p - 1) * (q - 1) // 4 + 1) // 2

    return (p, q), N, k, s
Пример #3
0
def get_e_d(m):

    e = primegen.prime_gen(3)

    while gcd(e, m) != 1:
        e = primegen.prime_gen(3)

    d = (pow(e, -1, m) * (m + 1) // 2) % m

    return e, d
Пример #4
0
def gen_open_keys(dimension):
    """
    Функция, которая генерирует пару общих ключей 

    """
    large_prime = primegen.prime_gen(dimension)
    primitive_root = primroot(large_prime)

    while primitive_root == -1:
        large_prime = primegen.prime_gen(dimension)
        primitive_root = primroot(large_prime)

    return large_prime, primitive_root
Пример #5
0
def gen_keys(dimension):
    """
    Функция, которая генерирует ключи абонента 

    """

    p = primegen.prime_gen(dimension)

    while p % 4 != 3:
        p = primegen.prime_gen(dimension)

    q = primegen.prime_gen(dimension)

    while q % 4 != 3:
        q = primegen.prime_gen(dimension)

    N = p * q

    return (p, q), N
Пример #6
0
def gen_key_pair(prime):
    """
    Функция, которая генерирует пару ключей a,b такую, что:

    a*b mod (p-1) = 1

    При этом, сначала находим a: a mod (p-1) = 1
    Затем находим b при помощи расширенного алгоритма Евклида.

    """

    first = primegen.prime_gen(50)
    second = 0

    while gcd(first, prime - 1) != 1:
        first = primegen.prime_gen(50)

    second = ext_gcd(first, prime - 1)

    return first, second % (prime - 1)
Пример #7
0
def gen_keys(dimension):
    """
    Функция, которая генерирует ключи абонента 

    """

    print("Parametrs: \n")

    p = primegen.prime_gen(dimension)

    while is_prime(p) == False:
        p = primegen.prime_gen(dimension)

    q = primegen.prime_gen(dimension)

    while is_prime(q) == False:
        q = primegen.prime_gen(dimension)

    print(f"p = {p}, q = {q}")

    N = p * q

    print(f"N = {N}")

    C = get_c(p, q)

    print(f"c = {C}")

    S = get_s(C, N)

    print(f"s = {S}")

    M = get_m(p, q, C)

    print(f"m = {M}")

    E, D = get_e_d(M)

    print(f"e = {E}, d = {D}\n")

    return (p, q, M, D), (N, E, C, S)
Пример #8
0
def gen_keys(dimension):
    """
    Функция, которая генерирует ключи абонента 

    """

    p = primegen.prime_gen(dimension)
    q = primegen.prime_gen(dimension)

    N = p * q

    phi = (p - 1) * (q - 1)

    d = primegen.prime_gen(dimension // 2)

    c = ext_gcd(d, phi)

    if c < 0:
        c = c % phi

    print((c * d) % phi)

    return c, d, N
Пример #9
0
def shamir_encode(msg_to_encode):
    """
    Функция кодирования

    """

    # переводим символы в числа
    numbers_list = convert_chars_to_int(msg_to_encode)

    int_m = make_number_to_encode(numbers_list)

    p = primegen.prime_gen(100)

    C_a, D_a = gen_key_pair(p)
    C_b, D_b = gen_key_pair(p)

    print(f"prime = {p}")
    print(f"A pair c_a = {C_a},  d_a = {D_a}\n")
    print(f"B pair c_b = {C_b},  d_b = {D_b}\n")

    print("********************")
    print("Converted message: ", int_m)
    print("********************")

    print(f"1. A->B: ")

    int_m = pow(int_m, C_a, p)
    print(int_m)

    print(f"2. B->A: ")

    int_m = pow(int_m, C_b, p)
    print(int_m)

    print(f"3. A->B (finaly encoded): ")

    int_m = pow(int_m, D_a, p)
    print(int_m)

    # Возвращаем зашифрованное сообщение, ключ для дешифровки и простое число
    return int_m, D_b, p
Пример #10
0
def main():

    start_time = time.time()

    isChoose = False

    while isChoose != True:
        print("Выбор простого числа\n")
        print("[1]. Вручную")
        print("[2]. Сгенерировать случайное\n")
        a = int(input("Выберите пункт: "))

        if a == 1:
            p = int(input("Введите простой модуль: "))
            isChoose = True
        elif a == 2:
            p = primegen.prime_gen(100)

            print(f"Сгенерировано простое число {p}\n")
            isChoose = True
        else:
            print("Введен не существующий пункт! \n")

    if p <= 3:
        print("p должен быть > 3")
        sys.exit()

    isSqr = False

    while isSqr != True:

        m = int(
            input("\nВведите число, из которого необходимо извлечь корень: "))
        m = m % p
        if legendre_symbol(m, p) == 1:
            isSqr = True
        else:
            print(
                "Не выполнено условие разрешимости сравнения\nЧисло должно быть квадратичным вычетом по модулю p"
            )

    print("\nЧисло: ", m)

    if p % 4 == 3:
        print("\np % 4 == 3")
        R = pow(m, (p + 1) // 4, p)
        y1 = R % p
        y2 = p - R

    elif p % 8 == 5:
        print("\np % 8 == 5")
        y1, y2 = p_5_mod_8(m, p)

    elif p % 48 == 41:
        print("\np % 48 == 41")
        y1, y2 = p_41_mod_48(m, p)

    else:
        print("\nИспользуем общий случай")
        y1, y2 = sqrt_mod(m, p)

    print("\nКорни:\n(1) {}\n\n(2) {}".format(y1, y2))

    # проверка

    print("\nПроверка:\n(1) {}\n\n(2) {}".format(y1**2 % p, y2**2 % p))

    print('\nЗатраченное время =', time.time() - start_time)