org librería font example español digests crypto bouncy cryptography bouncycastle

cryptography - librería - ¿Cómo empiezo a usar BouncyCastle?



librería bouncycastle (7)

¿Abstracción de alto nivel? Supongo que las abstracciones de más alto nivel en la biblioteca de Bouncy Castle incluirían:

Estoy familiarizado con la versión de Java de la biblioteca. Quizás este fragmento de código le ofrezca una abstracción lo suficientemente alta para sus propósitos (por ejemplo, el uso del cifrado 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; } }

Edición : Vaya, acabo de leer el artículo al que has vinculado. Parece que está hablando de abstracciones de nivel incluso más alto de lo que pensaba (por ejemplo, "enviar un mensaje confidencial"). Me temo que no entiendo muy bien a qué se refiere.

Así que después de la diversión de CodingHorror con el cifrado y los comentarios agitados , estamos reconsiderando hacer nuestro propio cifrado.

En este caso, necesitamos pasar alguna información que identifique a un usuario a un servicio de terceros que luego volverá a llamar a un servicio en nuestro sitio web con la información más un hash.

El segundo servicio busca información sobre ese usuario y luego la transfiere al servicio de terceros.

Queremos cifrar esta información de usuario que ingresa al servicio de terceros y descifrarla después de que salga. Así que no es un cifrado de larga duración.

En el artículo sobre codificación de horror, Coda Hale recomendó BouncyCastle y una abstracción de alto nivel en la biblioteca para realizar el cifrado específico para una necesidad particular.

Mi problema es que los espacios de nombres de BouncyCastle son enormes y la documentación es inexistente. ¿Alguien puede dirigirme a esta biblioteca de abstracción de alto nivel? (¿O otra opción además de BouncyCastle?)


De hecho, he encontrado que este ejemplo utiliza el cifrado predeterminado de 128 bits en lugar de 256 bits. He hecho un pequeño cambio:

BlockCipher blockCipher = new AESEngine();

ahora se convierte en:

BlockCipher blockCipher = new RijndaelEngine(256);

y funciona junto con mi aplicación cliente C ++ AES256 cifrado



JCE no funcionará para mí porque queremos 256 bits de fuerza y ​​no podemos cambiar la configuración de Java en el sistema para permitirlo. Lástima que Bouncy Castle no tenga una API tan alta como JCE.

"Sin embargo, tenga en cuenta que bouncycastle consta de dos bibliotecas, la biblioteca de criptografía ligera y la biblioteca de interfaz del proveedor de JCE. La capa JCE impone las restricciones de tamaño de clave, pero no necesita usar esta capa. Si solo utiliza la API de criptografía ligera directamente no tiene restricciones, sin importar qué archivos de políticas estén o no estén instalados ". http://www.coderanch.com/t/420255/Security/AES-cryptoPerms-Unlimited-Cryptography


Puedes utilizar:

byte[] process(bool encrypt, byte[] input, byte[] key) { var cipher = CipherUtilities.GetCipher("Blowfish"); cipher.Init(false, new KeyParameter(key)); return cipher.DoFinal(input); } // Encrypt: byte[] encrypted = process(true, clear, key); // Decrypt: byte[] decrypted = process(false, encrypted, key);

Consulte: https://github.com/wernight/decrypt-toolbox/blob/master/dtDecrypt/Program.cs


Suponiendo que escriba su aplicación en Java, le recomendaría que no utilice un proveedor específico, pero que desarrolle su aplicación sobre la JCE (extensión de criptografía de Java) de Sun. Si lo hace, puede hacerlo independiente de cualquier proveedor subyacente, es decir, puede cambiar de proveedor fácilmente siempre que utilice cifrados que se implementen ampliamente. Le proporciona un cierto nivel de abstracción, ya que no tiene que conocer todos los detalles de las implementaciones y puede protegerlo un poco del uso de clases incorrectas (por ejemplo, usar el cifrado sin el relleno adecuado, etc.) Además, Sun proporciona una cantidad decente de documentación y muestras de código.


Un ejemplo de una API de alto nivel (er) en BouncyCastle sería el paquete CMS ( Cryptographic Message Syntax ). Esto se envía en un frasco separado (bcmail) del propio proveedor, y se escribe en la JCE (la versión de C # está escrita contra la API de peso ligero, sin embargo).

En términos generales, la clase CMSEnvelopedDataGenerator implementa "enviar un mensaje confidencial", y todo lo que necesita hacer es darle el mensaje, elegir un algoritmo de cifrado (todos los detalles se manejan internamente) y luego especificar una o más formas de el destinatario podrá leer el mensaje: puede basarse en una clave pública / certificado, un secreto compartido, una contraseña o incluso un protocolo de acuerdo clave. Puede tener más de un destinatario en un mensaje, y puede mezclar y combinar tipos de destinatarios.

Puede usar CMSSignedDataGenerator para enviar un mensaje verificable de manera similar. Si desea firmar y cifrar, las estructuras de CMS se pueden anidar / componer (pero el orden podría ser importante). También hay CMSCompressedDataGenerator y CMSAuthenticatedData recientemente agregado.