이 문서에서는 RSA 키를 사용하여 비대칭 암호화에 사용할 키를 만들고 사용하는 방법을 설명합니다. 비대칭 키를 사용하여 서명을 만들고 검증하려면 디지털 서명 만들기 및 검증을 참조하세요. 암호화 및 복호화에 대칭 키를 사용하려면 데이터 암호화 및 복호화를 참조하세요.
비대칭 암호화는 비대칭 키의 공개 키 부분을 사용하고, 복호화는 키의 비공개 키 부분을 사용합니다. Cloud Key Management Service는 공개 키를 검색할 수 있는 기능과 공개 키로 암호화된 암호문을 복호화할 수 있는 기능을 제공합니다. Cloud KMS에서는 비공개 키에 직접 액세스할 수 없습니다.
시작하기 전에
이 문서에서는 명령줄에서 실행되는 예시를 제공합니다. 예시를 간편하게 사용하려면 Cloud Shell을 사용하세요. 암호화 예시는 Cloud Shell에 사전 설치된 OpenSSL을 사용합니다.
키 용도가
ASYMMETRIC_DECRYPT인 비대칭 키를 만듭니다. 키 용도ASYMMETRIC_DECRYPT에 지원되는 알고리즘을 보려면 비대칭 암호화 알고리즘을 참조하세요.ASYMMETRIC_SIGN용도의 키로는 이 절차를 따를 수 없습니다.명령줄을 사용하려면 OpenSSL이 아직 설치되어 있지 않은 경우 설치합니다. Cloud Shell을 사용하는 경우에는 OpenSSL이 이미 설치되어 있습니다.
- macOS 사용자: macOS에 설치된 OpenSSL 버전은 이 주제에서 데이터를 복호화하는 데 사용되는 플래그를 지원하지 않습니다. macOS에서 이 단계를 수행하려면 Homebrew에서 OpenSSL을 설치하세요.
키에 대한 액세스 제어
공개 키를 검색할 사용자 또는 서비스에 비대칭 키에 대한
cloudkms.cryptoKeyVersions.viewPublicKey권한을 부여합니다. 공개 키는 데이터를 암호화하는 데 필요합니다.공개 키로 암호화된 데이터를 복호화할 사용자 또는 서비스의 경우 비대칭 키에 대한
cloudkms.cryptoKeyVersions.useToDecrypt권한을 부여합니다.
Cloud KMS의 권한 및 역할에 대한 자세한 내용은 권한 및 역할을 참조하세요.
데이터 암호화
비대칭 암호화 키를 사용하여 데이터를 암호화하려면 공개 키를 검색하고 이 공개 키를 사용해서 데이터를 암호화합니다.
gcloud
이 샘플은 로컬 시스템에 OpenSSL이 설치되어 있어야 합니다.
공개 키 다운로드
공개 키를 다운로드합니다.
gcloud kms keys versions get-public-key KEY_VERSION \
--key KEY_NAME \
--keyring KEY_RING \
--location LOCATION \
--output-file PUBLIC_KEY_PATH
다음을 바꿉니다.
KEY_VERSION: 공개 키를 다운로드하려는 비대칭 키 쌍의 키 버전입니다.KEY_NAME: 키의 이름입니다.KEY_RING: 키가 포함된 키링입니다.LOCATION: 키링의 위치입니다.PUBLIC_KEY_PATH: 공개 키를 저장할 경로입니다.
데이터 암호화
방금 다운로드한 공개 키를 사용하여 데이터를 암호화하고 출력을 파일에 저장합니다.
openssl pkeyutl -in INPUT_PATH \
-encrypt \
-pubin \
-inkey PUBLIC_KEY_PATH \
-pkeyopt rsa_padding_mode:oaep \
-pkeyopt rsa_oaep_md:HASH_SIZE \
-pkeyopt rsa_mgf1_md:HASH_SIZE \
> OUTPUT_PATH
다음을 바꿉니다.
INPUT_PATH: 암호화하려는 일반 텍스트 데이터의 경로입니다.PUBLIC_KEY_PATH: 공개 키의 경로입니다.HASH_SIZE: 해시 크기(예: SHA256의 경우256)OUTPUT_PATH: 암호화된 데이터를 저장할 경로입니다.
C#
이 코드를 실행하려면 먼저 C# 개발 환경을 설정하고 Cloud KMS C# SDK를 설치합니다.
Go
명령줄에서 Cloud KMS를 사용하려면 먼저 최신 버전의 Google Cloud CLI로 설치 또는 업그레이드하세요.
Java
이 코드를 실행하려면 먼저 자바 개발 환경을 설정하고 Cloud KMS 자바 SDK를 설치합니다.
Node.js
이 코드를 실행하려면 먼저 Node.js 개발 환경을 설정하고 Cloud KMS Node.js SDK를 설치합니다.
PHP
이 코드를 실행하려면 먼저 Google Cloud에서 PHP 사용에 관해 알아보고 Cloud KMS PHP SDK를 설치하세요.
Python
이 코드를 실행하려면 먼저 Python 개발 환경을 설정하고 Cloud KMS Python SDK를 설치합니다.
Ruby
이 코드를 실행하려면 먼저 Ruby 개발 환경을 설정하고 Cloud KMS Ruby SDK를 설치합니다.
데이터 복호화
Cloud KMS를 사용하여 복호화를 수행합니다.
gcloud
명령줄에서 Cloud KMS를 사용하려면 먼저 최신 버전의 Google Cloud CLI로 설치 또는 업그레이드하세요.
gcloud kms asymmetric-decrypt \
--version KEY_VERSION \
--key KEY_NAME \
--keyring KEY_RING \
--location LOCATION \
--ciphertext-file INPUT_PATH \
--plaintext-file OUTPUT_PATH
다음을 바꿉니다.
KEY_VERSION: 데이터를 암호화하는 데 사용된 비대칭 키 쌍의 키 버전입니다.--version플래그를 생략하여 버전을 자동으로 인식할 수 있습니다.KEY_NAME: 데이터를 암호화하는 데 사용된 키의 이름입니다.KEY_RING: 키가 포함된 키링의 이름입니다.LOCATION: 키링의 위치입니다.INPUT_PATH: 암호문이 포함된 파일의 경로입니다.OUTPUT_PATH: 일반 텍스트가 포함될 파일의 경로입니다.
모든 플래그 및 가능한 값에 대한 정보를 보려면 --help 플래그와 함께 명령어를 실행하세요.
복호화된 파일의 콘텐츠를 표시하려면 텍스트 편집기에서 파일을 열거나 cat 명령어를 사용하여 터미널에서 확인합니다.
C#
이 코드를 실행하려면 먼저 C# 개발 환경을 설정하고 Cloud KMS C# SDK를 설치합니다.
Go
이 코드를 실행하려면 먼저 Go 개발 환경을 설정하고 Cloud KMS Go SDK를 설치합니다.
Java
이 코드를 실행하려면 먼저 자바 개발 환경을 설정하고 Cloud KMS 자바 SDK를 설치합니다.
Node.js
이 코드를 실행하려면 먼저 Node.js 개발 환경을 설정하고 Cloud KMS Node.js SDK를 설치합니다.
PHP
이 코드를 실행하려면 먼저 Google Cloud에서 PHP 사용에 관해 알아보고 Cloud KMS PHP SDK를 설치하세요.
Python
이 코드를 실행하려면 먼저 Python 개발 환경을 설정하고 Cloud KMS Python SDK를 설치합니다.
Ruby
이 코드를 실행하려면 먼저 Ruby 개발 환경을 설정하고 Cloud KMS Ruby SDK를 설치합니다.
API
이 예시에서는 curl을 HTTP 클라이언트로 사용하여 API 사용을 보여줍니다. 액세스 제어에 대한 자세한 내용은 Cloud KMS API 액세스를 참조하세요.
CryptoKeyVersions.asymmetricDecrypt 메서드를 사용합니다.
문제 해결
incorrect key purpose: ASYMMETRIC_SIGN
키 용도가 ASYMMETRIC_DECRYPT인 키로만 데이터를 복호화할 수 있습니다.
macOS에서 복호화하는 경우 invalid parameter
macOS에 설치된 OpenSSL 버전은 이 주제에서 데이터를 복호화하는 데 사용되는 플래그를 지원하지 않습니다. macOS에서 이 단계를 수행하려면 Homebrew에서 OpenSSL을 설치하세요.
data too large for key size
RSA 복호화의 최대 페이로드 크기는 키 크기와 패딩 알고리즘에 따라 다릅니다. Cloud KMS에서 사용하는 모든 RSA 암호화 형식은 RFC 2437에서 표준화된 OAEP를 사용합니다. 다음 알고리즘은 다음과 같은 최대 페이로드 크기를 지원합니다.
| 알고리즘 | 매개변수 | 최대 메시지 길이 (바이트) |
|---|---|---|
| RSA_DECRYPT_OAEP_2048_SHA256 | k = 256, hLen = 32, | 190 |
| RSA_DECRYPT_OAEP_3072_SHA256 | k = 384, hLen = 32, | 318 |
| RSA_DECRYPT_OAEP_4096_SHA256 | k = 512, hLen = 32, | 446 |
| RSA_DECRYPT_OAEP_4096_SHA512 | k = 512, hLen = 64, | 382 |
이러한 한도보다 큰 다양한 길이의 메시지에는 비대칭 암호화를 사용하지 않는 것이 좋습니다. 대신 하이브리드 암호화를 사용해보세요. Tink는 이 접근 방식을 사용하는 암호화 라이브러리입니다.