Guía de desarrollo

Local Navigation

Formateadores y desformateadores de bloques

El formateo de bloques se realiza rellenando y codificando bloques de datos. Con el fin de ayudarle a formatear y desformatear bloques, la RIM Cryptographic API incluye las interfaces net.rim.device.api.crypto.BlockFormatterEngine y net.rim.device.api.crypto.BlockUnformatterEngine. Estas interfaces incluyen los algoritmos PKCS5, OAEP y PKCS1. PKCS5 proporciona relleno; OAEP y PKCS1, por su parte, proporcionan codificación de bloques.

Un motor BlockFormatterEngine utiliza un motor BlockEncryptorEngine para cifrar los datos una vez que se hayan completado las labores de codificación y relleno. BlockEncryptor utiliza un motor BlockEncryptorEngine y otro BlockFormatterEngine, de forma que pueda utilizar cualquiera de ellos con el enfoque basado en flujo.

Los siguientes ejemplos de código muestran dos enfoques distintos a la hora de utilizar los formateadores de bloques.

Ejemplo de código: usar formateadores de bloques

El siguiente ejemplo de código utiliza el motor PKCS5FormatterEngine. Especifica la entrada y la salida y, a continuación, crea una nueva clave DES aleatoria. Crea el motor y el motor del codificador de bloques. Codifica y cifra los datos mediante PKCS5. El último argumento booleano indica si se trata del último bloque.

// Input (less than 8 bytes).
byte[] input = { 0x00, 0x00, 0x00, 0x00, 0x00 };
// Output.
byte[] output = new byte[ 8 ];
// Create a random new DES key.
DESKey key = new DESKey();
// Create the engine.
DESEncryptorEngine desEngine = new DESEncryptorEngine( key );
// Create the block encoder engine.
PKCS5FormatterEngine formatter = new PKCS5FormatterEngine( desEngine );
// Encode and encrypt the information using PKCS5.
// The last boolean argument indicates whether this is the last block.
formatter.formatAndEncrypt( input, 0, input.length, output, 0, true );
System.out.println("Ciphertext = " + new String( output ) + ".")

Ejemplo de código: usar un formateador para cifrar un flujo de datos

El siguiente ejemplo de código utiliza el formateador para cifrar un flujo de datos. Este ejemplo utiliza DES en modo CBC con relleno PKCS5.

El ejemplo de código especifica la entrada y, a continuación, crea una nueva clave DES con los datos dados. Crea el motor de DES, de CBC y del codificador de PKCS5. Mediante la matriz de bytes de entrada, crea un flujo de salida. Mediante el motor CBCEncryptorEngine, crea el sistema de cifrado. Escribe los datos para cifrar. Por último, cierra el flujo de salida y recoge los bytes.

Nota: Es importante llamar a close() con codificadores de relleno, ya que se garantiza que el último bloque se ha codificado de forma correcta.
// Input.
byte[] input   = { (byte)'H', (byte)'e', (byte)'l', (byte)'l', (byte)'o',
                   (byte)',', (byte)' ', (byte)'w',(byte)'o', (byte)'r',
                   (byte)'l', (byte)'d', byte)'!', (byte)'!' };
// Initialization vector.
byte[] iv      = { (byte)0xFF, (byte)0xFE, (byte)0xFD, (byte)0xFC,(byte)0xFB,
                   (byte)0xFA, (byte)0xF9, (byte)0xF8 };
// Key data.
byte[] keyData = { (byte)0x01, (byte)0x23, (byte)0x45, (byte)0x67,(byte)0x89,
                   (byte)0x01, (byte)0x23, (byte)0x45 };
// Create a new DES key with the given data.
DESKey key = new DESKey( keyData );
// Create the DES engine.
DESEncryptorEngine desEngine = new DESEncryptorEngine( key );
// Create the CBC engine.
CBCEncryptorEngine cbcEngine = new CBCEncryptorEngine( desEngine,
                               new InitializationVector( iv ) );
// Create the PKCS5 Encoder engine.
PKCS5FormatterEngine formatter = new PKCS5FormatterEngine( cbcEngine );
// Create a stream from the input byte array.
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
// Create the Encryptor using the CBCEncryptorEngine.
BlockEncryptor encryptor = new BlockEncryptor( formatter, outputStream );
// Write the data to encrypt.
encryptor.write( input, 0, input.length );
// Close the output stream and obtain the bytes.
encryptor.close();
byte[] output = outputStream.toByteArray();
System.out.println( "Ciphertext = " + new String( output ) + "." );

Ejemplo de código: usar un desformateador

Para utilizar un desformateador, amplíe los métodos para cifrar y descifrar datos.

El siguiente ejemplo de código muestra el desformateador. Especifica la salida del ejemplo anterior y la entrada. Crea una nueva clave DES con los datos dados. Crea el motor de DES, de CBC y del decodificador de PKCS5. Crea un flujo a partir de la matriz de bytes de entrada. Mediante el motor CBCDecryptorEngine, crea el sistema de cifrado. Lee los datos descifrados y, a continuación, cierra el sistema de cifrado y el flujo de entrada.

// Output from previous example.
byte[] output = { (byte)0x58, (byte)0x95, (byte)0xBC, (byte)0xF4, (byte)0x3F,
                  (byte)0xD8, (byte)0xD8, (byte)0xAD, (byte)0x80, (byte)0x9A,
                  (byte)0x95, (byte)0x34, (byte)0xB4, (byte)0xCC, (byte)0x76,
                  (byte)0x79 };
// Input.
byte[] input = new byte[14];
byte[] iv = { (byte)0xFF, (byte)0xFE, (byte)0xFD, (byte)0xFC, (byte)0xFB,
              (byte)0xFA, (byte)0xF9, (byte)0xF8 };
byte[] keyData = { (byte)0x01, (byte)0x23, (byte)0x45, (byte)0x67,
                   (byte)0x89, (byte)0x01, (byte)0x23, (byte)0x45 };
// Create a new DES key with the given data.
DESKey key = new DESKey( keyData );
// Create the DES engine.
DESDecryptorEngine desEngine = new DESDecryptorEngine( key );
// Create the CBC engine.
CBCDecryptorEngine cbcEngine = new CBCDecryptorEngine( desEngine,
                               new InitializationVector( iv ) );
// Create the PKCS5 Decoder engine.
PKCS5UnformatterEngine unformatter = new PKCS5UnformatterEngine( cbcEngine );
// Create a stream from the input byte array.
ByteArrayInputStream inputStream = new ByteArrayInputStream( output );
// Create the Decryptor using the CBCDecryptorEngine.
BlockDecryptor decryptor = new BlockDecryptor( unformatter, inputStream );
// Read in the decrypted data.
decryptor.read( input, 0, input.length );
// Close the decryptor and the input stream.
decryptor.close();
inputStream.close();
System.out.println("Ciphertext = " + new String( output ) + ".");
System.out.println("Plaintext = " + new String( input ) + ".");
Tema siguiente: Cifras de flujo
Tema anterior: Cifras de bloque

¿Le ha resultado útil esta información? Envíenos sus comentarios.