在java中加密,在node.js中解密

时间:2012-10-02 06:29:31

标签: java node.js encryption aes


我需要在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: "[B@4ec6948c"
  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 个答案:

答案 0 :(得分:1)

  

作为我使用的钥匙:&#34; [B @ 4ec6948c&#34;

听起来非常像你只是在字节数组上调用toString()。这并没有在字节数组中提供数据 - 它只是Object.toString()的默认实现,在字节数组上调用。

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

如果你在node.js代码中使用了那个破碎的密钥值,那么难怪它会给你垃圾回收。

  

我尝试从java中删除utf8编码,以便与node.js

互补

这绝对是错误的做法。相反,您应该弄清楚如何使node.js代码将明文数据解释为UTF-8编码文本。从根本上说,字符串是字符数据,加密作用于二进制数据 - 你需要一种弥合差距的方法,而UTF-8是一种完全合理的方法。 node.js中解密的初始结果应该是二进制数据,然后你可以解码&#34;通过UTF-8发短信。

我担心我对填充方面的了解不够充分。