Протокол S/MIME и структура данных CMS

## Протокол 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”, который автоматически включает необходимые расширения для защиты почты. В производственной среде могут применяться отдельные шаблоны для подписи и шифрования.