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

Ответ

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

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

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

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

  • 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))
}

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

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

Недостатки:

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

Ответ 18+ 🔞

О, асимметричное шифрование, ёпта! Это ж та самая магия, где ключей аж два, и они, сука, друг без друга нихуя не могут. Представь себе сейф с двумя замочными скважинами — одна на всеобщем обозрении, а вторая только у тебя в кармане.

Вот смотри, как это работает, блядь:

  • Публичный ключ — это как твой адрес на конверте. Его можешь раздавать всем подряд, хоть на столбе расклей: «Шлите сюда свои тайные послания!». Им только запирают (шифруют).
  • Приватный ключ — это уже отмычка, которая только у тебя. Храни её как зеницу охуя, потому что только ей можно открыть (расшифровать) то, что прислали на твой публичный адрес.

Суть в чём, блядь? Что закроют одним ключом — откроется только другим. И наоборот. Красота, да? В рот меня чих-пых!

Где это в бэкенде применяется, спросишь? Да везде, сука!

  • HTTPS (TLS) — когда твой браузер цепляется к серверу, тот сразу вываливает свой публичный ключ: «На, шифруй, чё хочешь!». А расшифрует уже своим приватным.
  • SSH — чтобы заходить на сервера без паролей, по ключам. Подсовываешь свой публичный ключ серверу, а потом доказываешь, что у тебя есть приватный.
  • JWT-токены — их тоже часто подписывают приватным ключом, а любой желающий может проверить подпись публичным. Хитрая жопа, но работает.

А теперь, блядь, смотри на код. Вот тебе пример на Go, как это выглядит вживую. Код не трогаю, он и так красивый.

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))
}

Чем хорошо? Тем, что не надо, как идиотам, передавать секретный ключ по открытому каналу. Публичный — пусть летает, с ним нихуя не сделаешь.

А чем плохо? Да тем, что оно, сука, медленное! Овердохуища медленнее, чем симметричное шифрование. Прям в сотни раз. Поэтому на практике часто комбинируют: асимметричным шифруют случайный симметричный ключ, а потом уже им гонят данные на скорости. Ёперный театр, но эффективно!