Причина в том, что Java использует подписанные байты.Вы должны использовать два дополнения на стороне JavaScript на IV и зашифрованном тексте.Ваш JS-код должен выглядеть следующим образом:
var password = "MyPassword1";
var salt = "MysaltString";
var derivedKey = forge.pkcs5.pbkdf2(password, salt, 1024, 32);
for (var i = 0; i < iv_in.length; i++) {
iv_in[i] = (iv_in[i] & 0xFF);
}
var iv = String.fromCharCode.apply(String, iv_in);
for (var i = 0; i < encrypted.length; i++) {
encrypted[i] = (encrypted[i] & 0xFF);
}
var input_c = String.fromCharCode.apply(String, encrypted)
var input = forge.util.createBuffer(input_c);
var decipher = forge.cipher.createDecipher('AES-CBC', derivedKey);
decipher.start({iv: iv});
decipher.update(input);
var res = decipher.finish();
if (res) {
console.log(decipher.output.toString('utf8'));
}
, где iv_in
и encrypted
- это входные байтовые массивы, которые вы получаете от Java, например:
var iv_in = [24, -54, -15, 5, 106, -44, 20, 10, 103, -62, -88, 28, 75, -68, -12, -14];
и
var encrypted = [20, -56, 117, 80, -91, -104, 22, -43, -127, -87, 7, 113, 66, 85, 105, -25]