我正在尝试解密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 :(得分:4)
当您使用Python库时,所有输入必须是base64编码的,输出也将是base64编码的。在snippets.py中的encrypt函数中,您可以看到代码在将纯文本传递给KMS加密API之前对其进行了base64编码。
encoded_text = base64.b64encode(plaintext)
当您使用gcloud kms encrypt
命令时,您不必自己对baseinte进行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-decode输出进行64位编码输入,而不是有时只进行。我将很快看到更新Python示例代码,并仔细检查其他语言的示例代码。
答案 1 :(得分:0)
鉴于问题的日期,接受的答案应为@Russ(同样,感谢您更新git)。 由于文档稍有变化,因此这里的函数可以处理已经加密的 json文件。
使用GCloud命令行加密:
cipher_file
这是解密文件的功能([ENCRYPTED-SECRETS.json.enc]
是def decrypt(cipher_file):
project_id = "project"
location_id = "region"
key_ring_id = "key-ring"
crypto_key_id = "key"
# Creates an API client for the KMS API.
client = kms_v1.KeyManagementServiceClient()
# The resource name of the CryptoKey.
name = client.crypto_key_path_path(project_id, location_id, key_ring_id,
crypto_key_id)
# Use the KMS API to decrypt the data.
with io.open(cipher_file, "rb") as file:
c_text = file.read()
response = client.decrypt(name, c_text)
secret_dict = json.loads(response.plaintext.decode("utf-8"))
return secret_dict
的路径):
function getTimeRemaining(endtime) {
var t = Date.parse(endtime) - Date.parse(new Date());
var minutes = Math.floor((t / 1000 / 60) % 60);
var hours = Math.floor((t / (1000 * 60 * 60)) % 24);
var days = Math.floor(t / (1000 * 60 * 60 * 24));
return {
'total': t,
'days': days,
'hours': hours,
'minutes': minutes,
};
}
function initializeClock(id, endtime) {
var clock = document.querySelector(id);
var daysSpan = clock.querySelector('.days');
var hoursSpan = clock.querySelector('.hours');
var minutesSpan = clock.querySelector('.minutes');
var oneMinute = 60000;
function updateClock() {
var t = getTimeRemaining(endtime);
daysSpan.innerHTML = t.days;
hoursSpan.innerHTML = ('0' + t.hours).slice(-2);
minutesSpan.innerHTML = ('0' + t.minutes).slice(-2);
if (t.total < oneMinute) {
clearInterval(timeinterval);
clock.style.display = "none";
}
}
updateClock();
var timeinterval = setInterval(updateClock, 1000);
}
var deadline = 'September 29 2019 13:18:00';
initializeClock('.js-countdown', deadline);