Dentro de estos algoritmos distinguimos dos tipos de algoritmos en función de la cantidad de datos de entrada que manejan a la vez: algoritmos de cifrado por bloques y algoritmos de cifrado de flujo.
Los algoritmos de cifrado por bloques toman bloques de tamaño fijo del texto en claro y producen un bloque de tamaño fijo de texto cifrado, generalmente del mismo tamaño que la entrada. El tamaño del bloque debe ser lo suficientemente grande como para evitar ataques de texto cifrado. La asignación de bloques de entrada a bloques de salida debe ser uno a uno para hacer el proceso reversible y parecer aleatoria.
Para la asignación de bloques los algoritmos de cifrado simétrico realizan sustituciones y permutaciones en el texto en claro hasta obtener el texto cifrado.
La sustitución es el reemplazo de un valor de entrada por otro de los posibles valores de salida, en general, si usamos un tamaño de bloque k, el bloque de entrada puede ser sustituido por cualquiera de los 2k bloques posibles.
La permutación es un tipo especial de sustitución en el que los bits de un bloque de entrada son reordenados para producir el bloque cifrado, de este modo se preservan las estadísticas del bloque de entrada (el número de unos y ceros).
Los algoritmos de cifrado por bloques iterativos funcionan aplicando en sucesivas rotaciones una transformación (función de rotación) a un bloque de texto en claro. La misma función es aplicada a los datos usando una subclave obtenida de la clave secreta proporcionada por el usuario. El número de rotaciones en un algoritmo de cifrado por bloques iterativo depende del nivel de seguridad deseado.
Un tipo especial de algoritmos de cifrado por bloques iterativos son los denominados algoritmos de cifrado de Feistel. En estos algoritmos el texto cifrado se obtiene del texto en claro aplicando repetidamente la misma transformación o función de rotación. El funcionamiento es como sigue: el texto a encriptar se divide en dos mitades, la función de rotación se aplica a una mitad usando una subclave y la salida de la función se emplea para hacer una o-exclusiva con la otra mitad, entonces se intercambian las mitades y se repite la misma operación hasta la última rotación, en la que no hay intercambio. Una característica interesante de estos algoritmos es que la encriptación y desencriptación son idénticas estructuralmente, aunque las subclaves empleadas en la encriptación se toman en orden inverso en la desencriptación.
Para aplicar un algoritmo por bloques es necesario descomponer el texto de entrada en bloques de tamaño fijo. Esto se puede hacer de varias maneras:
Generalmente operan sobre 1 bit (o sobre bytes o palabras de 16 ó 32 bits) de los datos de entrada cada vez. El algoritmo genera una secuencia (secuencia cifrante o keystream en inglés) de bits que se emplea como clave. La encriptación se realiza combinando la secuencia cifrante con el texto en claro.
El paradigma de este tipo de algoritmos es el One Time Pad, que funciona aplicando una XOR (o-exclusiva) a cada bit de la entrada junto con otro generado aleatoriamente para obtener cada bit de la salida. La secuencia de bits aleatorios es la clave de la sesión, secuencia de cifrado o el pad, que es del mismo tamaño que la entrada y la salida. Para recuperar el texto original el texto cifrado debe pasar por el mismo proceso empleado para encriptar usando el mismo pad. Este algoritmo es conocido por ser el único incondicionalmente seguro, aunque, como las claves son del mismo tamaño que la entrada, es de poca utilidad práctica.
Los algoritmos de este tipo son intentos de conseguir algoritmos prácticos que se aproximen al funcionamiento del one time pad.