Google Cloud KMS: ограничения размера открытого текста для шифрования с помощью ключа asymmetri c publi c - PullRequest
1 голос
/ 14 марта 2020

Привет, команда Google Cloud KMS. Существуют ли какие-либо ограничения в размере Google Cloud KMS в виде открытого текста для шифрования по типам ключей для асимметрии c и симметричных c ключей?

Поскольку мы хотели бы зашифровать / расшифровать поток REST между внешним интерфейсом (браузер) и бэкендом (микросервисы REST) ​​и хотели бы использовать подход Asymmetri c ( не Hybrid ):

  1. генерация пары ключей внешнего интерфейса Шифрование данных Открытый / закрытый ключи (с использованием javascript libs) - Шифрование данных Publi c ключ не шифруется KEK

  2. генерация пары ключей Backend. Шифрование данных. Открытые / закрытые ключи (с использованием баррикады в Google KMS) - шифрование данных. Publi c ключ не шифруется KEK

  3. обмен шифрованием данных. Публикуйте ключи c между Frontend и Backend, чтобы иметь возможность шифровать запросы от Frontend к Backend и ответы от Backend к Frontend назад

Мы хотели бы сохранить сгенерированный внешний интерфейс asymmetri c открытые / закрытые ключи во время сеанса некоторых вызовов (в браузере) и backend asymmetri c открытые / приватные ключи будут генерироваться Google KMS

Итак, есть ли Google C громкие ограничения размера открытого текста KMS для шифрования по типам ключей для асимметрии c ключ?

1 Ответ

3 голосов
/ 14 марта 2020

В дополнение к обсуждению того, каков наилучший для вас дизайн протокола, ответьте на конкретный вопрос c: максимальный размер полезной нагрузки для расшифровки RSA зависит от размера ключа и алгоритма заполнения. Все поддерживаемые в настоящее время форматы шифрования RSA используют OAEP, стандартизированный в RF C 2437 . Там вы увидите, что это сообщение:

длина строки октетов не более k-2-2hLen, где k - длина в октетах модуля n, а hLen - длина в октетах вывод хеш-функции для EME-OAEP

Таким образом, это приводит к следующим максимальным длинам для m:

RSA_DECRYPT_OAEP_2048_SHA256: k = 256; hLen = 32; maxMLen = 190
RSA_DECRYPT_OAEP_3072_SHA256: k = 384; hLen = 32; maxMLen = 318
RSA_DECRYPT_OAEP_4096_SHA256: k = 512; hLen = 32; maxMLen = 446
RSA_DECRYPT_OAEP_4096_SHA512: k = 512; hLen = 64; maxMLen = 382

Если вы попытаетесь зашифровать сообщение, превышающее этот предел, ваша клиентская сторона не сможет выполнить шифрование, поэтому нет никаких сомнений относительно того, что KMS будет делать с сообщением слишком длинным.

Вот мой тест для проверки того, что Cloud KMS может расшифровать сообщение до полной длины для 2048-битного ключа RSA:

# create an rsa2048-256 encryption key

tdierks@cloudshell:~ (kms-test-1367)$ gcloud kms keyrings create --location global so-60686427
tdierks@cloudshell:~ (kms-test-1367)$ gcloud kms keys create rsa-2048-256 --keyring so-60686427 --location global --purpose asymmetric-encryption --default-algorithm rsa-decrypt-oaep-2048-sha256
tdierks@cloudshell:~ (kms-test-1367)$ gcloud kms keys versions list --key rsa-2048-256 --keyring so-60686427 --location global
NAME                                                                                                      STATE
projects/kms-test-1367/locations/global/keyRings/so-60686427/cryptoKeys/rsa-2048-256/cryptoKeyVersions/1  ENABLED

# get the public key

tdierks@cloudshell:~ (kms-test-1367)$ gcloud kms keys versions get-public-key 1 --key rsa-2048-256 --keyring so-60686427 --location global > /tmp/rsa-2048-256.pub
tdierks@cloudshell:~ (kms-test-1367)$ cat /tmp/rsa-2048-256.pub
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyvN5iBbV7daXKocL0CuB
bM+gaPMEigS6N8Jl9g7AY7ocrvNDONBa5JZzJTuMkNqgq21PZ1CUBD76jJlUOBgY
Nmj+sMNKw1c+slx47fvyK2uVMcmEEAfCcnUt2fK86v7v8UddbH/BNK+SobarkOQC
1kM74qdhKSvFFz+F9kAzrby4VjCxfWsDYCeFhS9Jrkxl6l/Z2WANy34y9ztbgJdi
eSugA7b/VfrlsxYz7xu498UWDbVbOPKs7UGB14icK4SVoF0irk7dWxNvAQD21mJU
YPAFmJ/MTQ+v3l+uEOrdicb9FcM6WNmyTwkN6DYcuD7eJYVwwz1sU8Y631swbjlS
wQIDAQAB
-----END PUBLIC KEY-----

# test it by encrypting a test message and decrypting it

tdierks@cloudshell:~ (kms-test-1367)$ echo "squeamish ossifrage" | openssl pkeyutl -encrypt -pubin -inkey /tmp/rsa-2048-256.pub -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256 -pkeyopt rsa_mgf1_md:sha256 > /tmp/rsa-2048-256.enc
tdierks@cloudshell:~ (kms-test-1367)$ gcloud kms asymmetric-decrypt --location global --keyring so-60686427 --key rsa-2048-256 --version 1 --ciphertext-file /tmp/rsa-2048-256.enc --plaintext-file /dev/stdout
squeamish ossifrage

# generate a 190 byte message, encrypt it, and decrypt it, verify by comparing md5sum

tdierks@cloudshell:~ (kms-test-1367)$ dd ibs=190 count=1 < /dev/urandom > /tmp/message-190
1+0 records in
0+1 records out
190 bytes copied, 0.0002066 s, 920 kB/s
tdierks@cloudshell:~ (kms-test-1367)$ ls -l /tmp/message-190
-rw-r--r-- 1 tdierks tdierks 190 Mar 15 14:54 /tmp/message-190
tdierks@cloudshell:~ (kms-test-1367)$ openssl pkeyutl -in /tmp/message-190 -encrypt -pubin -inkey /tmp/rsa-2048-256.pub -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256 -pkeyopt rsa_mgf1_md:sha256 > /tmp/rsa-2048-256-m190.enc
tdierks@cloudshell:~ (kms-test-1367)$ gcloud kms asymmetric-decrypt --location global --keyring so-60686427 --key rsa-2048-256 --version 1 --ciphertext-file /tmp/rsa-2048-256-m190.enc --plaintext-file /dev/stdout | md5sum
4932e23fb11c094c1dd703ba34afc565  -
tdierks@cloudshell:~ (kms-test-1367)$ md5sum /tmp/message-190
4932e23fb11c094c1dd703ba34afc565  /tmp/message-190

# try again with 191 bytes

tdierks@cloudshell:~ (kms-test-1367)$ dd ibs=191 count=1 < /dev/urandom > /tmp/message-191
1+0 records in
0+1 records out
191 bytes copied, 7.2545e-05 s, 2.6 MB/s
tdierks@cloudshell:~ (kms-test-1367)$ ls -l /tmp/message-191
-rw-r--r-- 1 tdierks tdierks 191 Mar 15 14:59 /tmp/message-191
tdierks@cloudshell:~ (kms-test-1367)$ openssl pkeyutl -in /tmp/message-191 -encrypt -pubin -inkey /tmp/rsa-2048-256.pub -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256 -pkeyopt rsa_mgf1_md:sha256 > /tmp/rsa-2048-256-m191.enc
Public Key operation error
140191432818944:error:2406F079:random number generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:98:Filename=/home/tdierks/.rnd
140191432818944:error:0409A06E:rsa routines:RSA_padding_add_PKCS1_OAEP_mgf1:data too large for key size:../crypto/rsa/rsa_oaep.c:62:

Как вы можете видеть, OpenSSL не удалось зашифровать 191-байтовый входной файл.

...