Google Cloud KMS:无法解密

时间:2017-08-15 18:46:24

标签: 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')

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

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

2 个答案:

答案 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);