Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AES/CBC/PKCS5PIV-从Java到NodeJs的解密_Javascript_Java_Node.js_Encryption_Node Crypto - Fatal编程技术网

Javascript AES/CBC/PKCS5PIV-从Java到NodeJs的解密

Javascript AES/CBC/PKCS5PIV-从Java到NodeJs的解密,javascript,java,node.js,encryption,node-crypto,Javascript,Java,Node.js,Encryption,Node Crypto,我正在尝试用NodeJs解密。它在Java中工作。但我无法在节点中实现相同的功能 我使用的是节点版本:8.4 请查找我的NodeJs代码: var crypto = require('crypto'); function decryption (message, key) { var messageArray = Buffer.from(message, 'base64'); // var kekbuf = Buffer(key, 'utf8'); var ivBuf

我正在尝试用NodeJs解密。它在Java中工作。但我无法在节点中实现相同的功能

我使用的是节点版本: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中相同的结果


请帮我解决这个问题。

使用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!');
                }
            })
        }

当您在Java代码中明确使用填充时,为什么不启用填充?启用它之后,我遇到了一个错误crypto.js:181 var ret=this._handle.final()^错误:错误:06065064:数字信封例程:EVP_DecryptFinal_ex:Decrypheriv.final(crypto.js:181:26)解密错误谢谢,但在尝试了您的示例之后,我得到了错误:(节点:17805)未处理的Promisejection警告:未处理的承诺拒绝(拒绝id:1):类型错误:IV必须是缓冲区(节点:17805)[DEP0018]弃用警告:未处理的承诺拒绝被弃用。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程。我刚刚将encryptedText和key作为参数传递给函数。(npm安装crypto2后)@ChaitanyaJoshi,我忘了提到版本,尝试下载/安装crypto2版本0.3.2,我的示例代码在此版本上运行。最新版本有一个小的更改,将捕获错误。谢谢,但对于版本“crypto2”:“0.3.2”,我收到一个错误。错误:错误:0606506D:数字信封例程:EVP_DecryptFinal_ex:解密的最终块长度错误。_flush(crypto.js:156:28)在Decipher.prefish(_stream_transform.js:137:10)在emitNone(events.js:105:13)在Decipher.emit(events.js:207:7)在finish(_stream_writable.js:590:14)在finish(_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.aes256cbecrypt[作为aes256cbc](/Users/***/node_modules/crypto2/lib/crypto2.js:95:3)