为什么我的 AWS KMS 解密没有返回我刚刚加密的字符串?

Why is my AWS KMS decrypt not giving me back the string I just encrypted?

这是我的代码:

const AWS = require('aws-sdk');
const btoa = require('btoa');

let kms = new AWS.KMS({
    accessKeyId: 'redacted',
    secretAccessKey: 'redacted',
    region: 'us-east-1'
});

let params = {
    KeyId: 'redacted',
    Plaintext: 'abcde'
 };

let encrypted = kms.encrypt(params, function(err, data) {
    if (err) console.log(err, err.stack); // an error occurred
    else {
        let x = {
            CiphertextBlob: data.CiphertextBlob
        };

        kms.decrypt(x, function(err, data) {
            if (err) console.log(err, err.stack); // an error occurred
            else     console.log(btoa(data.Plaintext));           // successful response
        });
    }
 });

我只是想加密字符串 abcde 然后解密,但这不起作用。有一段时间我得到 InvalidCipherException,但现在 console.log(btoa(data.Plaintext)); 的输出是 YWJjZGU=

我无法理解我在这里做错了什么,但我怀疑它与 base64 编码有关。我在这段代码上尝试了很多变体,但无法推断出问题所在。有人看到我在这里做错了什么吗?

我本应使用 atob,却使用了 btoa。我发誓我已经试过了,但谁能说呢。

因为我认为 atob 是二进制的 ASCII,所以我无法解释我是如何使用一个应该给出二进制的函数来获取明文的,但是......它起作用了,所以。

编辑:将其视为二进制的 ASCII 是一种误导。它更像是 "transmission format" 到 "original content," 无论内容是什么。

KMS.decrypt方法要的是二进制字符串,就是这里的"original content"。 KMS.encrypt base64 编码用于传输的加密字符串,并且 KMS.decrypt 希望它在作为参数给出之前被编码出该格式。