Top.Mail.Ru
Ответы

Необходимо решить заданием помощью программы Python

Дан ряд строк, которые пришли в ваш Центр по закрытому каналу связи. Руководитель Центра подозревает, что не все из этих строк отправлены Центром-партнером в Кутаиси. Постарайтесь установить, так ли это.

Примечание. Центр-партнер в начале рабочего дня присылает наименование небесного тела в Солнечной системе, которое в дальнейшем используется как кодовое слово дня. В данных строках собраны только утренние рассылки с наименованиями небесных тел в Солнечной системе.

Дана таблица соответствий букв и шифров, которыми пользуются ваш Центр и Центр-партнер:

Буква
Шифр*
Буква
Шифр*
Буква
Шифр*
А
00
Л
01
Ц
02
Б
03
М
04
Ч
05
В
06
Н
07
Ш
08
Г
09
О
10
Щ
11
Д
12
П
13
Ъ
14
Е
15
Р
16
Ы
17
Ж
18
С
19
Ь
20
З
21
Т
22
Э
23
И
24
У
25
Ю
26
Й
27
Ф
28
Я
29
К
30
Х
31
*если первое значение шифра «0», то этот нуль опускается: «01» нужно рассматривать как «1»


Приведен также список сообщений от Центра в Кутаиси:

(Сообщение от 24.08) 172.440.455.635.9.0.

(Сообщение от 25.08) 449.0.36.399.172.0.

(Сообщение от 26.08) 565.172.455.172.455.0.

(Сообщение от 27.08) 36.455.0.373.

(Сообщение от 28.08) 399.0.455.61.

(Сообщение от 29.08) 91.139.91.0.373.

(Сообщение от 30.08) 1.589.571.0.

(Сообщение от 31.08) 455.172.348.

Для кодировки Центр-партнер использует открытый ключ формата (q, N), в данном случае — (q = 601, N = 667).

Интересно, что N является произведением простых чисел а = 23 и v = 29, и всегда можно вычислить особое число f = (a - 1) * (b - 1).

Принцип работы следующий: числовое (шифровое) значение буквы s возводится в степень q по модулю N. Для расшифровки необходимо полученное значение возвести в степень d по модулю N, причем d — это элемент закрытого ключа формата (d, N), причем d такое, что целочисленный остаток от деления произведения d и q на f равен единице.

Закрытый ключ (d, N) используется для декодирования сообщения g, чтобы обратить его к s: последнее равно целочисленному остатку от деления возведенного в степень d числа g на N.

Рассмотрите следующую программу на Python:

def get_ext_g(A,B):

if A == 0:

return (B, 0, 1)

t, v, k = get_ext_g(B % A, A)

return (t, k - (B // A) * v, v)

def rev_md(A,B,C):

k, h, _ = get_ext_g(A, B)

if 0 != (C % k):

return None

return (h*C//k)%B

Для получения какого значения из названных выше может быть использована функция rev_md? В ответе должен быть один символ!

По дате
По Рейтингу
Аватар пользователя
Знаток

С