【问题标题】:Trying to decrypt an encrypted key generated using AES 256(AES/ECB/PKCS7Padding) algorithm in nodejs using crypto尝试使用加密在nodejs中解密使用AES 256(AES / ECB / PKCS7Padding)算法生成的加密密钥
【发布时间】:2020-06-24 11:57:18
【问题描述】:

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

错误:密钥长度无效 在 Decipheriv.createCipherBase (要么) 错误:IV 长度无效 在 Decipheriv.createCipherBase

我找不到对我有帮助的 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="

提前致谢。

【问题讨论】:

    标签: node.js encryption aes node-crypto aescryptoserviceprovider


    【解决方案1】:

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

    Invalid IV length 错误是在 ECB 模式(根本不使用 IV)中指定 IV,或者在使用 IV 的模式时,其长度不' 不匹配算法的块大小(例如 AES 的 16 字节)。由于这里使用的是 ECB 模式,因此只需将 null 传递给 IV(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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多