2012-07-13 93 views
0

我想从Java(Android)发送数据到Node.js应用程序,除了加密不工作和Node.js没有正确解密,我真的不知道我在做什么。加密和解密数据通过传输通过Java到Node.js

的Java:

    // Encrypt 
        byte[] input = jo.toString().getBytes("UTF-8"); 

        MessageDigest md = MessageDigest.getInstance("MD5"); 
        byte[] thedigest = md.digest(ENCRYPTION_KEY.getBytes("UTF-8")); 
        SecretKeySpec skc = new SecretKeySpec(thedigest, "AES/ECB/PKCS5Padding"); 
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
        cipher.init(Cipher.ENCRYPT_MODE, skc); 

        byte[] cipherText = new byte[cipher.getOutputSize(input.length)]; 
        int ctLength = cipher.update(input, 0, input.length, cipherText, 0); 
        ctLength += cipher.doFinal(cipherText, ctLength); 
        String query = Base64.encodeToString(cipherText, Base64.DEFAULT); 

query然后被发送到我们的服务器和joJSONObject

及以上的节点,我做:

 var decipher = crypto.createDecipher('aes-128-ecb', encryption_key); 
     console.log("System: " + new Buffer(fullBuffer, "base64").toString("binary")); 

     chunks = [] 
     chunks.push(decipher.update(new Buffer(fullBuffer, "base64").toString("binary") , 'hex', 'utf-8')); 
     chunks.push(decipher.final('utf-8')); 
     var txt = chunks.join(""); 

     console.log("System: " + txt); 
     js = JSON.parse(txt); 
     console.log("System: " + js); 

而且fullBuffer是收到正确传输的POST数据

+0

那么,什么问题? – 2012-07-13 19:57:52

+0

如何在Java中正确加密数据,然后使用AES在Node.js中对其进行解密 – 2012-07-13 19:59:03

+0

我看到一个可接受的答案Joe,但实际解决了什么问题? – 2012-07-15 20:58:32

回答

2

加密和身份验证对调试很残酷,因为您犯的任何错误都会导致整个输出随机化。建议:

  1. 切换到像Base64或gzip这样的非加密转换,以便您可以看到您的输出看起来像什么。
  2. 试着找出哪一半是坏的。捕获你的服务器输出并用openssl或python解码。用其中一种生成一些好的输入并将其填入客户端。
  3. CBC比ECB更安全。
  4. 如果这些都没有帮助,请进入低级密码和解密,并确保密钥和密文在内容和长度上完全匹配,并且长时间难以眯眼算法选择。
+0

谢谢,我不能使用CBC没有它打破。代码:https://gist.github.com/3111592 – 2012-07-14 14:31:34