Я пытаюсь что-то зашифровать в JavaScript, используя https://code.google.com/p/crypto-js/#AES именно так, как в примере. Проблема в том, что когда я пытаюсь расшифровать его на Java, результат сильно отличается. Единственная разница, которую я вижу, это заполнение (CryptoJs использует Pkcs7, тогда как java использует Pkcs5). Немного почитав, я понял, что Pkcs7 и Pkcs5 в основном одинаковы.
Вот пример кода, который я шифрую в Javascript:
var crypto = require('./aes.js');
var login = 'ABCD';
var key = crypto.CryptoJS.enc.Hex.parse('0123456789012345');
var ive = crypto.CryptoJS.enc.Hex.parse('0123456789012345');
var encrypted = crypto.CryptoJS.AES.encrypt(login, key, {iv: ive});
console.log('encrypted msg = ' + encrypted)
Это код, который я использую в Java для его расшифровки:
public String decrypt(byte[] cipherText) throws Exception {
String psk = "0123456789012345";
String iv = "0123456789012345";
try {
String encryptionKey = psk;
final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", "SunJCE");
final SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes(UTF8), "AES");
cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv.getBytes(UTF8)));
return new String(cipher.doFinal(cipherText), UTF8);
} catch (BadPaddingException | IllegalBlockSizeException | UnsupportedEncodingException | InvalidAlgorithmParameterException | InvalidKeyException | NoSuchAlgorithmException | NoSuchPaddingException | NoSuchProviderException ex) {
LOG.log(Level.SEVERE, ex.getMessage(), ex);
throw new Exception(ex.getMessage());
}
}
У вас есть идеи, почему это так плохо? Это другой алгоритм или я ошибаюсь где-то еще?