【问题标题】:AES/CBC/PKCS5PADDING IV - Decryption from Java to NodeJsAES/CBC/PKCS5PADDING IV - 从 Java 到 NodeJs 的解密
【发布时间】:2018-11-13 11:04:16
【问题描述】:

我正在尝试在 NodeJs 中解密。它在 Java 中工作。但我无法在 Node 中实现相同的目标。

我正在使用节点版本:8.4

请找到我的 NodeJs 代码:

var crypto = require('crypto');
function decryption (message, key) {
    var messageArray = Buffer.from(message, 'base64');
    // var kekbuf =  Buffer(key, 'utf8');

    var ivBuffer = new Buffer([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]);
    var iv = ivBuffer.slice(0, 16);

    var decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
    decipher.setAutoPadding(false);
    var dec = decipher.update(messageArray, 'base64');

    dec += decipher.final();
    return dec.toString();
}

请找到有效的 Java 代码

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;

class Test1 {
  public String decrypt(String message, String key) throws Exception {
    DatatypeConverter dtc = null;
    byte[] messagArray = dtc.parseBase64Binary(message);
    byte[] keyArray = dtc.parseBase64Binary(key);

    byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    IvParameterSpec ivspec = new IvParameterSpec(iv);

    SecretKey secretKey = new SecretKeySpec(keyArray, "AES");
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");

    cipher.init(Cipher.DECRYPT_MODE, secretKey, ivspec);
    return new String(cipher.doFinal(messagArray));
  }
}

我得到一个不同的解密文本。我无法在 NodeJs 中获得与在 Java 中相同的结果。

请帮帮我。

【问题讨论】:

  • 在 Java 代码中明确使用填充时,为什么不启用填充?
  • 启用后出现错误 crypto.js:181 var ret = this._handle.final(); ^ 错误:错误:06065064:数字信封例程:EVP_DecryptFinal_ex:Decipheriv.final (crypto.js:181:26) 处的解密错误

标签: javascript java node.js encryption node-crypto


【解决方案1】:

使用 crypto2 库,这个库修复了 iv 问题:

    const crypto2 = require('crypto2'); 

    AESDecrypt: function (encrypted, secretKey) {
            return new Promise((resolve, reject) => {
                if (encrypted && secretKey) {
                    crypto2.decrypt.aes256cbc(encrypted, secretKey, (err, decrypted) => {
                        if (err) {
                            reject(err);
                        } else {
                            resolve(decrypted);
                        }
                    });
                } else {
                    reject('Crypt - Invalid params!');
                }
            })
        }

【讨论】:

  • 谢谢,但是在尝试了您的示例后,我收到错误:(节点:17805)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝 id:1):TypeError:IV 必须是缓冲区(节点:17805) [DEP0018] 弃用警告:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。
  • 我刚刚将 encryptedText 和 key 作为参数传递给您的函数。 (在 npm 安装 crypto2 之后)
  • @ChaitanyaJoshi,我忘了提到版本,尝试下载/安装crypto2 0.3.2版,我的示例代码在这个版本上运行。最新版本有一些可以捕获错误的更改。
  • 谢谢,但对于版本“crypto2”:“0.3.2”,我收到错误消息。错误:错误:0606506D:数字信封例程:EVP_DecryptFinal_ex:错误的最终块长度
  • 在 Decipher._flush (crypto.js:156:28) 在 Decipher.prefinish (_stream_transform.js:137:10) 在 emitNone (events.js:105:13) 在 Decipher.emit ( events.js:207:7) 在 prefinish (_stream_writable.js:590:14) 在 finishMaybe (_stream_writable.js:598:5) 在 endWritable (_stream_writable.js:609:3) 在 Decipher.Writable.end (_stream_writable. js:560:5) 在 processStream (/Users/******/node_modules/crypto2/lib/crypto2.js:83:10) 在 Function.aes256cbcDecrypt [as aes256cbc] (/Users/****/ node_modules/crypto2/lib/crypto2.js:95:3)
猜你喜欢
  • 2018-11-28
  • 2021-01-05
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-11
相关资源
最近更新 更多