Расшифровка текста путем частотного анализа

Делаю лабораторную работу по информационной безопасности. Не могу дешифровать текст. Работу начал с буквального логического подбора:

  1. предполагал, что каждая буква по возрастанию является конкретной буквой в русском алфавите;
  2. то же самое, что и в первом варианте, но наоборот.

Потом воспользовался анализом частоты появления каждого символа, но при сопоставлении в Excel внятный текст все равно не выходил. Потом воспользовался Python, но все ничего не получалось.

Что ещё можно использовать для того, чтобы дешифровать текст? Текст 100% на русском языке и, судя по количеству символов, без буквы Ё.

Формулировка задания:

Расшифровать текст. Каждой букве алфавита соответствует двузначное число:

  1. 39 25 20 34 82 63 66 46 35 20 25 82 86 39 51 74 35 51 66 20 44 37 25 27 51 35 44 20 90 37 51 25 25 51 63 91 20 11 37 46 48 25 20 37 61 51 14 82 82 66 82 35 29 82 91 25 51 74 51 24 78 51 24 59 46 86 51 44 74 20 25 37 37, 37 44 82 31 11 37 82 51 46 25 51 34 82 25 37 82 86 37 25 27 51 35 44 20 90 37 51 25 25 48 44 46 82 78 25 51 14 51 18 37 59 44, 51 74 82 35 20 90 37 59 44 66 90 82 25 25 48 44 37 61 10 44 20 18 20 44 37, 86 61 20 25 86 51 39 66 86 51 44 10 66 82 86 46 51 35 10 37 66 51 46 51 39 51 63 66 39 59 91 37. 56 46 51 86 20 66 20 82 46 66 59 24 35 10 18 37 78 51 35 18 20 25 37 91 20 90 37 63, 46 51, 66 51 18 14 20 66 25 51 35 82 91 10 14 29 46 20 46 20 44 35 20 91 14 37 56 25 48 78 37 66 66 14 82 24 51 39 20 25 37 63, 35 10 86 51 39 51 24 37 46 82 14 37 44 25 51 18 37 78 37 91 25 37 78 91 25 20 31 46 51 61 51 66 25 51 39 25 48 78 39 37 24 20 78 10 18 35 51 91, 25 51 25 82 10 24 82 14 59 31 46 24 51 14 42 25 51 18 51 39 25 37 44 20 25 37 59 24 20 25 25 48 44 39 51 74 35 51 66 20 44, 66 56 37 46 20 59, 56 46 51 51 61 82 66 74 82 56 82 25 37 82 37 25 27 51 35 44 20 90 37 51 25 25 51 63 61 82 91 51 74 20 66 25 51 66 46 37 25 82 37 44 82 82 46 66 44 48 66 14 20, 82 66 14 37 51 46 66 10 46 66 46 39 10 82 46 39 37 24 37 44 20 59 10 18 35 51 91 20;

Код:

from collections import Counter

encrypted_numbers = [
    39, 25, 20, 34, 82, 63, 66, 46, 35, 20, 25, 82, 86, 39, 51, 74, 35, 51, 66, 20, 44, 37, 25, 27, 51, 35, 44, 20, 90, 37, 51, 25, 25, 51, 63, 91, 20, 11, 37, 46, 48, 25, 20, 37, 61, 51, 14, 82, 82, 66, 82, 35, 29, 82, 91, 25, 51, 74, 51, 24, 78, 51, 24, 59, 46, 86, 51, 44, 74, 20, 25, 37, 37, 37, 44, 82, 31, 11, 37, 82, 51, 46, 25, 51, 34, 82, 25, 37, 82, 86, 37, 25, 27, 51, 35, 44, 20, 90, 37, 51, 25, 25, 48, 44, 46, 82, 78, 25, 51, 14, 51, 18, 37, 59, 44, 51, 74, 82, 35, 20, 90, 37, 59, 44, 66, 90, 82, 25, 25, 48, 44, 37, 61, 10, 44, 20, 18, 20, 44, 37, 86, 61, 20, 25, 86, 51, 39, 66, 86, 51, 44, 10, 66, 82, 86, 46, 51, 35, 10, 37, 66, 51, 46, 51, 39, 51, 63, 66, 39, 59, 91, 37, 56, 46, 51, 86, 20, 66, 20, 82, 46, 66, 59, 24, 35, 10, 18, 37, 78, 51, 35, 18, 20, 25, 37, 91, 20, 90, 37, 63, 46, 51, 66, 51, 18, 14, 20, 66, 25, 51, 35, 82, 91, 10, 14, 29, 46, 20, 46, 20, 44, 35, 20, 91, 14, 37, 56, 25, 48, 78, 37, 66, 66, 14, 82, 24, 51, 39, 20, 25, 37, 63, 35, 10, 86, 51, 39, 51, 24, 37, 46, 82, 14, 37, 44, 25, 51, 18, 37, 78, 37, 91, 25, 37, 78, 91, 25, 20, 31, 46, 51, 61, 51, 66, 25, 51, 39, 25, 48, 78, 39, 37, 24, 20, 78, 10, 18, 35, 51, 91, 25, 51, 25, 82, 10, 24, 82, 14, 59, 31, 46, 24, 51, 14, 42, 25, 51, 18, 51, 39, 25, 37, 44, 20, 25, 37, 59, 24, 20, 25, 25, 48, 44, 39, 51, 74, 35, 51, 66, 20, 44, 66, 56, 37, 46, 20, 59, 56, 46, 51, 51, 61, 82, 66, 74, 82, 56, 82, 25, 37, 82, 37, 25, 27, 51, 35, 44, 20, 90, 37, 51, 25, 25, 51, 63, 61, 82, 91, 51, 74, 20, 66, 25, 51, 66, 46, 37, 25, 82, 37, 44, 82, 82, 46, 66, 44, 48, 66, 14, 20, 82, 66, 14, 37, 51, 46, 66, 10, 46, 66, 46, 39, 10, 82, 46, 39, 37, 24, 37, 44, 20, 59, 10, 18, 35, 51, 91, 20
]

russian_freq = [
    'о', 'е', 'а', 'и', 'н', 'т', 'с', 'р', 'в', 'л', 'к', 'м', 'д', 'п', 'у',
    'я', 'ы', 'ь', 'г', 'з', 'б', 'ч', 'й', 'х', 'ж', 'ш', 'ю', 'ц', 'щ', 'э', 'ф', 'ъ'
]

number_counts = Counter(encrypted_numbers)
most_common_numbers = [num for num, _ in number_counts.most_common()]

decryption_dict = {}
for i in range(min(len(most_common_numbers), len(russian_freq))):
    decryption_dict[most_common_numbers[i]] = russian_freq[i]

decrypted_text = []
for num in encrypted_numbers:
    decrypted_text.append(decryption_dict.get(num, '?'))

print("=== Частотный анализ чисел ===")
for num, count in number_counts.most_common(20):
    print(f"{num}: {count} (возможно → '{decryption_dict.get(num, '?')}')")

print("=== Расшифрованный текст ===")
print(''.join(decrypted_text))

print("=== Сопоставление чисел и букв ===")
for num, char in decryption_dict.items():
    print(f"{num} → '{char}'")

Ответы (1 шт):

Автор решения: Oopss

Путем частотного анализа, удалось выяснить:

внашейстранеквопросаминформационнойзащитынаиболеесерьезноподходяткомпании,имеющиеотношениекинформационнымтехнологиям,операциямсценнымибумагами,кбанковскомусекторуисотовойсвязи.чтокасаетсядругихорганизаций,то,согласнорезультатамразличныхисследований,руководителимногихизнихзнаютобосновныхвидахугроз,нонеуделяютдолжноговниманияданнымвопросам,считая,чтообеспечениеинформационнойбезопасностинеимеетсмысла,еслиотсутствуетвидимаяугроза;

Соответствует коду:

39 25 20 34 82 63 66 46 35 20 25 82 86 39 51 74 35 51 66 20 44 37 25 27 51 35 44 20 90 37 51 25 25 51 63 91 20 11 37 46 48 25 20 37 61 51 14 82 82 66 82 35 29 82 91 25 51 74 51 24 78 51 24 59 46 86 51 44 74 20 25 37 37, 37 44 82 31 11 37 82 51 46 25 51 34 82 25 37 82 86 37 25 27 51 35 44 20 90 37 51 25 25 48 44 46 82 78 25 51 14 51 18 37 59 44, 51 74 82 35 20 90 37 59 44 66 90 82 25 25 48 44 37 61 10 44 20 18 20 44 37, 86 61 20 25 86 51 39 66 86 51 44 10 66 82 86 46 51 35 10 37 66 51 46 51 39 51 63 66 39 59 91 37. 56 46 51 86 20 66 20 82 46 66 59 24 35 10 18 37 78 51 35 18 20 25 37 91 20 90 37 63, 46 51, 66 51 18 14 20 66 25 51 35 82 91 10 14 29 46 20 46 20 44 35 20 91 14 37 56 25 48 78 37 66 66 14 82 24 51 39 20 25 37 63, 35 10 86 51 39 51 24 37 46 82 14 37 44 25 51 18 37 78 37 91 25 37 78 91 25 20 31 46 51 61 51 66 25 51 39 25 48 78 39 37 24 20 78 10 18 35 51 91, 25 51 25 82 10 24 82 14 59 31 46 24 51 14 42 25 51 18 51 39 25 37 44 20 25 37 59 24 20 25 25 48 44 39 51 74 35 51 66 20 44, 66 56 37 46 20 59, 56 46 51 51 61 82 66 74 82 56 82 25 37 82 37 25 27 51 35 44 20 90 37 51 25 25 51 63 61 82 91 51 74 20 66 25 51 66 46 37 25 82 37 44 82 82 46 66 44 48 66 14 20, 82 66 14 37 51 46 66 10 46 66 46 39 10 82 46 39 37 24 37 44 20 59 10 18 35 51 91 20;

→ Ссылка