Guía de desarrollo

Local Navigation

Convertir una cifra de bloque en una cifra de flujo

El modo CFB se utiliza con frecuencia para convertir una cifra de bloque en una de flujo. El modo OFB puede utilizarse también para convertir una cifra de bloque en una de flujo.

La clase CFBEncryptor (o cualquier clase que amplíe la clase StreamEncryptor) acepta los datos que utilizan llamadas para write(), los cifra y, a continuación, los escribe en el flujo de salida que pasa al constructor. Los datos cifrados pueden pasarse a cualquier flujo de salida.

Ejemplo de código

El siguiente ejemplo de código muestra cómo cifrar y descifrar datos mediante el modo CFB. Utiliza DES, un algoritmo de clave simétrico habitual.

El primer ejemplo de código establece la entrada como bytes aleatorios. Configura DESKey, el motor de cifrado, el vector de inicialización, el flujo de salida y el sistema de cifrado. Escribe los datos que se van a cifrar y, a continuación, cierra el flujo del sistema de cifrado. A continuación, obtiene los datos del flujo de datos e imprime la entrada y la salida.

// Set up the input as random bytes.
byte[] input = new byte[128];
RandomSource.getBytes( input );
// Set up the DESKEy.
DESKey key = new DESKey();
// Set up the encyptor engine.
DESEncryptorEngine engine1 = new DESEncryptorEngine( key );
// Set up the initialization vector.
byte[] iv1 = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
// Set up the output stream.
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
// Set up the encryptor.
CFBEncryptor encryptor = new CFBEncryptor( engine1,
new InitializationVector( iv1 ), outStream, true );
// Write out the data to be encrypted.
encryptor.write( input, 0, input.length );
// Close the encryptor stream.
encryptor.close();
// Get the data from the underlying data stream.
byte[] output = outStream.toByteArray();
outStream.close();
// Print out the input and the output.
System.out.println("Plaintext = " + new String( input ) + ".");
System.out.println("Ciphertext = " + new String( output ) + ".");

Para descifrar los datos que han sido cifrados mediante CFB, se sigue un proceso similar. El ejemplo siguiente utiliza la misma entrada y salida de matriz de bytes, y la misma clave que el ejemplo anterior. Este ejemplo configura el motor del sistema de cifrado, el vector de inicialización, el flujo de salida y el sistema de descifrado. Lee los datos que se van a descifrar. Cierra el flujo del sistema de descifrado e imprime la entrada y la salida.

// Set up the DESEngine.
DESEncryptorEngine engine2 = new DESEncryptorEngine( key );
// Set up the initialization vector.
byte[] iv2 = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
// Set up the output stream.
ByteArrayInputStream inStream = new ByteArrayInputStream( output );
// Set up the decryptor.
CFBDecryptor decryptor = new CFBDecryptor( engine2,
new InitializationVector( iv2 ), inStream, true );
// Read in the data to be decrypted.
decryptor.read( input, 0, input.length );
// Close the encryptor stream.
decryptor.close();
inStream.close();
// Print out the input and the output.
System.out.println("Plaintext = " + new String( input ) + ".");
Tema anterior: Cifras de flujo

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