Симметричное и асимметричное шифрование: Выбор правильного подхода
Криптография делится на два основных типа шифрования: симметричное и асимметричное. Понимание различий между ними критически важно для построения безопасных систем.
Основные различия
Симметричное шифрование
- Один ключ для шифрования и расшифровки
- Высокая скорость обработки данных
- Эффективно для больших объемов данных
- Проблема: безопасная передача ключа
Асимметричное шифрование
- Пара ключей: публичный и приватный
- Медленнее симметричного шифрования
- Решает проблему передачи ключей
- Идеально для цифровых подписей и обмена ключами
Симметричное шифрование
Принцип работы
# Простая аналогия
ключ = "СЕКРЕТНЫЙ_КОД"
зашифрованное_сообщение = шифровать(сообщение, ключ)
расшифрованное_сообщение = расшифровать(зашифрованное_сообщение, ключ)
Основные алгоритмы и создатели
1. AES (Advanced Encryption Standard)
- Создатель: Винсент Рэймен и Йоан Даймен (Бельгия)
- Год: 2001 (выбран NIST как стандарт)
- Размеры ключа: 128, 192, 256 бит
- Тип: Блочный шифр
- Использование: SSL/TLS, VPN, шифрование дисков
<?php
// Пример AES в PHP
$data = "Секретные данные";
$key = random_bytes(32); // AES-256
$iv = random_bytes(16);
$encrypted = openssl_encrypt($data, 'aes-256-cbc', $key, 0, $iv);
$decrypted = openssl_decrypt($encrypted, 'aes-256-cbc', $key, 0, $iv);
2. ChaCha20
- Создатель: Дэниел Бернштейн (США)
- Год: 2008
- Тип: Поточный шифр
- Преимущество: Высокая скорость на мобильных устройствах
- Использование: TLS 1.3, современные VPN
3. Salsa20
- Создатель: Дэниел Бернштейн
- Год: 2005
- Предшественник ChaCha20
4. 3DES (Triple DES)
- Основан на: DES (1970-е)
- Создатель IBM, доработан NIST
- Сейчас: Устарел, не рекомендуется
5. Blowfish
- Создатель: Брюс Шнайер
- Год: 1993
- Преемник: Twofish
Асимметричное шифрование
Принцип работы
# Генерация пары ключей
приватный_ключ, публичный_ключ = сгенерировать_пару_ключей()
# Шифрование публичным ключом
зашифрованное = шифровать(сообщение, публичный_ключ)
# Расшифровка приватным ключом
расшифрованное = расшифровать(зашифрованное, приватный_ключ)
Основные алгоритмы и создатели
1. RSA (Rivest–Shamir–Adleman)
- Создатели: Рон Ривест, Ади Шамир, Леонард Адлеман (MIT)
- Год: 1977
- Основа: Проблема факторизации больших чисел
- Размеры ключа: 2048, 3072, 4096 бит
- Использование: SSL/TLS, PGP, цифровые подписи
<?php
// Пример генерации RSA ключей в PHP
$config = array(
"private_key_bits" => 2048,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
);
// Генерация пары ключей
$keyPair = openssl_pkey_new($config);
// Экспорт приватного ключа
openssl_pkey_export($keyPair, $privateKey);
// Получение публичного ключа
$publicKey = openssl_pkey_get_details($keyPair)['key'];
2. ECC (Elliptic Curve Cryptography)
- Теоретическая основа: Нил Коблиц, Виктор Миллер (1985)
- Практическое применение: с 2000-х
- Преимущество: Меньшие ключи при той же безопасности
- Алгоритмы: ECDSA, ECDH, EdDSA
3. ElGamal
- Создатель: Тахар Эль-Гамаль
- Год: 1985
- Основа: Проблема дискретного логарифмирования
- Использование: PGP, GnuPG
4. DSA (Digital Signature Algorithm)
- Создатель: NIST
- Год: 1991
- Специализация: Только для цифровых подписей
Сравнительная таблица
| Параметр | Симметричное | Асимметричное |
|---|---|---|
| Количество ключей | 1 | 2 (публичный + приватный) |
| Скорость | Высокая | Медленная (в 100-1000 раз медленнее) |
| Размер ключа | 128-256 бит | 2048-4096 бит (RSA) |
| Безопасность | Зависит от секретности ключа | Зависит от сложности математических задач |
| Использование | Шифрование данных | Обмен ключами, цифровые подписи |
Сравнение размеров ключей
| Алгоритм | Размер ключа | Эквивалентная стойкость |
|---|---|---|
| AES-128 | 128 бит | 3072-бит RSA |
| AES-256 | 256 бит | 15360-бит RSA |
| RSA | 2048 бит | 112-бит симметричный |
| ECC | 256 бит | 128-бит симметричный |
Когда какое шифрование использовать?
Используйте симметричное шифрование когда:
1. Шифрование больших объемов данных
<?php
// Шифрование файла с помощью AES
function encryptFile(string $inputFile, string $outputFile, string $key): void {
$iv = random_bytes(16);
$cipherText = openssl_encrypt(
file_get_contents($inputFile),
'aes-256-cbc',
$key,
OPENSSL_RAW_DATA,
$iv
);
file_put_contents($outputFile, $iv . $cipherText);
}
2. Шифрование баз данных
-- Пример: шифрование поля в базе данных
UPDATE users SET
credit_card = AES_ENCRYPT('4111111111111111', 'encryption_key')
WHERE id = 1;
3. VPN туннели
OpenVPN, WireGuard используют симметричное шифрование
для защиты всего трафика через туннель
4. Дисковое шифрование
BitLocker, LUKS, FileVault используют AES
для шифрования целых разделов диска
Используйте асимметричное шифрование когда:
1. Безопасный обмен ключами
<?php
// Гибридный подход: асимметричное + симметричное
class SecureMessage {
public static function send($message, $recipientPublicKey): string {
// 1. Генерируем случайный симметричный ключ
$sessionKey = random_bytes(32);
// 2. Шифруем сообщение симметричным ключом
$encryptedMessage = openssl_encrypt(
$message,
'aes-256-gcm',
$sessionKey,
OPENSSL_RAW_DATA,
$iv,
$tag
);
// 3. Шифруем симметричный ключ асимметрично
openssl_public_encrypt($sessionKey, $encryptedKey, $recipientPublicKey);
return base64_encode($encryptedKey) . ':' .
base64_encode($iv) . ':' .
base64_encode($encryptedMessage) . ':' .
base64_encode($tag);
}
}
2. Цифровые подписи
<?php
class DigitalSignature {
public static function sign($data, $privateKey): string {
openssl_sign($data, $signature, $privateKey, OPENSSL_ALGO_SHA256);
return base64_encode($signature);
}
public static function verify($data, $signature, $publicKey): bool {
return openssl_verify(
$data,
base64_decode($signature),
$publicKey,
OPENSSL_ALGO_SHA256
) === 1;
}
}
// Использование
$data = "Важный контракт";
$signature = DigitalSignature::sign($data, $privateKey);
$isValid = DigitalSignature::verify($data, $signature, $publicKey);
3. Аутентификация
SSH ключи, SSL/TLS сертификаты используют
асимметричное шифрование для проверки подлинности
4. Криптовалюты
Биткоин, Ethereum используют ECC (secp256k1)
для создания адресов и подписи транзакций
Гибридные системы: Лучшее из двух миров
Как работает SSL/TLS
<?php
// Упрощенная схема TLS handshake
class TLSHandshake {
public function performHandshake(): void {
// 1. Клиент отправляет ClientHello
$clientRandom = random_bytes(32);
// 2. Сервер отведает ServerHello + сертификат
$serverRandom = random_bytes(32);
$serverCertificate = $this->getServerCertificate();
// 3. Клиент проверяет сертификат
if (!$this->verifyCertificate($serverCertificate)) {
throw new Exception("Invalid certificate");
}
// 4. Клиент генерирует pre-master secret
$preMasterSecret = random_bytes(48);
// 5. Шифруем pre-master secret публичным ключом сервера
$encryptedPreMaster = $this->encryptWithPublicKey(
$preMasterSecret,
$serverCertificate['publicKey']
);
// 6. Обе стороны вычисляют master secret
$masterSecret = $this->computeMasterSecret(
$preMasterSecret,
$clientRandom,
$serverRandom
);
// 7. Генерация симметричных ключей из master secret
$sessionKeys = $this->generateSessionKeys($masterSecret);
// 8. Дальнейшая коммуникация использует симметричное шифрование
$this->startEncryptedCommunication($sessionKeys);
}
}
Практический пример: Защищенный мессенджер
<?php
class SecureMessenger {
private $sessionKey;
private $iv;
public function __construct(
private string $myPrivateKey,
private string $theirPublicKey
) {}
public function establishSession(): void {
// Генерация сессионного ключа
$this->sessionKey = random_bytes(32);
$this->iv = random_bytes(16);
// Шифруем сессионный ключ для получателя
openssl_public_encrypt(
$this->sessionKey,
$encryptedSessionKey,
$this->theirPublicKey
);
// В реальности отправили бы $encryptedSessionKey получателю
file_put_contents('session_key.bin', $encryptedSessionKey);
}
public function encryptMessage(string $message): string {
return openssl_encrypt(
$message,
'aes-256-gcm',
$this->sessionKey,
OPENSSL_RAW_DATA,
$this->iv,
$tag
) . ':' . base64_encode($tag);
}
public function decryptMessage(string $encryptedMessage): string {
list($ciphertext, $tag) = explode(':', $encryptedMessage);
return openssl_decrypt(
$ciphertext,
'aes-256-gcm',
$this->sessionKey,
OPENSSL_RAW_DATA,
$this->iv,
base64_decode($tag)
);
}
}
Рекомендации по выбору алгоритмов
Для симметричного шифрования (2024+)
- Рекомендуется: AES-256-GCM, ChaCha20-Poly1305
- Допустимо: AES-128-GCM
- Избегать: DES, 3DES, RC4
Для асимметричного шифрования (2024+)
- Рекомендуется: ECC (P-256, Curve25519), RSA-3072+
- Допустимо: RSA-2048
- Избегать: RSA-1024, DSA
Для хеширования
- Рекомендуется: SHA-256, SHA-3, BLAKE2
- Избегать: MD5, SHA-1
Исторические вехи криптографии
- 1976: Диффи-Хеллман - первый протокол асимметричного шифрования
- 1977: RSA - первая практическая асимметричная система
- 1977: DES - первый стандарт симметричного шифрования
- 1991: PGP - первая доступная система шифрования для масс
- 2001: AES - современный стандарт симметричного шифрования
- 2008: Биткоин - массовое применение ECC в криптовалютах
Заключение
Симметричное шифрование - ваш выбор для эффективного шифрования данных, когда ключ можно безопасно передать.
Асимметричное шифрование - решает проблему распределения ключей и обеспечивает цифровые подписи.
На практике всегда используйте гибридный подход:
- Асимметричное для установления сессии и аутентификации
- Симметричное для шифрования основного трафика
Правильное понимание и применение обоих типов шифрования - основа построения безопасных современных систем.
Интересуетесь практическим применением шифрования? Читайте наши статьи о GPG шифровании и SSL/TLS настройке.