Java和Node之间的encryption不一致

我试图在Node.js中复制一个基于Java的encryptionscheme,但不幸的是我得到了不一致的结果。

这是Java方法:

private Transfer encrypt(byte[] salt, String ticketNumber, String data) throws Exception { SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); KeySpec spec = new PBEKeySpec(ticketNumber.toCharArray(), salt, 1000, 128); SecretKey tmp = factory.generateSecret(spec); SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES"); String encoded = java.util.Base64.getEncoder().encodeToString(secret.getEncoded()); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); byte[] iv ={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; IvParameterSpec ips = new IvParameterSpec(iv); cipher.init(Cipher.ENCRYPT_MODE, secret, ips); AlgorithmParameters params = cipher.getParameters(); Transfer myRetVal = new Transfer(); byte[] ivBytes = params.getParameterSpec(IvParameterSpec.class).getIV(); //Set some decrypt information myRetVal.setIv(Base64.encodeBase64String(ivBytes)); //Set the attendee data myRetVal.setData(Base64.encodeBase64String(cipher.doFinal(data.getBytes()))); //Set the hashed Ticket number myRetVal.setTicketNumberHashed(Base64.encodeBase64String(getHash(hashIterations, ticketNumber, salt))); return myRetVal; } 

和我的节点版本:

 exports.getEncryptedString = function(salt, password, data) { var iv = new Buffer('0000000000000000'); var key = crypto.pbkdf2Sync(password, salt, 1000, 16, 'sha1'); var cipher = crypto.createCipheriv('aes-128-cbc', key, iv); return cipher.update(data, 'utf8', 'base64') + cipher.final('base64'); }; 

当我传递两个函数的string“SomeJSON”和相同的密钥,我得到不同的encryption结果。

来自Java: ENnQzWowzrl7LQchRmL7sA==从节点: TGreJNmQH92gHb1bSy4xAA==

我无法弄清楚我的Node实现中有什么不同。

new Buffer('0000000000000000')默认使用utf8编码,但UTF-8中的"0"是字节0x30而在Java中,您使用的是0x00字节的IV。 你想要的是要么

 var iv = new Buffer('00000000000000000000000000000000', 'hex'); 

要么

 var iv = new Buffer(16); iv.fill(0); 

完成testing后,您应该更改过程以生成每个encryption的新IV。 IV不一定是保密的,所以你可以简单地把它加在密文上。 当你想稍后解密时,可以closuresIV(AES的16个字节),并在解密时使用它。