🔐 Что такое DES - шифрование и как работает?
💡 DES (Data Encryption Standard)
DES — симметричный алгоритм шифрования, разработанный в 1970-х. Он использует один и тот же ключ для шифрования и дешифрования, поэтому ключ нужно хранить в секрете.
Длина ключа: 56 бит
Блоки данных: 64 бита
Основан на 16 раундах перестановок и подстановок
Хотя DES считается устаревшим из-за своей уязвимости (его можно взломать брутфорсом за считанные часы), он до сих пор используется в учебных целях и в некоторых устаревших системах.
🐍 Пример использования DES на Python
Для работы с DES в Python можно использовать библиотеку PyCryptodome.
Пример простого шифрования текста:
✅ Важно:
Ключ должен быть ровно 8 байт (DES = 64-битный ключ, но 8 бит используются для контроля чётности).
Данные должны быть кратны 8 байтам, поэтому часто используется padding (дополнение пустыми байтами).
⚠️ Почему DES больше не рекомендуют?
Маленький размер ключа → легко перебрать с помощью современных вычислительных мощностей.
Уязвим к атакам (например, differential cryptanalysis).
Сегодня вместо DES чаще используют AES (Advanced Encryption Standard), который безопаснее и быстрее.
✍️ Вывод
Шифрование — важнейший инструмент защиты данных. DES — классический пример симметричного шифрования, но сегодня он больше используется в учебных целях или для совместимости с устаревшими системами. Если нужна настоящая защита, выбирайте современные алгоритмы, такие как AES.
💡 DES (Data Encryption Standard)
DES — симметричный алгоритм шифрования, разработанный в 1970-х. Он использует один и тот же ключ для шифрования и дешифрования, поэтому ключ нужно хранить в секрете.
Длина ключа: 56 бит
Блоки данных: 64 бита
Основан на 16 раундах перестановок и подстановок
Хотя DES считается устаревшим из-за своей уязвимости (его можно взломать брутфорсом за считанные часы), он до сих пор используется в учебных целях и в некоторых устаревших системах.
🐍 Пример использования DES на Python
Для работы с DES в Python можно использовать библиотеку PyCryptodome.
Пример простого шифрования текста:
from Crypto.Cipher import DES
from Crypto.Util.Padding import pad, unpad
# Ключ должен быть ровно 8 байт
key = b'8bytekey'
cipher = DES.new(key, DES.MODE_ECB)
data = b'HelloWorld123' # Длина должна быть кратной 8, иначе нужно дополнить
padded_data = pad(data, 8 )
encrypted = cipher.encrypt(padded_data)
print("Зашифрованные данные:", encrypted)
# Дешифрование
decrypted = unpad(cipher.decrypt(encrypted), 8 )
print("Расшифрованные данные:", decrypted)
✅ Важно:
Ключ должен быть ровно 8 байт (DES = 64-битный ключ, но 8 бит используются для контроля чётности).
Данные должны быть кратны 8 байтам, поэтому часто используется padding (дополнение пустыми байтами).
⚠️ Почему DES больше не рекомендуют?
Маленький размер ключа → легко перебрать с помощью современных вычислительных мощностей.
Уязвим к атакам (например, differential cryptanalysis).
Сегодня вместо DES чаще используют AES (Advanced Encryption Standard), который безопаснее и быстрее.
✍️ Вывод
Шифрование — важнейший инструмент защиты данных. DES — классический пример симметричного шифрования, но сегодня он больше используется в учебных целях или для совместимости с устаревшими системами. Если нужна настоящая защита, выбирайте современные алгоритмы, такие как AES.
@pythonl
Please open Telegram to view this post
VIEW IN TELEGRAM
🛠 Werkzeug — набор утилит для WSGI-приложений на Python
Пока все говорят о Flask, его мозги — библиотека Werkzeug, остается в тени. Этот инструмент уровня middleware лежит в основе многих Python-фреймворков, предоставляя базовые механизмы работы с HTTP-запросами, маршрутизацией и сессиями без навязывания архитектуры.
В Werkzeug нет ORM или шаблонизатора, но зато есть:
▪️Интерактивный дебаггер с REPL прямо в браузере
▪️Гибкая система роутинга (которую позже заимствовал Flask)
▪️WSGI-сервер для разработки с горячей перезагрузкой
🤖 GitHub
@pythonl
Пока все говорят о Flask, его мозги — библиотека Werkzeug, остается в тени. Этот инструмент уровня middleware лежит в основе многих Python-фреймворков, предоставляя базовые механизмы работы с HTTP-запросами, маршрутизацией и сессиями без навязывания архитектуры.
В Werkzeug нет ORM или шаблонизатора, но зато есть:
▪️Интерактивный дебаггер с REPL прямо в браузере
▪️Гибкая система роутинга (которую позже заимствовал Flask)
▪️WSGI-сервер для разработки с горячей перезагрузкой
🤖 GitHub
@pythonl
Media is too big
VIEW IN TELEGRAM
1989-12 — Гвидо ван Россум, работая в CWI (Нидерланды), начинает писать новый язык как «лучший ABC».
1991-02 — Публикация Python 0.9.0 в
alt.sources
; уже есть классы, исключения и базовые коллекции. 1994-01-26 — Выходит Python 1.0.0: добавлены
lambda
, map
, filter
, reduce
. 1994-02 — Создана группа новостей
comp.lang.python
, вокруг которой формируется сообщество. 2000-10-16 — Python 2.0: list-comprehensions, сборщик циклического мусора, первая реализация Unicode.
2003-07-29 — Python 2.3: внедрён сортировщик Timsort.
2008-12-03 — Python 3.0 («Py3k»): переход на новый
str`/`bytes
, print()
как функция, разделённый range
. 2010-07-03 — Python 2.7: «долгожитель», поддержка продлена до 2020-01-01.
2015-09-13 — Python 3.5: появляется синтаксис
async
/ await
. 2018-07-12 — Гвидо объявляет о выходе с поста BDFL после споров вокруг оператора «морж»
:=
. 2019-10-14 — Python 3.8: тот самый оператор
:=
, позиционные-только аргументы /
и улучшенный typing
. 2020-01-01 — Официальный End-of-Life ветки 2.x.
2021-10-04 — Python 3.10: структурное сопоставление
match/case
. 2023-10-02 — Python 3.12: заметное ускорение интерпретатора (до +25 %), префиксные f-строки.
2024-10-07 — Python 3.13.0: экспериментальная сборка Free-Threaded CPython без GIL (PEP 703).
2025-04-08 — Python 3.13.3 (текущая стабильная версия).
2025-10 (ожидается) — Python 3.14: дальнейшая стабилизация «без-GIL»-сборки, новый `buffer`-API.
---
### Интересные факты
- Название появилось благодаря юмористическому шоу *Monty Python’s Flying Circus*; отсюда мемы «spam / eggs».
- Команда
import this
выводит Zen of Python — 19 однострочных принципов языка (PEP 20). - Пасхалка
import antigravity
открывает комикс xkcd #353; from __future__ import braces
выдаёт SyntaxError: not a chance
. - Timsort, написанный для Python 2.3, позже стал дефолтным алгоритмом сортировки в Java 7, Android, Swift и Rust.
- PEP 703 позволяет собирать CPython без GIL, открывая путь к настоящему многопоточному Python без радикального «Python 4».
- В апреле 2025 Python обновил рекорд индекса TIOBE, превысив 25 % и почти втрое обогнав C++.
- Гвидо носил титул BDFL (Benevolent Dictator For Life) почти 30 лет; c 2023 г. он возвращён как *BDFL-Emeritus*.
- PyPI (Python Package Index) превысил 500 000 пакетов, а
pip install
скачивается около 40 млрд раз в месяц (апрель 2025). -
import __hello__
просто печатает *Hello world!* — напоминание, что «явное лучше неявного».> Итог: за три с лишним десятилетия Python превратился из рождественского хобби-проекта в язык № 1, оставаясь при этом дружелюбным и легко читаемым .
https://www.youtube.com/shorts/ZDMz1foKKlM?feature=share
@pythonl
Please open Telegram to view this post
VIEW IN TELEGRAM
📡 FISSURE — фреймворк для анализа и реверс-инжиниринга радиосигналов.
Этот open-source проект объединяет инструменты для работы с RF-сигналами: от обнаружения и классификации до атак и автоматизированного тестирования.
Инструмент поддерживает популярное SDR-оборудование и возможность развертывания распределённых сенсорных узлов для задач радиомониторинга. Проект активно развивается, в 2024 году добавили Z-Wave-анализ и автоматические триггеры для атак.
🤖 GitHub
@pythonl
Этот open-source проект объединяет инструменты для работы с RF-сигналами: от обнаружения и классификации до атак и автоматизированного тестирования.
Инструмент поддерживает популярное SDR-оборудование и возможность развертывания распределённых сенсорных узлов для задач радиомониторинга. Проект активно развивается, в 2024 году добавили Z-Wave-анализ и автоматические триггеры для атак.
🤖 GitHub
@pythonl
🐍 Задача с подвохом: Декораторы и мутабельные ловушки
Условие:
Что выведет следующий код и почему?
❓ Вопрос:
Что будет выведено? Где здесь двойной подвох?
🔍 Разбор:
На первый взгляд кажется, что:
1.
2.
3.
Но тут два подвоха:
Подвох №1: изменяемый аргумент по умолчанию
Аргумент
Подвох №2: кэширование по ключу
Декоратор
🧮 Что реально произойдёт:
- `res1 = add_to_list(1)` → функция вызвана, список становится `[1]`
- `res2 = add_to_list(2)` → функция вызвана снова (новый аргумент), список становится `[1, 2]`
- `res3 = add_to_list(1)` → аргумент `1` есть в кэше, сработает ветка `print("Из кэша")` и вернётся **ссылку на тот же изменённый список**
🔢 **Вывод:**
```
[1, 2]
[1, 2]
Из кэша
[1, 2]
```
Все результаты указывают на один и тот же изменённый список.
💥 **Почему это важно:**
1️⃣ **Изменяемые аргументы по умолчанию** сохраняются между вызовами
2️⃣ **Кэширование мутабельных объектов** может привести к неожиданным результатам: при возврате списка вы возвращаете не "результат на момент вычисления", а ссылку на объект, который может измениться позже
🛡️ **Как исправить:**
1️⃣ Использовать `lst=None` и инициализировать внутри функции:
```python
def add_to_list(val, lst=None):
if lst is None:
lst = []
lst.append(val)
return lst
```
2️⃣ Если кэшировать мутабельные объекты, лучше возвращать **копию**:
```python
import copy
cache[arg] = copy.deepcopy(result)
```
✅ **Вывод:**
Декораторы + мутабельные аргументы = ловушка даже для опытных разработчиков. Особенно, когда мутабельные объекты кэшируются и меняются за кулисами.
@pythonl
Условие:
Что выведет следующий код и почему?
def memoize(fn):
cache = {}
def wrapper(arg):
if arg in cache:
print("Из кэша")
return cache[arg]
else:
result = fn(arg)
cache[arg] = result
return result
return wrapper
@memoize
def add_to_list(val, lst=[]):
lst.append(val)
return lst
res1 = add_to_list(1)
res2 = add_to_list(2)
res3 = add_to_list(1)
print(res1)
print(res2)
print(res3)
❓ Вопрос:
Что будет выведено? Где здесь двойной подвох?
🔍 Разбор:
На первый взгляд кажется, что:
1.
add_to_list(1)
вернёт [1]
2.
add_to_list(2)
вернёт [2]
3.
add_to_list(1)
снова вызовет функцию (или достанет из кэша)Но тут два подвоха:
Подвох №1: изменяемый аргумент по умолчанию
Аргумент
lst=[]
создаётся один раз при определении функции. Все вызовы без передачи списка будут использовать один и тот же список.Подвох №2: кэширование по ключу
Декоратор
memoize
кэширует результат по ключу arg
. Но функция возвращает список, который изменяется при каждом вызове. Даже если кэш сработает, вы получите тот же объект списка, который менялся между вызовами!🧮 Что реально произойдёт:
- `res1 = add_to_list(1)` → функция вызвана, список становится `[1]`
- `res2 = add_to_list(2)` → функция вызвана снова (новый аргумент), список становится `[1, 2]`
- `res3 = add_to_list(1)` → аргумент `1` есть в кэше, сработает ветка `print("Из кэша")` и вернётся **ссылку на тот же изменённый список**
🔢 **Вывод:**
```
[1, 2]
[1, 2]
Из кэша
[1, 2]
```
Все результаты указывают на один и тот же изменённый список.
💥 **Почему это важно:**
1️⃣ **Изменяемые аргументы по умолчанию** сохраняются между вызовами
2️⃣ **Кэширование мутабельных объектов** может привести к неожиданным результатам: при возврате списка вы возвращаете не "результат на момент вычисления", а ссылку на объект, который может измениться позже
🛡️ **Как исправить:**
1️⃣ Использовать `lst=None` и инициализировать внутри функции:
```python
def add_to_list(val, lst=None):
if lst is None:
lst = []
lst.append(val)
return lst
```
2️⃣ Если кэшировать мутабельные объекты, лучше возвращать **копию**:
```python
import copy
cache[arg] = copy.deepcopy(result)
```
✅ **Вывод:**
Декораторы + мутабельные аргументы = ловушка даже для опытных разработчиков. Особенно, когда мутабельные объекты кэшируются и меняются за кулисами.
@pythonl