2016-06-21 70 views
-2

更新:我最终设法重新创建了第三方服务所需的整个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一个看起来相同。

我对这些东西相当陌生,因此我失去了我的愿望。

+0

您需要准确找出SecretKeySpec输出的内容。如果您给每个核心使用相同的密钥字节并选择相同的密钥大小和模式,则它们应该是兼容的。撇开:ecb是一个弱方式,尽可能使用更好的东西。 – dandavis

+0

@dandavis java代码属于第三方服务,不受我控制,因此我必须按照他们想要的方式发送数据。我需要在/ SecretKeySpec中检查/如何操作? –

+0

我猜它是KDF,你需要能够在节点中重现输入>输出,以便在两种环境中使用相同的实际密钥。 – dandavis

回答

1

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

此外,您需要在cipher.update(..)之后致电cipher.final(..)才能完成加密操作。记得从两者中捕获输出。

除此之外请注意ECB mode is insecure

+0

Arhh ..事实证明,js中的'final(..)'方法不接受要加密的数据(因为它在java中)..所以你们都需要一个更新(..)和一个final(.. )致电js –

+0

感谢Ebbe M.对你的时间,真的很感激。但仍然没有工作。 http://pastebin.com/ap4Dk1ti请看看这个pastebin,让我知道如果我做错了什么。 –

+0

看看[这里](http://stackoverflow.com/questions/20247806/node-js-crypto-class-returning-different-results-with-updated-version) –

相关问题