Google cloud platform 谷歌云KMS:无法解密

Google cloud platform 谷歌云KMS:无法解密,google-cloud-platform,google-cloud-kms,Google Cloud Platform,Google Cloud Kms,我正在尝试解密kms加密文件,并遇到以下错误: UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 3: invalid start byte 我正在使用示例解密代码 我可以使用命令行解密文件 正在从此处引发异常: cipher_text.decode('utf-8') 代码: 如果我在这里遗漏了什么,请告诉我。当您使用Python库时,所有输入必须是base64编码的,输出也将是base64编码的。在sni

我正在尝试解密kms加密文件,并遇到以下错误:

UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 3: invalid start byte
我正在使用示例解密代码

我可以使用命令行解密文件

正在从此处引发异常:

cipher_text.decode('utf-8')
代码:


如果我在这里遗漏了什么,请告诉我。

当您使用Python库时,所有输入必须是base64编码的,输出也将是base64编码的。在snippets.py中的encrypt函数中,您可以看到代码在传递给KMS encrypt API之前是对明文进行base64编码的

encoded_text = base64.b64encode(plaintext)
使用
gcloud kms encrypt
命令时,您不必自己对明文进行base64编码,而且密文也不进行base64编码

因此,当您将密文从
gcloud kms encrypt
传递到Python库进行解密时,必须首先对其进行base64编码。在发送文件数据之前,将snippets.py中的decrypt函数更改为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格式发送,而JSON只接受Unicode字符串。因此,Cloud KMS API要求对该数据进行base64编码,并且还必须对输出进行base64编码。但是gcloud命令为您执行此操作,因此您不必执行此操作


我认为Python示例代码具有误导性。它应该始终对API的输入进行base64编码,并对输出进行base64解码,而不是只是偶尔这样做。我将很快更新Python示例代码,并仔细检查其他语言的示例代码。

根据问题的日期,可以接受的答案应该是@Russ(另外,感谢您更新git)。 由于文档发生了一些变化,因此这里有一个函数处理已经加密的json文件

使用GCloud命令行加密:

gcloud kms加密\
--纯文本文件=[SECRETS.json]\
--密文文件=[ENCRYPTED-SECRETS.json.enc]\
--位置=[区域]\
--keyring=[keyring-NAME]\
--key=[key-NAME]
下面是用于解密所述文件的函数(
cipher_file
[ENCRYPTED-SECRETS.json.enc]
)的路径:

def解密(密码文件):
project\u id=“project”
位置\u id=“区域”
钥匙环\u id=“钥匙环”
加密密钥\u id=“密钥”
#为KMS API创建API客户端。
client=kms_v1.KeyManagementServiceClient()
#加密密钥的资源名称。
name=client.crypto\u key\u path\u path(项目id、位置id、密钥环id、,
加密密钥(id)
#使用KMS API对数据进行解密。
将io.open(cipher_文件,“rb”)作为文件:
c_text=file.read()
response=client.decrypt(名称,c_文本)
secret\u dict=json.loads(响应、明文、解码(“utf-8”))
返回密码

发现使用命令行实用程序加密的文件不能使用Python decrypt API进行解密(不确定是否与其他语言API相同)。因此,要通过pythonapi解密加密文件,还必须通过encrypt pythonapi进行加密。不确定我的理解是否正确,但通过上述方法实现了。感谢您的澄清。有道理。Python示例代码已经修复,请参阅。