1

我尝试使用 aes256、aes-cross 和加密。 但是我无法解密使用带有 PKCS7 填充的 AES 256 (aes-256-ecb) 加密的密钥。我最终遇到了以下提到的错误。

错误:Decipheriv.createCipherBase 处的密钥长度无效(或)错误:Decipheriv.createCipherBase 处的 IV 长度无效

我找不到对我有帮助的 npm 包。

这是示例代码:

const crypto = require("crypto");
//Length of my key is 32
const key = Buffer.from("aaaaaabbbbbbccccccddddddssssssaa", "base64");
//_sek is the encrypted key
const _sek = "NEPkEuWaXZUawBHJZIcMjHJeKuPkaQezuRc3bjWEezlbHzmqCSyh2hazB+WeAJaU"
const cipher = crypto.createDecipheriv(
    "aes-256-ecb",
    Buffer.from(key, "base64"),
    Buffer.from([])
  );
  return cipher.update(_sek, "base64", "utf8") + cipher.final("utf8");

如果有人可以帮助我在 nodejs 中提供基于代码的示例。它将帮助我清楚地理解。

更新:

function decrypt(encryted_key, access_key) {
  var key = Buffer.from(access_key, "base64");
  const decipher = crypto.createDecipheriv("aes-256-ecb", key, "");
  decipher.setAutoPadding(false);
  var decryptedSecret = decipher.update(encryted_key, "utf8", "base64");
  decryptedSecret += decipher.final("base64");
  return decryptedSecret;
}

decrypt(
  "w2lI56OJ+RqQ04PZb5Ii6cLTxW2bemiMBTXpIlkau5xbmhwP4Qk3oyIydKV1ttWa",
  "DvpMLxqKlsdhKe9Pce+dqTdNUnrofuOQPsgmSHhpxF8="
)

所需输出:“cdgLxoHvpeMoMd3eXISoMcgQFRxZeMSez5x3F2YVGT4=”

但是得到了这个:“G7z/eXQefnaeB7mYBq7KDrH+R4LtauNi6AU1v0/yObqoOidSOkIeW085DiMxdCDDjaI+hJiS2JRHDL1fdLrveg="

提前致谢。

4

1 回答 1

1

当密钥的长度与指定的算法不匹配时,会导致Invalid key length错误。例如,在发布的代码aes-256-ecb中指定了 AES-256,即密钥长度为 32 字节的 AES。但是,使用的密钥只有 24 个字节的长度,因为它在读入缓冲区时是 Base64 解码的。这意味着必须使用 32 字节的密钥(例如,如果在读入缓冲区时使用 UTF-8 而不是 Base64 作为编码)或 AES-192(指定为aes-192-ecb)。

当在 ECB 模式中指定 IV(根本不使用 IV)或在使用 IV 的模式下,其长度与算法的块大小不匹配时,会导致无效 IV 长度错误(例如AES 为 16 个字节)。由于此处使用的是 ECB 模式,因此只需传递nullIV(Buffer.from([])也可以)。

使用 AES-192 和 24 字节密钥的示例:

const crypto = require("crypto");

const key = "aaaaaabbbbbbccccccddddddssssssaa";
const secret = "01234567890123456789012345678901";

// Encryption
const cipher = crypto.createCipheriv("aes-192-ecb", Buffer.from(key, "base64"), null);
const encryptedSecret = cipher.update(secret, "utf8", "base64") + cipher.final("base64");
console.log(encryptedSecret);

// Decryption
const decipher = crypto.createDecipheriv("aes-192-ecb", Buffer.from(key, "base64"), null);
const decryptedSecret = decipher.update(encryptedSecret, "base64", "utf8") + decipher.final("utf8");
console.log(decryptedSecret);

在解密过程中,UTF-8 被用作输出编码,这当然只有在明文与之兼容的情况下才有可能,否则必须应用合适的编码,例如 Base64。

于 2020-03-12T15:33:11.020 回答