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
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
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
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
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
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)
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)
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
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
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)