← Назад к вопросам

Какие знаешь типы шифрования?

2.3 Middle🔥 112 комментариев
#Безопасность

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Типы шифрования в Go и общая классификация

В контексте собеседования на позицию Go-разработчика важно понимать не только абстрактные типы шифрования, но и их практическую реализацию в экосистеме Go. Шифрование можно классифицировать по нескольким критериям: симметричное vs асимметричное, блочное vs поточное, а также по назначению - для конфиденциальности, аутентификации или целостности данных.

1. Симметричное шифрование (Symmetric Encryption)

Симметричное шифрование использует один ключ для шифрования и расшифровки. Основные типы:

Блочные шифры (Block Ciphers)

Обрабатывают данные фиксированными блоками (обычно 64 или 128 бит):

  • AES (Advanced Encryption Standard) - современный стандарт, наиболее распространен
  • DES/3DES - устаревшие, не рекомендуются для новых систем
  • Blowfish, Twofish - альтернативные алгоритмы

Пример AES в Go:

package main

import (
    "crypto/aes"
    "crypto/cipher"
    "encoding/hex"
    "fmt"
)

func encryptAES(key, plaintext []byte) ([]byte, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }
    
    // Создаем GCM режим
    gcm, err := cipher.NewGCM(block)
    if err != nil {
        return nil, err
    }
    
    // Генерируем nonce
    nonce := make([]byte, gcm.NonceSize())
    
    // Шифруем
    ciphertext := gcm.Seal(nonce, nonce, plaintext, nil)
    return ciphertext, nil
}

Поточные шифры (Stream Ciphers)

Обрабатывают данные бит за битом:

  • ChaCha20 - современный, быстрый, используется в TLS 1.3
  • RC4 - устаревший, уязвимый

2. Асимметричное шифрование (Asymmetric Encryption)

Использует пару ключей: публичный для шифрования, приватный для расшифровки:

  • RSA - наиболее распространен, но медленный
  • ECC (Elliptic Curve Cryptography) - более эффективный, меньшие ключи
  • ElGamal - на основе дискретного логарифма

Пример RSA в Go:

package main

import (
    "crypto/rand"
    "crypto/rsa"
    "crypto/sha256"
    "fmt"
)

func rsaExample() {
    // Генерация ключей
    privateKey, _ := rsa.GenerateKey(rand.Reader, 2048)
    publicKey := &privateKey.PublicKey
    
    // Шифрование
    message := []byte("Секретное сообщение")
    label := []byte("")
    hash := sha256.New()
    
    ciphertext, _ := rsa.EncryptOAEP(hash, rand.Reader, publicKey, message, label)
    
    // Расшифровка
    plaintext, _ := rsa.DecryptOAEP(hash, rand.Reader, privateKey, ciphertext, label)
    
    fmt.Printf("Расшифровано: %s\n", plaintext)
}

3. Криптографические хэш-функции

Хоть и не являются шифрованием в строгом смысле, используются для целостности данных:

  • SHA-256, SHA-512 - семейство SHA-2
  • SHA-3 - новое поколение
  • MD5, SHA-1 - устаревшие, криптографически небезопасные

4. Гибридные системы

На практике чаще всего используются гибридные системы, сочетающие преимущества симметричного и асимметричного шифрования:

  1. Асимметричное шифрование для обмена симметричным ключом
  2. Симметричное шифрование для основного обмена данными

5. Режимы работы блочных шифров

Важно понимать режимы работы для блочных шифров:

  • ECB (Electronic Codebook) - небезопасный, не используйте
  • CBC (Cipher Block Chaining) - требует IV (вектор инициализации)
  • GCM (Galois/Counter Mode) - наиболее рекомендуемый, обеспечивает и конфиденциальность, и аутентификацию
  • CTR (Counter Mode) - превращает блочный шифр в поточный

6. Криптография в современных протоколах

В Go разработке практически всегда используются высокоуровневые конструкции:

  • TLS/SSL - через пакет crypto/tls
  • Подписи - через crypto/ed25519, crypto/ecdsa
  • Аутентифицированное шифрование - через crypto/cipher.NewGCM

Ключевые пакеты Go для работы с шифрованием:

  • crypto/aes, crypto/des - симметричное шифрование
  • crypto/rsa, crypto/elliptic - асимметричное шифрование
  • crypto/cipher - режимы работы шифров
  • crypto/rand - криптографически безопасный генератор случайных чисел
  • golang.org/x/crypto - дополнительные алгоритмы (ChaCha20, Poly1305 и др.)

Важное предупреждение: Не реализуйте собственные криптографические алгоритмы для production-систем. Всегда используйте проверенные реализации из стандартной библиотеки или пакетов x/crypto. Также критически важно правильно управлять жизненным циклом ключей, использовать криптографически безопасные генераторы случайных чисел и актуальные, рекомендованные алгоритмы (например, предпочитать AES-256-GCM и ChaCha20-Poly1305 устаревшим алгоритмам).

На собеседовании также стоит упомянуть понимание PFS (Perfect Forward Secrecy) в контексте TLS, различия между шифрованием и хэшированием, а также важность аутентифицированного шифрования (AEAD) в современных системах, что в Go реализуется через GCM, ChaCha20-Poly1305 и другие AEAD-конструкции.

Какие знаешь типы шифрования? | PrepBro