Что такое асимметричное шифрование и каковы его основные принципы?

Ответ

Асимметричное шифрование (или криптография с открытым ключом) — это система, использующая пару ключей для шифрования данных: публичный и приватный.

  • Публичный ключ можно свободно распространять. Он используется для шифрования данных и проверки цифровой подписи.
  • Приватный ключ должен храниться в секрете. Он используется для расшифровки данных, зашифрованных публичным ключом, и для создания цифровой подписи.

Главный принцип: данные, зашифрованные одним ключом из пары, могут быть расшифрованы только другим ключом из этой же пары.

Применение в бэкенде:

  • HTTPS/TLS: Установка безопасного соединения, когда сервер предоставляет свой публичный ключ клиенту.
  • SSH: Аутентификация пользователей по ключам.
  • JWT (JWS): Подпись токенов для подтверждения их подлинности.

Пример на Go (RSA-OAEP):

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

func main() {
    // 1. Генерация пары ключей
    privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
    if err != nil {
        panic(err)
    }
    publicKey := &privateKey.PublicKey

    message := []byte("очень секретное сообщение")

    // 2. Шифрование с помощью публичного ключа
    ciphertext, err := rsa.EncryptOAEP(
        sha256.New(),
        rand.Reader,
        publicKey,
        message,
        nil,
    )
    if err != nil {
        panic(err)
    }

    // 3. Расшифровка с помощью приватного ключа
    plaintext, err := rsa.DecryptOAEP(
        sha256.New(),
        rand.Reader,
        privateKey,
        ciphertext,
        nil,
    )
    if err != nil {
        panic(err)
    }

    fmt.Printf("Original: %sn", string(message))
    fmt.Printf("Decrypted: %sn", string(plaintext))
}

Преимущества:

  • Безопасный обмен ключами: Нет необходимости передавать секретный ключ по незащищенному каналу.

Недостатки:

  • Низкая производительность: Значительно медленнее (в сотни и тысячи раз), чем симметричное шифрование, из-за сложных математических вычислений.