當您使用Python庫時,所有輸入必須以base64編碼,輸出也將以base64編碼。在snippets.py中的加密函數中,您可以在將代碼傳遞給KMS加密API之前,看到該代碼是base64編碼的明文。
encoded_text = base64.b64encode(plaintext)
當您使用gcloud kms encrypt
命令,你不必爲base64編碼自己的明文和密文是不是base64編碼。
因此,當您將密文從gcloud kms encrypt
傳遞到Python庫進行解密時,您必須先對其進行64位編碼。在發送之前,將snippets.py中的解密函數更改爲base64編碼文件數據。
# Read cipher text from the input file.
with io.open(encrypted_file_name, 'rb') as encrypted_file:
ciphertext = encrypted_file.read()
encoded_text = base64.b64encode(ciphertext)
# Use the KMS API to decrypt the text.
cryptokeys = kms_client.projects().locations().keyRings().cryptoKeys()
request = cryptokeys.decrypt(
name=name, body={'ciphertext': encoded_text.decode('utf-8')})
response = request.execute()
你能想到的基於64位編碼的作爲是一個傳輸層實現細節:這只是必要的,這樣任意的二進制數據可以JSON,只接受Unicode字符串發送。因此,雲端KMS API要求此數據以base64編碼,並且還必須對輸出進行64位編碼。但是gcloud命令爲你做這個工作,所以你不必這樣做。
我認爲Python示例代碼具有誤導性。它應該總是將64位輸入編碼爲API和base64解碼輸出,而不僅僅是有時候這樣做。我會盡快更新Python示例代碼,並仔細檢查其他語言的示例代碼。
找出使用命令行實用程序加密的文件無法使用Python解密API解密(不知道它是否與其他語言API一樣)。 因此,要通過Python API解密加密文件,還必須通過加密Python API來完成加密。 不知道我的理解是否正確,但是使用上述方法得到了解。 –