Javascript 加密及;从JAVA到node.js的编码(AES、UTF-8和base64)代码转换会产生不同的结果

Javascript 加密及;从JAVA到node.js的编码(AES、UTF-8和base64)代码转换会产生不同的结果,javascript,java,node.js,encryption,node-crypto,Javascript,Java,Node.js,Encryption,Node Crypto,更新:我终于按照第三方服务的要求重新创建了整个Java代码。我必须补充一点,使用的一些库已被弃用,但我不能做任何事情,因为这是另一方正在使用的,我必须遵守 Java代码 SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(1, secre

更新:我终于按照第三方服务的要求重新创建了整个Java代码。我必须补充一点,使用的一些库已被弃用,但我不能做任何事情,因为这是另一方正在使用的,我必须遵守

Java代码

   SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(),
    "AES");
   Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
   cipher.init(1, secretKeySpec);

   byte[] aBytes = cipher.doFinal(inputString.getBytes());
var cipher = crypto.createCipher('aes-128-ecb', key);
var encryptedPassword = cipher.update(text, 'utf8', 'base64');
encryptedPassword += cipher.final('base64');
console.log(encryptedPassword);
输入键:XXXXXXXXYYYYYYY
输入文本:maryhadalittlelamb

输出: Z22GETg3Anl92%2BoyqdVWs9haQveaZxkDn8sQYP08iCY%3D

node.js代码

   SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(),
    "AES");
   Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
   cipher.init(1, secretKeySpec);

   byte[] aBytes = cipher.doFinal(inputString.getBytes());
var cipher = crypto.createCipher('aes-128-ecb', key);
var encryptedPassword = cipher.update(text, 'utf8', 'base64');
encryptedPassword += cipher.final('base64');
console.log(encryptedPassword);
输入键:XXXXXXXXYYYYYYY
输入文本:maryhadalittlelamb

输出:mnqrpA2eqAhmseTrkBtH3YSGMoFs+ECPUamVd8/bgAQ=

对于相同的inputstring和key,两者的输出都不同。实际上node.js是不同的,但是base64看起来是相同的


我对这些事情还不太熟悉,所以我失去了勇气

在node.js中,在加密之前对输入字符串进行base64编码,它需要是需要进行base64编码的encrypt的输出

另外,您需要在
cipher.update(…)
之后调用
cipher.final(…)
以完成加密操作。记住从这两方面捕获输出


除此之外,请注意。

您需要准确了解什么是
SecretKeySpec
输出。如果给每个aes核心相同的密钥字节,并选择相同的密钥大小和模式,则它们应该是兼容的。旁白:ecb是一种弱模式,如果可能,请使用更好的方式。@dandavis java代码属于第三方服务,不在我的控制之下,因此我必须按照他们想要的方式发送数据。我需要用/in
SecretKeySpec
检查什么以及如何检查;我猜它是KDF,您需要能够在节点中重现输入>输出,以便aes在两种环境中使用相同的实际键。
String
不是二进制数据的容器。这是错误的:
stringdoc2=新字符串(aBytes,“UTF-8”)createCipheriv
而不是
createCipher
。这是链接重复答案的要点。啊。。事实证明,js中的
final(…)
方法不接受要加密的数据(就像java中那样)。。所以你们都需要一个更新(…)和一个最终(…)的JSM呼叫。谢谢你们的时间,非常感谢。但仍然不起作用。请看一下这个粘贴箱,如果我做错了什么,请告诉我。看一看,我已经根据您共享的线程更新了代码。请看一看。我甚至尝试重新创建Java代码,因为第三方服务的演示代码已经过时了base64encoder。请告诉我是否可以重新创建相同的代码。谢谢