Пересматривая этот вопрос с 2008 по 2010 год, вы можете рассмотреть Clojure в CLR. Это не Common Lisp, но его будет довольно легко узнать, если вы идете с этого направления. Взаимодействие с CLR очень просто, оно ежедневно привлекает все больше пользователей и затрагивает несколько других важных тем, таких как параллелизм. Возможно, стоит потратить на это немного времени. Более подробную информацию о CLR можно найти здесь здесь .
Абстракция высокого уровня? Я полагаю, что абстракции самого высокого уровня в библиотеке 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;
}
}
Редактировать : Упс, я только что прочитал статью, на которую вы ссылаетесь. Похоже, он говорит об абстракциях даже более высокого уровня, чем я думал (например, "
Предполагая, что вы пишете свое приложение на Java, я бы порекомендовал вам не использовать конкретного провайдера, а разработать приложение поверх Sun JCE (расширение криптографии Java). Это может сделать вас независимым от каких-либо базовых провайдеров, т.е. вы можете легко переключать провайдеров, если используете широко распространенные шифры. Это дает вам определенный уровень абстракции, поскольку вам не нужно знать все детали реализаций и может немного защитить вас от использования неправильных классов (например, таких как использование необработанного шифрования без надлежащего заполнения и т. Д.). Кроме того, Sun предоставляет приличное количество документации и примеров кода.
JCE не будет работать для меня, потому что нам нужна 256-битная сила, и мы не можем изменить конфигурацию java в системе, чтобы это разрешить. Жаль, что Bouncy Castle не имеет API такого высокого уровня, как JCE.
«Обратите внимание, однако, что bouncycastle состоит из двух библиотек, облегченной криптографической библиотеки и библиотеки интерфейса провайдера JCE. Ограничения на размер ключа применяются JCE уровень, но вам не нужно использовать этот уровень. Если вы просто используете облегченный криптографический API напрямую, у вас нет никаких ограничений, независимо от того, какие файлы политики установлены или не установлены ». http://www.coderanch.com/t/420255/Security/AES-cryptoPerms-Unlimited-Cryptography
Книга Начало криптографии с Java содержит очень полезные примеры и объяснения, основанные на библиотеке bouncycastle
Я действительно обнаружил, что в этом примере используется 128-битное шифрование по умолчанию вместо 256-битного. Я сделал небольшое изменение:
BlockCipher blockCipher = new AESEngine();
теперь становится:
BlockCipher blockCipher = new RijndaelEngine(256);
и работает вместе с моим клиентским приложением C ++ с шифрованием AES256
Одним из примеров API высокого (er) уровня в BouncyCastle может быть пакет CMS ( Синтаксис криптографических сообщений ). Он поставляется в отдельной банке (bcmail) от самого провайдера и записывается в JCE (однако версия C # написана для облегченного API).
«Отправить конфиденциальное сообщение» реализуется, грубо говоря, классом CMSEnvelopedDataGenerator, и все, что вам действительно нужно сделать, это передать ему сообщение, выбрать алгоритм шифрования (все детали обрабатываются внутри), а затем указать один или несколько способы, которыми получатель сможет прочитать сообщение: это может быть на основе открытого ключа / сертификата, общего секрета, пароля или даже протокола соглашения о ключах. У вас может быть более одного получателя в сообщении, и вы можете смешивать и сопоставлять типы получателей.
Вы можете использовать CMSSignedDataGenerator для аналогичной отправки проверяемого сообщения. Если вы хотите подписать и зашифровать, структуры CMS можно вкладывать / компоновать (но порядок может быть важен). Также есть CMSCompressedDataGenerator и недавно добавленный CMSAuthenticatedData.