[Документация Yandex Cloud](../../index.md) > [Yandex Key Management Service](../index.md) > [Концепции](index.md) > Асимметричное шифрование > Асимметричное шифрование

# Асимметричное шифрование в KMS

Одна из доступных схем шифрования в KMS — _асимметричное шифрование_. По этой схеме шифрование выполняется с помощью открытого ключа (Public key) асимметричной ключевой пары (криптопары), а расшифрование — с помощью ее закрытого ключа (Private key). Key Management Service позволяет выгружать открытый ключ для шифрования текста на стороне клиента. Расшифровать такой текст в KMS можно с использованием закрытого ключа ключевой пары. Получить прямой доступ к закрытому ключу в KMS нельзя.

Каждая ключевая пара соответствует одному ключу в [квотах](limits.md#kms-quotas) KMS.

## Получение открытого ключа ключевой пары {#acquire-public-key}

Чтобы зашифровать сообщение, необходимо получить в KMS открытый ключ. Для этого нужно создать запрос к сервису с помощью [CLI](../../cli/cli-ref/kms/cli-ref/asymmetric-encryption-crypto/get-public-key.md) или [API](../asymmetricencryption/api-ref/grpc/AsymmetricEncryptionCrypto/getPublicKey.md).

Чтобы получить открытый ключ шифрования ключевой пары, пользователю или сервисному аккаунту необходимо [назначить роль](../operations/key-access.md) `kms.asymmetricEncryptionKeys.publicKeyViewer` на ключевую пару.

## Шифрование данных {#encryption}

Шифрование данных выполняется вне сервиса Key Management Service. Для операции шифрования необходим [открытый ключ](#acquire-public-key) асимметричной ключевой пары шифрования.

Чтобы зашифровать сообщение, можно воспользоваться утилитой [OpenSSL](https://www.openssl.org/).

```bash
openssl pkeyutl \
  -in <путь_к_файлу_с_сообщением> \
  -encrypt \
  -pubin \
  -inkey <путь_к_файлу_с_открытым_ключом> \
  -pkeyopt rsa_padding_mode:oaep \
  -pkeyopt rsa_oaep_md:sha256 \
  -pkeyopt rsa_mgf1_md:sha256 | base64
```

Где:
* `-in` — путь к файлу с сообщением, которое требуется зашифровать.
* `-inkey` — путь к файлу, содержащему открытый ключ шифрования.
  
Хэш-функция указана в конце выбранного ключа. При шифровании используется только `sha256`. Сервис KMS принимает зашифрованный текст в кодировке `base64` и расшифровывает его с помощью закрытого ключа.

Максимальный размер шифруемого сообщения зависит от длины ключа шифрования и длины хэш-функции ([RFC2437](https://datatracker.ietf.org/doc/html/rfc2437#section-7.1)). Максимальный размер сообщения можно вычислить по формуле:

```text
<длина_сообщения> = (k - 2) - 2 × hashLength
```

Где:
* `<длина_сообщения>` — длина шифруемого сообщения в байтах.
* `k` — длина ключа шифрования в байтах.
* `hashLength` — длина хэш-функции в байтах.

| **Алгоритм** | **Параметры** | **Макс. длина сообщения** |
| --- | --- | --- |
| `RSA_2048_ENC_OAEP_SHA_256` | `k`=256, `hashLength`=32 | 190 байт |
| `RSA_3072_ENC_OAEP_SHA_256` | `k`=384, `hashLength`=32 | 318 байт |
| `RSA_4096_ENC_OAEP_SHA_256` | `k`=512, `hashLength`=32 | 446 байт |

## Расшифрование данных {#decryption}

Расшифровать данные можно с помощью закрытого ключа ключевой пары в сервисе Key Management Service. Для этого нужно создать запрос к сервису с помощью [CLI](../../cli/cli-ref/kms/cli-ref/asymmetric-encryption-crypto/decrypt.md) или [API](../asymmetricencryption/api-ref/grpc/AsymmetricEncryptionCrypto/decrypt.md).

Чтобы расшифровать данные, пользователю или сервисному аккаунту необходимо [назначить роль](../operations/key-access.md) `kms.asymmetricEncryptionKeys.decrypter` на ключевую пару шифрования.