2017-08-15 85 views
0

我試圖解密公里加密的文件,並在下面的錯誤運行:谷歌雲KMS:無法解密

UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 3: invalid start byte 

我使用的示例代碼解密。

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

異常正從這裏拋出:

cipher_text.decode('utf-8') 

代碼:https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/kms/api-client/snippets.py

請讓我知道如果我失去了一些東西。

+0

找出使用命令行實用程序加密的文件無法使用Python解密API解密(不知道它是否與其他語言API一樣)。 因此,要通過Python API解密加密文件,還必須通過加密Python API來完成加密。 不知道我的理解是否正確,但是使用上述方法得到了解。 –

回答

3

當您使用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示例代碼,並仔細檢查其他語言的示例代碼。

+0

感謝您的澄清。說得通。 –

+0

Python示例代碼已修復,請參閱https://github.com/GoogleCloudPlatform/python-docs-samples/commit/e0f957c816a42117a02c3d6db09e0611c15d4c70。 –