当您使用 Python 库时,所有输入都必须经过 base64 编码,输出也必须经过 base64 编码。在 snippets.py 的 encrypt 函数中,您可以看到代码在将明文传递给 KMS 加密 API 之前对明文进行 base64 编码。
encoded_text = base64.b64encode(plaintext)
使用该gcloud kms encrypt
命令时,明文不必自己进行base64编码,密文也不是base64编码的。
因此,当您将密文传递gcloud kms encrypt
给 Python 库进行解密时,您必须先对其进行 base64 编码。将 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()
您可以将 base64 编码视为传输层实现细节:它只需要以 JSON 格式发送任意二进制数据,它只接受 Unicode 字符串。因此,Cloud KMS API 要求对这些数据进行 base64 编码,并且还必须对输出进行 base64 编码。但是 gcloud 命令可以为您完成这项工作,因此您不必这样做。
我认为 Python 示例代码具有误导性。它应该始终对 API 的输入进行 base64 编码,并对输出进行 base64 解码,而不是有时才这样做。我将尽快更新 Python 示例代码,并仔细检查其他语言的示例代码。