## Протокол S/MIME
**S/MIME (Secure/Multipurpose Internet Mail Extensions)** — стандарт для защиты сообщений электронной почты с использованием криптографии с открытым ключом. Протокол обеспечивает:
– **Аутентификацию отправителя** — подтверждение того, что сообщение действительно отправлено указанным лицом.
– **Целостность сообщения** — гарантия того, что содержимое не было изменено при передаче.
– **Невозможность отказа от авторства (Non-repudiation)** — отправитель не может отрицать факт отправки подписанного сообщения.
– **Конфиденциальность** — шифрование содержимого сообщения так, что прочитать его может только предполагаемый получатель.
> [!summary] Простыми словами
> S/MIME работает как “цифровая печать” и “конверт” для электронных писем. Печать (цифровая подпись) подтверждает, кто отправил письмо и что его не меняли. Конверт (шифрование) скрывает содержимое от посторонних глаз.
## Структура данных CMS
**CMS (Cryptographic Message Syntax)** — стандарт формата для криптографически защищённых сообщений, определённый в RFC 5652. S/MIME использует CMS для упаковки подписанных и зашифрованных данных.
### Основные типы контента CMS
| Тип контента | Описание | Использование в S/MIME |
| — | — | — |
| `data` | Произвольные данные без криптографической защиты | Исходное сообщение перед обработкой |
| `signedData` | Данные с цифровой подписью и сертификатами | Подписанное, но не зашифрованное сообщение |
| `envelopedData` | Зашифрованные данные для одного или нескольких получателей | Зашифрованное сообщение |
| `signedAndEnvelopedData` | Данные, одновременно подписанные и зашифрованные | Полностью защищённое сообщение |
| `digestedData` | Данные с хеш-суммой (без подписи) | Контроль целостности без аутентификации |
| `encryptedData` | Зашифрованные данные без информации о получателях | Симметричное шифрование |
### Порядок операций: подпись и шифрование
При защите сообщения возможны два основных порядка операций:
Вариант А: Сначала подпись, потом шифрование
1. Вычисляется хеш сообщения: H = Hash(data)
2. Хеш подписывается закрытым ключом отправителя: Sig = Sign(H, PrivKey_sender)
3. Сообщение и подпись упаковываются: SignedMsg = {data, Sig, Cert_sender}
4. SignedMsg шифруется открытым ключом получателя: EncryptedMsg = Encrypt(SignedMsg, PubKey_recipient)
Вариант Б: Сначала шифрование, потом подпись
1. Сообщение шифруется: EncryptedData = Encrypt(data, PubKey_recipient)
2. Хеш зашифрованных данных подписывается: Sig = Sign(Hash(EncryptedData), PrivKey_sender)
3. Результат упаковывается: {EncryptedData, Sig, Cert_sender}
> [!attention] Важно
> В практике защиты почты чаще используется вариант **А** (сначала подпись, потом шифрование), так как он позволяет получателю сначала проверить подлинность отправителя, а затем расшифровать содержимое. Это также обеспечивает возможность независимой проверки подписи третьими сторонами при необходимости.
## Криптографические алгоритмы в S/MIME
### Алгоритмы подписи
| Алгоритм | Рекомендуемая длина ключа | Статус |
| — | — | — |
| RSA with SHA-256 | 2048 бит и более | Рекомендуется |
| RSA with SHA-384 | 2048 бит и более | Рекомендуется |
| RSA with SHA-1 | 2048 бит | Устарел, не рекомендуется |
| ECDSA with SHA-256 | 256 бит (P-256) | Рекомендуется |
### Алгоритмы шифрования
| Алгоритм | Режим | Длина ключа | Статус |
| — | — | — | — |
| AES | CBC, GCM | 128/256 бит | Рекомендуется |
| 3DES | CBC | 168 бит | Устарел, но поддерживается |
| RC2 | CBC | 128 бит | Не рекомендуется |
### Обмен ключами
Для шифрования сообщения используется гибридная схема:
1. Генерируется случайный сеансовый ключ (симметричный алгоритм, например, AES).
2. Сеансовым ключом шифруется само сообщение.
3. Сеансовый ключ шифруется открытым ключом получателя (асимметричный алгоритм, например, RSA).
4. В сообщение добавляется зашифрованный сеансовый ключ и сертификат отправителя.
> [!summary] Простыми словами
> Гибридное шифрование сочетает скорость симметричных алгоритмов (для больших данных) и удобство асимметричных (для безопасной передачи ключа). Это как отправить ценный груз в сейфе (симметричное шифрование), а ключ от сейфа — в отдельном защищённом конверте (асимметричное шифрование).
## Сертификаты для защиты почты
Для работы S/MIME сертификат пользователя должен содержать:
– **Extended Key Usage (EKU)** с OID `1.3.6.1.5.5.7.3.4` (Email Protection).
– **Key Usage** с флагами `digitalSignature` и `keyEncipherment` (или `keyAgreement`).
– **Subject Alternative Name (SAN)** с адресом электронной почты пользователя (например, `RFC822Name: user@example.com`).
> [!note] Примечание
> В лабораторной работе используется шаблон “Пользователь Exchange”, который автоматически включает необходимые расширения для защиты почты. В производственной среде могут применяться отдельные шаблоны для подписи и шифрования.