更新:我最终设法重新创建了第三方服务所需的整个Java代码。我必须补充说一些使用的库已经被弃用了,但我什么也做不了,因为这是对方正在使用的,我必须遵守。从JAVA到node.js的加密和编码(AES,UTF-8和base64)代码转换给出了不同的结果
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());
输入关键字:xxxxxxxxyyyyyyyy
输入文本:maryhadalittlelamb
周输出: Z22GETg3Anl92%2BoyqdVWs9haQveaZxkDn8sQYP08iCY%3D
的node.js代码
var cipher = crypto.createCipher('aes-128-ecb', key);
var encryptedPassword = cipher.update(text, 'utf8', 'base64');
encryptedPassword += cipher.final('base64');
console.log(encryptedPassword);
输入键:xxxxxxxxyyyyyyyy
输入文本:maryhadalittlelamb
输出:mnqrpA2eqAhmseTrkBtH3YSGMoFs + ECPUamVd8/bgAQ =
输出为相同inputstring两者的关键是不同的。事实上,node.js是不同的,但base64一个看起来相同。
我对这些东西相当陌生,因此我失去了我的愿望。
您需要准确找出SecretKeySpec输出的内容。如果您给每个核心使用相同的密钥字节并选择相同的密钥大小和模式,则它们应该是兼容的。撇开:ecb是一个弱方式,尽可能使用更好的东西。 – dandavis
@dandavis java代码属于第三方服务,不受我控制,因此我必须按照他们想要的方式发送数据。我需要在/ SecretKeySpec中检查/如何操作? –
我猜它是KDF,你需要能够在节点中重现输入>输出,以便在两种环境中使用相同的实际密钥。 – dandavis