本主題提供建立及使用金鑰以使用 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 \ --keyring key-ring \ --location location \ --output-file public-key-path
將 key-version 替換為含有公開金鑰的金鑰版本。將 key 替換為金鑰名稱。將 key-ring 替換為金鑰所在的金鑰環名稱。請將 location 替換為金鑰環的 Cloud KMS 位置。將 public-key-path 替換為本機系統中公開金鑰的儲存位置。
加密資料
使用剛才下載的公開金鑰加密資料,並將輸出內容儲存到檔案:
openssl pkeyutl -in cleartext-data-input-file \ -encrypt \ -pubin \ -inkey public-key-path \ -pkeyopt rsa_padding_mode:oaep \ -pkeyopt rsa_oaep_md:sha256 \ -pkeyopt rsa_mgf1_md:sha256 \ > encrypted-data-output-file
將 cleartext-data-input-file 替換為要加密的路徑和檔案名稱。
將 public-key-path 替換為您下載公開金鑰的路徑和檔案名稱。
將 encrypted-data-output-file 替換為路徑和檔案名稱,即可儲存加密資料。
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 \ --keyring key-ring \ --location location \ --ciphertext-file file-path-with-encrypted-data \ --plaintext-file file-path-to-store-plaintext
將 key-version 替換為金鑰版本,或省略 --version
標記,以便自動偵測版本。將 key 替換為要用於解密的金鑰名稱。將 key-ring 替換為金鑰所在的金鑰環名稱。將 location 替換為金鑰環的 Cloud KMS 位置。將 file-path-with-encrypted-data 和 file-path-to-store-plaintext 替換為本機檔案路徑,以便讀取加密資料並儲存解密的輸出內容。
如需所有旗標和可能值的相關資訊,請搭配 --help
旗標執行指令。
如要顯示已解密檔案的內容,請在編輯器或終端機中開啟檔案。以下範例說明如何使用 cat
指令顯示檔案內容:
cat ./my-file.txt
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
的金鑰解密資料。
在 macOS 上解密時的 invalid parameter
在 macOS 上安裝的 OpenSSL 版本不支援本主題中用於解密資料的標記。如要在 macOS 上執行這些步驟,請從 Homebrew 安裝 OpenSSL。
data too large for key size
RSA 解密作業的最大酬載大小取決於金鑰大小和填充演算法。Cloud KMS 使用的所有 RSA 加密格式都會使用 OAEP,這是在 RFC 2437 中標準化的格式。以下是快速參考資料,下列演算法支援下列最大酬載大小 (maxMLen
,以位元組為單位):
演算法 | 參數 | 訊息長度上限 |
---|---|---|
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 |
對於長度可能超過這些限制的郵件,我們不建議使用非對稱式加密。建議改用混合式加密技術。Tink 是採用這種方法的密碼編譯程式庫。