2012-10-02 49 views
1


我需要在java中加密并使用node.js.解密。解密结果已损坏。
在java中加密,在node.js中解密

下面是Java代码:

public String encrypt(SecretKey key, String message){ 
     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");    
     cipher.init(Cipher.ENCRYPT_MODE, key);   
     byte[] stringBytes = message.getBytes("UTF8");  
     byte[] raw = cipher.doFinal(stringBytes); 

     // converts to base64 for easier display. 
     BASE64Encoder encoder = new BASE64Encoder(); 
     String base64 = encoder.encode(raw); 

     return base64; 

    } 

这里是Node.js的代码:

AEse3SCrypt.decrypt = function(cryptkey, encryptdata) { 
    encryptdata = new Buffer(encryptdata, 'base64').toString('binary'); 

    var decipher = crypto.createDecipher('aes-128-cbc', cryptkey); 
    decipher.setAutoPadding(false); 
    var decoded = decipher.update(encryptdata); 

    decoded += decipher.final(); 
    return decoded; 
    } 

    As a key I use: "[[email protected]" 
    The jave encrypted result is: "dfGiiHZi8wYBnDetNhneBw=="<br> 
    The node.js result is garbich.... 
  1. 在java中我使用 “PKCS5Padding”。在node.js中应该怎么做关于填充?我做了setAutoPadding(false)。如果我不这样做,我会得到错误解码失败。 (仅来自node.js 0.8版)。
  2. 我试图从java中删除utf8编码,以便与node.js互补,但它不起作用。 任何想法有什么不对?

回答

1

作为一个重要的使用: “[B @ 4ec6948c”

这听起来很像你只是一个字节数组上调用toString()。这并不是给你在字节数组内的数据 - 它只是在字节数组上调用的默认实现Object.toString()

尝试使用Arrays.toString(key)打印出密钥。

如果你在node.js代码中使用了那个破损的键值,这就难怪它会给你带来垃圾回来。

我试图从Java为了去除UTF8编码是互补与node.js的

这是绝对错误的做法。相反,你应该研究如何让node.js代码将明文数据解释为UTF-8编码文本。从根本上说,字符串是字符数据和加密行为对二进制数据的影响 - 您需要一种弥合差距的方式,而UTF-8是完全合理的方式。 node.js中解密的初始结果应该是二进制数据,然后通过UTF-8“解码”为文本。

恐怕我不知道有关填充方面的评论。

+0

感谢您的回复。现在我有字节数组,但如何将其转换为node.js中的字符串?使用什么编码?我不知道编码。它是二进制的,ascii? –

+0

@ user1064101:它是UTF-8。 “二进制”不是一种编码。我不知道如何在node.js中做UTF-8解码,而不是JS人员 - 但是您应该能够研究这一点。 –

+0

我在node.js部分缓冲区中使用了数组(默认情况下,它是utf-8的文档):new Buffer([78,101,-38,-37,102,54,-115,95,37, 85,-45,24,57,-3,-35,-7],我仍然得到了错误的解密。 –