我想了解爲什麼使用Java或Node.js加密它時加密數據發生了變化,我需要修改node.js代碼以使其返回與我在Java上完全相同的加密數據。 (請注意,我不能修改Java代碼)爲什麼node.js的加密模塊會給出與Java的Cipher類進行AES加密不同的結果?
Node.js的執行情況:
var crypto = require('crypto');
console.log("\n\n============");
var cKey = new Buffer("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "utf-8");
var cIv = new Buffer("1111111111111111", "utf-8");
var cData = "x";
console.log(cKey);
console.log(cIv);
console.log("UTF-8 Data: " + cData);
var cipher = crypto.createCipheriv("aes-256-cbc", cKey, cIv);
var cipherText = cipher.update(cData, 'utf8', 'hex') + cipher.final('hex');
console.log("Our data: " + cipherText);
前面的代碼將打印以下結果:
<Buffer 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41>
<Buffer 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31>
UTF-8 Data: x
Our data: 0eddfe1857248c7057904455d189cf31
Java實現:
byte[] key = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".getBytes();
byte[] data = "x".getBytes();
byte[] iv = "1111111111111111".getBytes();
Cipher cipher = Cipher.getInstance("AES");
IvParameterSpec ivspec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"), ivspec);
byte[] result = cipher.doFinal(data);
_print(result);
這個代碼將打印:
17b0ccd594229baa6dabd5e850e07fdf
請注意,我比較了數據,IV和密鑰和那些字節是完全一樣的。
如何修改節點的代碼片段,使其返回java的相同字節?
我認爲在java'AES'的意思是'aes-128-cbc'。我猜密鑰大小在獲取密碼文本中很重要。 – Kishore
什麼是AesSymmetricKey?這門課來自哪裏,它有什麼作用? if和initializationVector有什麼區別?爲什麼Java代碼調用EncryptionService.encryptAesData,然後調用cipher.doFinal?是有原因還是隻是冗餘? – wallenborn
對不起,我忘了刪除它,它不是這段代碼的一部分。 –