2024 [8-10] Исходный код
В связи с усилением требований к защите данных, руководство компании решило разработать алгоритм шифрования для безопасной передачи сообщений, которая должна шифровать конфиденциальные данные перед отправкой по сети. Алгоритм основан на принципе блочного шифрования и работает с текстами фиксированной длины в байтах.
Разработчики по ошибке опубликовали код функции шифрования в публичном репозитории (листинг 1). Зная исходный код и перехваченные зашифрованные данные определите исходное сообщение. В ответе укажите исходное сообщение и обоснуйте алгоритм дешифрования.
Зашифрованное сообщение:
122 72 127 124 81 93 96 122 81 74 65 117 91 85 113 94 118 170 170
Листинг 1. Функция шифрования на различных языках программирования
|
Python
|
|
def encrypt(text, key):
encrypted = []
for i, char in enumerate(text):
encrypted.append(
(ord(char)+i)^key )
return encrypted
|
|
C
|
|
char* encrypt(char* text, char key)
{
char *encrypted = new char[strlen(text)+1];
for (int i = 0; i < strlen(text); i++)
encrypted[i] = (text[i] + i) ^ key;
encrypted[strlen(text)] = '\0';
return encrypted;
}
|
|
С++
|
|
std::string encrypt(std::string text, char key)
{
std::string encrypted = "";
for (int i = 0; i < text.length(); i++)
encrypted[i] = (text[i] + i) ^ key;
return encrypted;
}
|
Показать подсказку
1. Какой размер ключа?
2. Что делать, если ключ неизвестен?
Показать решение
Для решения задания, необходимо проанализировать функцию шифрования, так как алгоритм дешифрования – обратная функция шифрованию. Если переводить в математическую модель, то алгоритм шифрования будет иметь следующий вид:
Сi = (ord(Pi)+i) Å key,
где:
Сi – зашифрованный код символа на позиции i,
Pi – символ на позиции i в исходной строке,
i – индекс символа (позиция в строке),
ord(Pi) – код символа Pi,
key – ключ шифрования,
Å – операция XOR.
Тогда формула для расшифровки будет иметь следующий вид:
Pi = chr((Ci Å key) – i),
где:
Pi – расшифрованный символ на позиции i,
Сi – зашифрованный символ на позиции i,
chr() – преобразование числового значения обратно в символ,
ord(Pi) – код символа Pi,
key – ключ шифрования,
Å – операция XOR.
Поскольку ключ неизвестен, но он занимает всего 1 байт, его можно перебрать так, чтобы на выходе получалось осмысленное текстовое сообщение.
Видоизмененный код будет следующим:
def decrypt(encrypted, key):
decrypted = ""
for i, code in enumerate(encrypted):
decrypted += chr((code ^ key) - i)
return decrypted
encrypted_message_str = input("Введите зашифрованное сообщение (список чисел, разделенных запятыми): ")
encrypted_message = [int(x) for x in encrypted_message_str.split(",")]
for key in range(256):
decrypted_message = decrypt(encrypted_message, key)
print(f"Ключ: {key}, Сообщение: {decrypted_message}")
При запуске подбора было определено, что ключ шифрования равен 42, а исходное сообщение: PaSSwrDIsWaTerMeLon
Показать ответ
PaSSwrDIsWaTerMeLon
<< Назад в раздел (Все задания)