Как я начинаю использовать BouncyCastle? [закрытый]

Пересматривая этот вопрос с 2008 по 2010 год, вы можете рассмотреть Clojure в CLR. Это не Common Lisp, но его будет довольно легко узнать, если вы идете с этого направления. Взаимодействие с CLR очень просто, оно ежедневно привлекает все больше пользователей и затрагивает несколько других важных тем, таких как параллелизм. Возможно, стоит потратить на это немного времени. Более подробную информацию о CLR можно найти здесь здесь .

27
задан Jeff Martin 19 May 2009 в 23:11
поделиться

6 ответов

Абстракция высокого уровня? Я полагаю, что абстракции самого высокого уровня в библиотеке Bouncy Castle будут включать:

I версия библиотеки. Возможно, этот фрагмент кода предложит вам достаточно высокую абстракцию для ваших целей (пример использует шифрование AES-256):

public byte[] encryptAES256(byte[] input, byte[] key) throws InvalidCipherTextException {
    assert key.length == 32; // 32 bytes == 256 bits
    CipherParameters cipherParameters = new KeyParameter(key);

    /*
     * A full list of BlockCiphers can be found at http://www.bouncycastle.org/docs/docs1.6/org/bouncycastle/crypto/BlockCipher.html
     */
    BlockCipher blockCipher = new AESEngine();

    /*
     * Paddings available (http://www.bouncycastle.org/docs/docs1.6/org/bouncycastle/crypto/paddings/BlockCipherPadding.html):
     *   - ISO10126d2Padding
     *   - ISO7816d4Padding
     *   - PKCS7Padding
     *   - TBCPadding
     *   - X923Padding
     *   - ZeroBytePadding
     */
    BlockCipherPadding blockCipherPadding = new ZeroBytePadding();

    BufferedBlockCipher bufferedBlockCipher = new PaddedBufferedBlockCipher(blockCipher, blockCipherPadding);

    return encrypt(input, bufferedBlockCipher, cipherParameters);
}

public byte[] encrypt(byte[] input, BufferedBlockCipher bufferedBlockCipher, CipherParameters cipherParameters) throws InvalidCipherTextException {
    boolean forEncryption = true;
    return process(input, bufferedBlockCipher, cipherParameters, forEncryption);
}

public byte[] decrypt(byte[] input, BufferedBlockCipher bufferedBlockCipher, CipherParameters cipherParameters) throws InvalidCipherTextException {
    boolean forEncryption = false;
    return process(input, bufferedBlockCipher, cipherParameters, forEncryption);
}

public byte[] process(byte[] input, BufferedBlockCipher bufferedBlockCipher, CipherParameters cipherParameters, boolean forEncryption) throws InvalidCipherTextException {
    bufferedBlockCipher.init(forEncryption, cipherParameters);

    int inputOffset = 0;
    int inputLength = input.length;

    int maximumOutputLength = bufferedBlockCipher.getOutputSize(inputLength);
    byte[] output = new byte[maximumOutputLength];
    int outputOffset = 0;
    int outputLength = 0;

    int bytesProcessed;

    bytesProcessed = bufferedBlockCipher.processBytes(
            input, inputOffset, inputLength,
            output, outputOffset
        );
    outputOffset += bytesProcessed;
    outputLength += bytesProcessed;

    bytesProcessed = bufferedBlockCipher.doFinal(output, outputOffset);
    outputOffset += bytesProcessed;
    outputLength += bytesProcessed;

    if (outputLength == output.length) {
        return output;
    } else {
        byte[] truncatedOutput = new byte[outputLength];
        System.arraycopy(
                output, 0,
                truncatedOutput, 0,
                outputLength
            );
        return truncatedOutput;
    }
}

Редактировать : Упс, я только что прочитал статью, на которую вы ссылаетесь. Похоже, он говорит об абстракциях даже более высокого уровня, чем я думал (например, "

12
ответ дан 28 November 2019 в 05:52
поделиться

Предполагая, что вы пишете свое приложение на Java, я бы порекомендовал вам не использовать конкретного провайдера, а разработать приложение поверх Sun JCE (расширение криптографии Java). Это может сделать вас независимым от каких-либо базовых провайдеров, т.е. вы можете легко переключать провайдеров, если используете широко распространенные шифры. Это дает вам определенный уровень абстракции, поскольку вам не нужно знать все детали реализаций и может немного защитить вас от использования неправильных классов (например, таких как использование необработанного шифрования без надлежащего заполнения и т. Д.). Кроме того, Sun предоставляет приличное количество документации и примеров кода.

3
ответ дан 28 November 2019 в 05:52
поделиться

JCE не будет работать для меня, потому что нам нужна 256-битная сила, и мы не можем изменить конфигурацию java в системе, чтобы это разрешить. Жаль, что Bouncy Castle не имеет API такого высокого уровня, как JCE.

«Обратите внимание, однако, что bouncycastle состоит из двух библиотек, облегченной криптографической библиотеки и библиотеки интерфейса провайдера JCE. Ограничения на размер ключа применяются JCE уровень, но вам не нужно использовать этот уровень. Если вы просто используете облегченный криптографический API напрямую, у вас нет никаких ограничений, независимо от того, какие файлы политики установлены или не установлены ». http://www.coderanch.com/t/420255/Security/AES-cryptoPerms-Unlimited-Cryptography

0
ответ дан 28 November 2019 в 05:52
поделиться

Книга Начало криптографии с Java содержит очень полезные примеры и объяснения, основанные на библиотеке bouncycastle

0
ответ дан 28 November 2019 в 05:52
поделиться

Я действительно обнаружил, что в этом примере используется 128-битное шифрование по умолчанию вместо 256-битного. Я сделал небольшое изменение:

BlockCipher blockCipher = new AESEngine();

теперь становится:

BlockCipher blockCipher = new RijndaelEngine(256);

и работает вместе с моим клиентским приложением C ++ с шифрованием AES256

1
ответ дан 28 November 2019 в 05:52
поделиться

Одним из примеров API высокого (er) уровня в BouncyCastle может быть пакет CMS ( Синтаксис криптографических сообщений ). Он поставляется в отдельной банке (bcmail) от самого провайдера и записывается в JCE (однако версия C # написана для облегченного API).

«Отправить конфиденциальное сообщение» реализуется, грубо говоря, классом CMSEnvelopedDataGenerator, и все, что вам действительно нужно сделать, это передать ему сообщение, выбрать алгоритм шифрования (все детали обрабатываются внутри), а затем указать один или несколько способы, которыми получатель сможет прочитать сообщение: это может быть на основе открытого ключа / сертификата, общего секрета, пароля или даже протокола соглашения о ключах. У вас может быть более одного получателя в сообщении, и вы можете смешивать и сопоставлять типы получателей.

Вы можете использовать CMSSignedDataGenerator для аналогичной отправки проверяемого сообщения. Если вы хотите подписать и зашифровать, структуры CMS можно вкладывать / компоновать (но порядок может быть важен). Также есть CMSCompressedDataGenerator и недавно добавленный CMSAuthenticatedData.

2
ответ дан 28 November 2019 в 05:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: