elixirChain / dingtalk-encrypt

dingTalk encrypt Node Version. 钉钉的非官方nodejs版AES加解密库 sdk
https://www.npmjs.com/package/dingtalk-encrypt
Apache License 2.0
18 stars 8 forks source link

Crypto.createDecipheriv 调用时出错 #5

Closed simon5057 closed 8 months ago

simon5057 commented 2 years ago

Crypto.createDecipheriv 调用时出错, Error: Invalid IV length at Decipheriv.createCipherBase (internal/crypto/cipher.js:103:19) at Decipheriv.createCipherWithIV (internal/crypto/cipher.js:121:20) at new Decipheriv (internal/crypto/cipher.js:264:22) at Object.createDecipheriv (crypto.js:132:10) at DingTalkEncryptor.decrypt

decrypt(encrypted) {
    let decrypt;
    try {
      // decrypt
      const crypto = Crypto.createDecipheriv('AES-256-CBC', this.keySpec, this.iv);
      decrypt = Buffer.concat([crypto.update(encrypted, 'base64'), crypto.final()]);
    } catch (e) {
      throw new DingTalkEncryptException(900008);
    }
...
}

在使用钉钉第三方应用程序回调设置的对应 token 和 aseKey,并使用检查回调时传入的参数进行解密,throw new DingTalkEncryptException(900008);,经过调试 try 语块报错如上,请您排查一下,谢谢 image

panzhangguo commented 2 years ago

同 你解决了吗

simon5057 commented 2 years ago

同 你解决了吗

const crypto = createDecipheriv('AES-256-CBC', this.keySpec, this.iv); // this.keySpec 和 this.iv 均使用 buffer,如果使用字符串会报错
decrypt = crypto.update(Buffer.from(encrypted, 'base64'));
// crypto.final(); // TODO 会报错,原因未知
  1. this.keySpec 和 this.iv 均使用 buffer,如果使用字符串会报错
  2. 然后不调用 crypto.final(); 因为会报错,但是解出来的数据不完整
mewsmart commented 2 years ago

问题同上,就是报错,不知道为什么,可以修复下吗?

sloan-F commented 2 years ago

已解决

const crypto = createDecipheriv('AES-256-CBC', this.keySpec, this.iv); // this.keySpec 和 this.iv 均使用 buffer,如果使用字符串会报错
crypto.setAutoPadding(false);//如果不加这个,在解密钉钉加密信息的时候final()容易出错
return Buffer.concat([crypto.update(finalBuf), crypto.final()]).toString('base64');
Pulset commented 2 years ago

回退到1.2.3版本就正常了

senique commented 2 years ago

试用 2.1.0 看看