我已經得到了下面的Java代碼,我想端口的Node.js:移植AES解密的Java代碼,Node.js加載
// Java
byte[] rawKey = "deadbeefdeadbeef".getBytes("us-ascii");
SecretKeySpec skeySpec = new SecretKeySpec(rawKey, "AES");
Cipher cip = Cipher.getInstance("AES/ECB/NoPadding");
cip.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] plaintext = cip.doFinal(ciphertext, 0, ciphertext.length);
這是我嘗試用Node.js的,使用流
// JS, using the crypto streams API
var decipher = crypto.createDecipher('aes-128-ecb', 'deadbeefdeadbeef');
decipher.setAutoPadding(false);
decipher.pipe(concat(function(plaintext) { console.log(plaintext); });
decipher.end(ciphertext);
而且,還使用Node.js的嘗試老.update()
和.final()
API:
// JS, using the `.update()` and `.final()` API
var decipher = crypto.createDecipher('aes-128-ecb', 'deadbeefdeadbeef');
decipher.setAutoPadding(false);
var pieces = [];
pieces.push(new Buffer(decipher.update(ciphertext)));
pieces.push(new Buffer(decipher.final()));
var plaintext = Buffer.concat(pieces);
這兩版本產生正確長度(與輸入長度相同)的相同輸出,但是該輸出與在相同輸入緩衝器上運行的解密Java版本產生的明文不同。如何設置像上面配置的Java解碼器一樣的Node.js解碼?
謝謝。
當您在JS代碼中指定AES-256時,您似乎在Java代碼中使用AES-128。我不確定JS API如何接受256位密碼的128位密鑰;也許它正在執行某種密鑰派生? – ntoskrnl
我的不好,那是從舊代碼複製/粘貼!謝謝你指出。在發佈這個問題的時候,我已經計算出了很多。自那之後我就解決了這個問題,並且很快就會發佈一個答案。雖然,我並不熟悉加密技術,也不瞭解答案的含義:使用'crypto.createDecipheriv('aes-128-ecb','deadbeefdeadbeef','');'做了訣竅。 –
@ntoskrnl:是的,有一段時間我用128位密鑰使用'aes-256-ecb',否則它不會拋出或指示錯誤。只是產生不需要的解密輸出。 –