Ответ
Асимметричное шифрование (или криптография с открытым ключом) — это система, использующая пару ключей для шифрования данных: публичный и приватный.
- Публичный ключ можно свободно распространять. Он используется для шифрования данных и проверки цифровой подписи.
- Приватный ключ должен храниться в секрете. Он используется для расшифровки данных, зашифрованных публичным ключом, и для создания цифровой подписи.
Главный принцип: данные, зашифрованные одним ключом из пары, могут быть расшифрованы только другим ключом из этой же пары.
Применение в бэкенде:
- 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))
}
Чем хорошо? Тем, что не надо, как идиотам, передавать секретный ключ по открытому каналу. Публичный — пусть летает, с ним нихуя не сделаешь.
А чем плохо? Да тем, что оно, сука, медленное! Овердохуища медленнее, чем симметричное шифрование. Прям в сотни раз. Поэтому на практике часто комбинируют: асимметричным шифруют случайный симметричный ключ, а потом уже им гонят данные на скорости. Ёперный театр, но эффективно!