Пример шифрования / дешифрования AES с помощью Bouncycastle в J2ME - PullRequest
4 голосов
/ 22 ноября 2010

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

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

Спасибо заранее.

1 Ответ

19 голосов
/ 22 ноября 2010

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

Выберите один из механизмов AES, например AESEngine, в качестве механизма шифрования. Далее выберите режим; ECB редко бывает правильным, поэтому, например, если вы выберете режим CBC, создайте объект CBCBlockCipher из вашего объекта AESEngine. Затем используйте этот объект для создания объекта PaddedBufferBlockCipher. Конструктор по умолчанию использует заполнение PKCS7, которое идентично заполнению PKCS5, которое вы хотите. Теперь вам нужно создать объект для удержания клавиши и IV. Это интерфейс CipherParameters. Вы создаете объект в два этапа. Сначала вы создаете объект KeyParameter с вашим ключом. Затем вы создаете объект ParametersWithIV с вашим объектом KeyParameter и вашим IV. Этот объект передается методу init объекта PaddedBufferBlockCipher, и вы готовы к работе.

РЕДАКТИРОВАТЬ

Вот небольшой пример:

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);
}
...