2


我需要用 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 互补,但它没有用。知道有什么问题吗?
4

1 回答 1

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 将其“解码”为文本。

恐怕我对填充方面的了解不够多,无法对此发表评论。

于 2012-10-02T06:34:12.853 回答