2016-06-21 74 views
-2

更新:我最終設法重新創建了第三方服務所需的整個Java代碼。我必須補充說一些使用的庫已經被棄用了,但我什麼也做不了,因爲這是對方正在使用的,我必須遵守。從JAVA到node.js的加密和編碼(AES,UTF-8和base64)代碼轉換給出了不同的結果

Java代碼的

SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), 
    "AES"); 
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
    cipher.init(1, secretKeySpec); 

    byte[] aBytes = cipher.doFinal(inputString.getBytes()); 

輸入關鍵字:xxxxxxxxyyyyyyyy
輸入文本:maryhadalittlelamb

輸出: Z22GETg3Anl92%2BoyqdVWs9haQveaZxkDn8sQYP08iCY%3D

的node.js代碼

var cipher = crypto.createCipher('aes-128-ecb', key); 
var encryptedPassword = cipher.update(text, 'utf8', 'base64'); 
encryptedPassword += cipher.final('base64'); 
console.log(encryptedPassword); 

輸入鍵:xxxxxxxxyyyyyyyy
輸入文本:maryhadalittlelamb

輸出:mnqrpA2eqAhmseTrkBtH3YSGMoFs + ECPUamVd8/bgAQ =

輸出爲相同inputstring兩者的關鍵是不同的。事實上,node.js是不同的,但base64一個看起來相同。

我對這些東西相當陌生,因此我失去了我的願望。

+0

您需要準確找出SecretKeySpec輸出的內容。如果您給每個核心使用相同的密鑰字節並選擇相同的密鑰大小和模式,則它們應該是兼容的。撇開:ecb是一個弱方式,儘可能使用更好的東西。 – dandavis

+0

@dandavis java代碼屬於第三方服務,不受我控制,因此我必須按照他們想要的方式發送數據。我需要在/ SecretKeySpec中檢查/如何操作? –

+0

我猜它是KDF,你需要能夠在節點中重現輸入>輸出,以便在兩種環境中使用相同的實際密鑰。 – dandavis

回答

1

在node.js中,base64在輸入字符串在您加密之前進行編碼,它需要是輸出從需要進行base64編碼的加密。

此外,您需要在cipher.update(..)之後致電cipher.final(..)才能完成加密操作。記得從兩者中捕獲輸出。

除此之外請注意ECB mode is insecure

+0

Arhh ..事實證明,js中的'final(..)'方法不接受要加密的數據(因爲它在java中)..所以你們都需要一個更新(..)和一個final(.. )致電js –

+0

感謝Ebbe M.對你的時間,真的很感激。但仍然沒有工作。 http://pastebin.com/ap4Dk1ti請看看這個pastebin,讓我知道如果我做錯了什麼。 –

+0

看看[這裏](http://stackoverflow.com/questions/20247806/node-js-crypto-class-returning-different-results-with-updated-version) –

相關問題