Кодирование — это не шифрование
Base64 выглядит как «зашифрованная абракадабра», но на самом деле не защищает ничего. Разберёмся почему.
Две разные операции
Очень частая ошибка новичков — считать, что любой нечитаемый набор символов «зашифрован». Это не так. Есть две принципиально разные вещи:
| Кодирование | Запись данных в другом формате. Не требует ключа. Обратимо для всех. |
| Шифрование | Защита данных ключом. Без ключа расшифровать нельзя. |
Кодирование нужно, чтобы данные удобно передавались (например, картинку упаковали в текст для письма). Оно не скрывает информацию — любой может раскодировать её обратно. Шифрование же создано именно для секретности.
Base64 — классический пример кодирования
Base64 превращает любые байты в набор из 64 безопасных символов (буквы, цифры, + и /). Это удобно для пересылки, но ключа здесь нет. Запустим и убедимся, что раскодировать может кто угодно:
import base64
message = "Привет, Боб!"
encoded = base64.b64encode(message.encode("utf-8"))
print("Закодировано:", encoded.decode())
decoded = base64.b64decode(encoded).decode("utf-8")
print("Раскодировано:", decoded)Вывод:
Закодировано: 0J/RgNC40LLQtdGCLCDQkdC+0LEh Раскодировано: Привет, Боб!
Обрати внимание: чтобы раскодировать, нам не понадобился никакой секрет. Достаточно знать, что это Base64. Если Ева перехватит такую строку, она прочитает сообщение за секунду.
Почему это важно понимать
В реальных приложениях иногда видят строку вроде eyJ1c2VyIjoiYWRtaW4ifQ== и думают, что данные «зашифрованы». На самом деле это часто просто Base64, и его содержимое открыто. Никогда не полагайся на кодирование для защиты паролей или личных данных.
А вот так выглядит настоящее шифрование
Сравним: добавим простейший «ключ», без которого раскодирование уже не сработает. Применим операцию XOR (исключающее ИЛИ) с секретным числом:
def xor_cipher(text, key):
return bytes(b ^ key for b in text.encode("utf-8"))
secret = xor_cipher("hello", 42)
print("Зашифровано (байты):", list(secret))
# Без ключа 42 расшифровать правильно не выйдет
wrong = bytes(b ^ 99 for b in secret)
right = bytes(b ^ 42 for b in secret)
print("Неверный ключ:", wrong.decode("utf-8", "replace"))
print("Верный ключ:", right.decode())Вывод:
Зашифровано (байты): [66, 79, 70, 70, 69] Неверный ключ: )$-- . Верный ключ: hello
Здесь без правильного ключа (42) текст не восстановить — это уже шифрование, хоть и очень слабое. Запомни главное правило: если для восстановления данных не нужен секрет — это кодирование, а не защита.