2012-10-02 47 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],我仍然得到了錯誤的解密。 –