本文說明如何建立及使用 RSA 金鑰,進行非對稱式加密。如要使用非對稱金鑰建立及驗證簽章,請參閱「建立及驗證數位簽章」。如果您要使用對稱金鑰進行加密與解密,請參閱加密及解密資料一文。
非對稱式加密使用非對稱金鑰的公開金鑰部分,而解密則使用金鑰的私密金鑰部分。Cloud Key Management Service 提供擷取公開金鑰的功能,以及解密以公開金鑰加密的密文的功能。Cloud KMS 不允許直接存取私密金鑰。
事前準備
本文提供在指令列執行的範例。為簡化範例的使用方式,請使用 Cloud Shell。加密範例使用的是 OpenSSL,已經預先安裝在 Cloud Shell 中。
建立非對稱式金鑰,並將金鑰用途設為
ASYMMETRIC_DECRYPT。如要瞭解金鑰用途ASYMMETRIC_DECRYPT支援哪些演算法,請參閱「非對稱式加密演算法」。如果金鑰用途為ASYMMETRIC_SIGN,則無法執行這項程序。如要使用指令列,請安裝 OpenSSL (如果尚未安裝)。如果您使用 Cloud Shell,則 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
如要執行這段程式碼,請先設定 Java 開發環境,並安裝 Cloud KMS Java 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
如要執行這段程式碼,請先設定 Java 開發環境,並安裝 Cloud KMS Java 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」。
疑難排解
incorrect key purpose: ASYMMETRIC_SIGN
您只能使用金鑰用途為 ASYMMETRIC_DECRYPT 的金鑰解密資料。
invalid parameter 在 macOS 上解密時
macOS 上安裝的 OpenSSL 版本不支援本主題中用於解密資料的旗標。如要在 macOS 上執行這些步驟,請從 Homebrew 安裝 OpenSSL。
data too large for key size
RSA 解密的酬載大小上限取決於金鑰大小和填補演算法。Cloud KMS 使用的所有 RSA 加密格式都採用 OAEP,並在 RFC 2437 中標準化。以下列出各種演算法支援的酬載大小上限,供您快速參考。
| 演算法 | 參數 | 訊息長度上限 (位元組) |
|---|---|---|
| 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 是採用這種做法的密碼編譯程式庫。