Guía de desarrollo

Local Navigation

Cifras de flujo

Una cifra de flujo, también denominada algoritmo de flujo, combina bits de texto sin formato con un flujo de claves. Un flujo de claves es un flujo de bits de algoritmo pseudoaleatorio. Los dígitos de texto sin formato se cifran de uno en uno.

La parte de la cifra de flujo de la RIM Cryptographic API se basa en la interfaz común de flujo de Java, y utiliza funciones de lectura y escritura similares para interactuar con el flujo. Una vez que se establece una cifra de flujo, no es necesario escribir código para su función: toda la actividad la realiza de forma automática la clase del flujo subyacente.

Una fuente pseudoaleatoria es un generador de flujo de bits que se inicializa con un valor de inicialización. Suministra un flujo arbitrariamente largo de bits complejos de predecir y no repetidos. La interfaz PseudoRandomSource representa un PRNG. Un PRNG amplía un valor de inicialización de longitud finito en un flujo arbitrariamente largo de bytes pseudoaleatorios. Las clases PseudoRandomSource proporcionan métodos para recuperar bytes del PRNG y restablecer el estado del mismo.

La mayoría de las cifras de flujo crean el texto cifrado aplicando una "o exclusiva" al texto sin formato con un flujo de claves. El flujo de claves se genera a partir de un PRNG.

Para utilizar el algoritmo ARC4, es necesaria una instancia de la clase ARC4PseudoRandomSource. En lugar de utilizar la clase ARC4PseudoRandomSource para cifrar directamente los datos, puede que encuentre más flexible y seguro utilizar la clase PRNGEncryptor, que implementa la clase StreamEncryptor.

Ejemplo de código: cifrado de flujo mediante el algoritmo ARC4

El siguiente ejemplo de código ilustra un proceso de cifrado mediante una cifra de flujo. Especifica la matriz de bytes de entrada. Utiliza la fuente RandomSource para adquirir bytes de entrada. Imprime texto sin formato. Establece la clave ARC4Key con una longitud de 256 bytes. Crea el sistema de cifrado de flujo ARC4PseudoRandomSource. Crea el flujo de salida para almacenar los datos cifrados. Crea el sistema de cifrado de flujo PRNGEncryptor, que utiliza la fuente ARC4PseudoRandomSource y un flujo de salida. Para llevar a cabo el cifrado, llama a write() con el texto sin formato. Por último, imprime el texto cifrado.

// Input byte array.
byte[] plaintext = new byte[128];
// Use the Random source to get input bytes.
RandomSource.getBytes( plaintext );
// Print out the plaintext.
System.out.println("Plaintext = " + new String( plaintext ) + ".");
// Set up the ARC4Key of length 256 bytes.
ARC4Key key = new ARC4Key( 256 );
// Create the ARC4PseudoRandomSource.
ARC4PseudoRandomSource source = new ARC4PseudoRandomSource( key );
// Create the output stream to store the encrypted data.
ByteArrayOutputStream out = new ByteArrayOutputStream();
// Create the PRNGEncryptor stream encryptor, which uses
// the ARC4PseudoRandomSource and an output stream.
PRNGEncryptor encryptStream = new PRNGEncryptor( source, out );
// To encrypt, invoke write with the plaintext.
encryptStream.write( plaintext, 0, plaintext.length );
encryptStream.close();
byte[] ciphertext = out.toByteArray();
// Print out the ciphertext.
System.out.println( "Ciphertext = " + new String(ciphertext) + "." );

El siguiente ejemplo de código muestra cómo descifrar los datos. Vuelve a cargar la clave para descifrar el texto sin formato. Crea un flujo de entrada con el texto cifrado como base. Crea una instancia de un sistema de descifrado PRNGDecryptor para descifrar los datos. Lleva a cabo el cifrado mediante la lectura del flujo y el almacenamiento de los datos descifrados en el texto sin formato. Imprime el texto sin formato.

// Reload the key to get the ciphertext back to plaintext (decrypt).
source = new ARC4PseudoRandomSource( key );
// Create an input stream with ciphertext as the basis.
ByteArrayInputStream in = new ByteArrayInputStream( ciphertext );
// Create an instance of a PRNGDecryptor to decrypt the data.
PRNGDecryptor decryptStream = new PRNGDecryptor( source, in );
// Decrypt by reading from the stream and storing the decrypted data in plaintext.
decryptStream.read( plaintext, 0, ciphertext.length );
decryptStream.close();
// Print out the plaintext.
System.out.println( "Plaintext = " + new String( plaintext ) + "." );

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