Шифрование/дешифрование AES с примером Bouncycastle в J2ME


Я хочу зашифровать и расшифровать данные в J2ME с помощью алгоритма AES с помощью bouncy castle может ли кто-нибудь дать мне пример кода для этого

Я хочу использовать ECB с PKCS5Padding

Заранее благодарю.

1 4

1 ответ:

Я уверен, что есть примеры, но я их не нашел. Вот несколько советов, которые помогут вам начать работу. Вам нужно научиться соединять классы BC вместе. Во-первых, получите исходный код bouncycastle и будьте готовы взглянуть на него, когда у вас возникнут вопросы. Это на самом деле очень читабельно, так что не бойтесь изучить его, когда документация плохая. Например, многие классы хотят иметь экземпляр объекта CipherParameters, но в документации редко указывается что-либо еще. деталь. Однако в исходном коде будет очевидно, какие классы реализации ожидаются.

Выберите один из движков AES, например 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);
}