Код решения:
import math
# Зашифрованное сообщение: 432 331 192 108 180 50 231 188 105 51 364 168 344 195 297 342 292 198 448 62 236 342 63
# алгоритм Евклида для нахождения НОД и коэффициентов x, y (мне пришлось вспомнить 7 класс)
def extended_gcd(a, b):
if a == 0:
return b, 0, 1
else:
gcd, x1, y1 = extended_gcd(b % a, a)
x = y1 - (b // a) * x1
y = x1
return gcd, x, y
# функция для нахождения модулярной инверсии
def mod_inverse(a, m):
gcd, x, y = extended_gcd(a, m)
if gcd != 1:
return None
else:
return x % m
# Исходное сообщение
message_str = "432 331 192 108 180 50 231 188 105 51 364 168 344 195 297 342 292 198 448 62 236 342 63"
# Преобразуем строку в список чисел
message_list = message_str.split(" ")
message_list = [int(x) for x in message_list]
print("Исходный список чисел:", message_list)
# [432, 331, 192, 108, 180, 50, 231, 188, 105, 51, 364, 168, 344, 195, 297, 342, 292, 198, 448, 62, 236, 342, 63]
print("Длина списка:", len(message_list))
# 26
# Применяем операцию % 41 к каждому элементу списка
for index in range(len(message_list)):
message_list[index] = message_list[index] % 41
print(f"Индекс {index}: {message_list[index]}")
'''
Индекс 0: 22
Индекс 1: 3
Индекс 2: 28
Индекс 3: 26
Индекс 4: 16
Индекс 5: 9
Индекс 6: 26
Индекс 7: 24
Индекс 8: 23
Индекс 9: 10
Индекс 10: 36
Индекс 11: 4
Индекс 12: 16
Индекс 13: 31
Индекс 14: 10
Индекс 15: 14
Индекс 16: 5
Индекс 17: 34
Индекс 18: 38
Индекс 19: 21
Индекс 20: 31
Индекс 21: 14
Индекс 22: 22
'''
# Применяем модулярную инверсию к каждому элементу списка
for index in range(len(message_list)):
inverse = mod_inverse(message_list[index], 41)
if inverse is not None:
message_list[index] = inverse
else:
print(f"Модулярная инверсия для числа {message_list[index]} по модулю 41 не существует.")
message_list[index] = 0 # Заменяем на 0 или другое значение по умолчанию
# Словарь для преобразования чисел в символы
char_map = {
1: 'A', 2: 'B', 3: 'C', 4: 'D', 5: 'E', 6: 'F', 7: 'G', 8: 'H', 9: 'I', 10: 'J',
11: 'K', 12: 'L', 13: 'M', 14: 'N', 15: 'O', 16: 'P', 17: 'Q', 18: 'R', 19: 'S',
20: 'T', 21: 'U', 22: 'V', 23: 'W', 24: 'X', 25: 'Y', 26: 'Z',
27: '0', 28: '1', 29: '2', 30: '3', 31: '4', 32: '5', 33: '6', 34: '7', 35: '8',
36: '9', 37: '_'
}
# Преобразуем числа в символы и объединяем их в строку
result = ''.join([char_map[num] for num in message_list])
print("Результат преобразования чисел в строку:", result)
# 1NV3R53LY_H4RD_C680BDC1
Видео выполнения (нет):