Guía de desarrollo

Local Navigation

Cifrado y descifrado de datos mediante el uso de factorías

En la mayoría de los casos, los procesos de cifrado y descifrado de datos se llevan a cabo mediante el uso de factorías. Las dos clases de factorías son EncryptorFactory y DecryptorFactory.

Ejemplo de código: cifrar datos mediante una factoría

Las primeras dos entradas de la clase EncryptorFactory constituyen el flujo de salida utilizado para recabar el texto cifrado y la clave, que se utilizan para llevar a cabo el proceso de cifrado de los datos. La clave, en este caso una clave DES, se crea tal y como se muestra en el siguiente ejemplo de código.

DESKey key = new DESKey();
Nota: Los detalles acerca de la generación y distribución de las claves no se especifican en este ejemplo. En este ejemplo, se utiliza la misma instancia de la clave para cifrar y descifrar el mensaje. En una situación real, en primer lugar se debe llegar a un acuerdo respecto al protocolo y, a continuación, se crearían y distribuirían las claves.

En el siguiente ejemplo de código, se invoca EncryptorFactory.getEncryptorOutputStream() y el flujo de salida resultante se almacena en la variable encryptor. La variable encryptor se crea en una cláusula try con el fin de capturar y mostrar cualquier excepción que se pudiera producir.

try {
   //Create the EncryptorFactory.
   EncryptorOutputStream encryptor =
                   EncryptorFactory.getEncryptorOutputStream( key.getData(),
                   stream, encryptionType, IV );
   encryptor.write( message.getBytes() );
   encryptor.close();
   cipherText = stream.toByteArray();
   //Output the messages to the console.
   System.out.println("Original Message: " + message);
   System.out.println("Ciphertext: " + cipherText);
}

Ejemplo de código: descifrar datos mediante una factoría

El proceso de descifrado es similar al de cifrado.

En el siguiente ejemplo de código, el flujo de entrada se crea con el fin de excluir el texto cifrado del proceso de cifrado. Tal y como ocurre con la clave, el emisor envía previamente el texto cifrado al receptor. Se llama al método getDecryptorInputStream de la clase DecryptorFactory. El objeto resultante se crea y almacena en una variable de tipo DecryptorInputStream denominada sistema de descifrado.

Como es posible que los datos contengan relleno extra, se utiliza un bucle for para extraer los datos del flujo de salida. El siguiente ejemplo utiliza un bucle que lee del flujo de entrada y sale al leer el primer bloque de datos vacío. La rutina de descifrado se produce en un bloque try.

Se lleva a cabo una comparación de matrices con el fin de determinar que el proceso de descifrado se ha llevado a cabo de forma correcta y se muestra un mensaje en la consola. Si se produce un error durante el proceso de descifrado, los mensajes de error de excepción aparecerán en la consola.

ByteArrayInputStream input = new ByteArrayInputStream( stream.toByteArray() )
DecryptorInputStream decryptor = DecryptorFactory.getDecryptorInputStream(symmetricKey,input);
      byte[] decrypted = new byte[0];
      byte[] temp = new byte[10];
           for( ;; ) {
             int read = decryptor.read( temp, 0, 10 );
                if( read < 0 ) {
                   // We are at the end of the stream.
                   break;
                  }
                  // Copy.
                  net.rim.vm.Array.resize( decrypted, read + decrypted.length );
                  System.arraycopy( temp, 0, decrypted, decrypted.length - read, read );
                  }
         if( Arrays.equals( message.getBytes(), decrypted ) ) {
               System.out.println("Encryption/Decryption Passed.");
          } else {
              System.out.println("Encryption/Decryption Failed.");
          }
        }
Tema siguiente: Algoritmos de bloque

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