Я реализовал шифрование AES с определенными параметрами, специфичными для задачи, используя стандартные инструменты Java и поставщика BouncyCastle для конкретного алгоритма AES.
Вот код:
private byte[] aesEncryptedInfo(String info) throws UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidParameterSpecException, InvalidAlgorithmParameterException, NoSuchProviderException {
Security.addProvider(new BouncyCastleProvider());
SecretKey secret = new SecretKeySpec(CUSTOMLONGSECRETKEY.substring(0, 32).getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, secret, new IvParameterSpec(VECTOR_SECRET_KEY.getBytes()));
return cipher.doFinal(info.getBytes("UTF-8"));
}
В некоторых средах этот код требует специальных файлов политики. См. Связанный вопрос: InvalidKeyException Недопустимый размер ключа
Моя цель - переопределить ее с помощью сторонней библиотеки, в идеале я бы использовал надувной замок, который уже используется в качестве провайдера. В библиотеке не должно быть ограничений стандартных файлов политик Java. Другими словами, не должно быть никаких ограничений.
Пожалуйста, предложите в своих ответах, как переопределить его, используя BouncyCastle или другую стороннюю библиотеку, которая может работать без указанных ограничений. В идеале я бы увидел код: -)
Большое спасибо за чтение!
После задержки я теперь с удовольствием выложу решение. Надеюсь, что кто-то может извлечь из этого пользу, потому что документация Bouncy Castle не содержит много примеров: -)
private byte[] aesEncryptedInfo(String info)
// Creating AES/CBC/PKCS7Padding cipher with specified Secret Key and Initial Vector
PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESEngine()), new PKCS7Padding());
cipher.init(true, new ParametersWithIV(new KeyParameter(CUSTOMLONGSECRETKEY.getBytes()), VECTOR_SECRET_KEY.getBytes()));
byte[] inputData = info.getBytes("UTF-8");
int outBlockSize = cipher.getOutputSize(inputData.length);
byte[] outputData = new byte[outBlockSize];
int outLength = cipher.processBytes(inputData, 0, inputData.length, outputData, 0);
outLength += cipher.doFinal(outputData, outLength);
if (outLength != outBlockSize) {
return Arrays.copyOf(outputData, outLength);
}
else {
return outputData;
}
}
Кстати, я обнаружил два отличия между Java API и Bouncy Castle API:
1. Надувной замок использует композицию объектов для создания необходимого шифра. В то время как Java API использует строку для определения необходимого шифра.
2. Код шифрования BC немного больше, а код Java API более компактен.
Решение - полная замена оригинальной реализации Java API - доказательством является пользовательский модульный тест, который я сделал.