Шифрование/дешифрование AES с примером Bouncycastle в J2ME
Я хочу зашифровать и расшифровать данные в J2ME с помощью алгоритма AES с помощью bouncy castle может ли кто-нибудь дать мне пример кода для этого
Я хочу использовать ECB с PKCS5Padding
Заранее благодарю.
1 ответ:
Я уверен, что есть примеры, но я их не нашел. Вот несколько советов, которые помогут вам начать работу. Вам нужно научиться соединять классы BC вместе. Во-первых, получите исходный код bouncycastle и будьте готовы взглянуть на него, когда у вас возникнут вопросы. Это на самом деле очень читабельно, так что не бойтесь изучить его, когда документация плохая. Например, многие классы хотят иметь экземпляр объекта
Выберите один из движков AES, напримерCipherParameters
, но в документации редко указывается что-либо еще. деталь. Однако в исходном коде будет очевидно, какие классы реализации ожидаются.AESEngine
, в качестве движка шифрования. Затем выберите режим; ECB редко бывает правильным, поэтому, например, если вы выбираете режим CBC, то создайте объектCBCBlockCipher
из вашего объектаAESEngine
. Затем используйте этот объект для создания объектаPaddedBufferBlockCipher
. Конструктор по умолчанию использует pkcs7 padding, который идентичен pkcs5 padding, который вы хотите. Теперь вам нужно создать объект, чтобы удерживайте клавишу и IV.это интерфейсCipherParameters
. Вы создаете объект в два этапа. Сначала вы создаете объектKeyParameter
с помощью своего ключа. Затем вы создаете объектParametersWithIV
с вашим объектомKeyParameter
и вашим IV. этот объект передается в методinit
объектаPaddedBufferBlockCipher
, а затем ваш готов к работе.EDIT
Вот небольшой пример:
private static byte[] cipherData(PaddedBufferedBlockCipher cipher, byte[] data) throws Exception { int minSize = cipher.getOutputSize(data.length); byte[] outBuf = new byte[minSize]; int length1 = cipher.processBytes(data, 0, data.length, outBuf, 0); int length2 = cipher.doFinal(outBuf, length1); int actualLength = length1 + length2; byte[] result = new byte[actualLength]; System.arraycopy(outBuf, 0, result, 0, result.length); return result; } private static byte[] decrypt(byte[] cipher, byte[] key, byte[] iv) throws Exception { PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(new CBCBlockCipher( new AESEngine())); CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(key), iv); aes.init(false, ivAndKey); return cipherData(aes, cipher); } private static byte[] encrypt(byte[] plain, byte[] key, byte[] iv) throws Exception { PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(new CBCBlockCipher( new AESEngine())); CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(key), iv); aes.init(true, ivAndKey); return cipherData(aes, plain); }