0% encontró este documento útil (0 votos)
141 vistas197 páginas

Crack de Contraseñas

El documento describe el algoritmo de cifrado DES (Data Encryption Standard). Explica que DES aplica una permutación inicial al texto claro de 64 bits, luego realiza 16 rondas de cifrado usando llaves clave de 48 bits, y finalmente aplica una permutación inversa para obtener el texto cifrado. También describe ataques a sistemas de cifrado usados en telefonía celular.

Cargado por

Andres Pulido
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
141 vistas197 páginas

Crack de Contraseñas

El documento describe el algoritmo de cifrado DES (Data Encryption Standard). Explica que DES aplica una permutación inicial al texto claro de 64 bits, luego realiza 16 rondas de cifrado usando llaves clave de 48 bits, y finalmente aplica una permutación inversa para obtener el texto cifrado. También describe ataques a sistemas de cifrado usados en telefonía celular.

Cargado por

Andres Pulido
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Lectura complementaria VI

crack de contraseñas

Agustı́n Moreno Cañadas


Contenido

Introducción

Sistema Criptográfico DES

Crack de contraseñas

El ataque TMTO de Hellman


Algunos algoritmos de uso frecuente

Telefonı́a Celular-CMEA
Ataque de texto en claro elegido a SCMEA

Bibliografı́a
Contenido

Introducción

Sistema criptográfico DES

Crack de contraseñas

El ataque TMTO de Hellman


Algunos algoritmos de uso frecuente

Telefonı́a Celular-CMEA
Ataque de texto en claro elegido a SCMEA

Bibliografı́a
Contenido

Introducción

Sistema Criptográfico DES

Crack de contraseñas

El ataque TMTO de Hellman


Algunos algoritmos de uso frecuente

Telefonı́a Celular-CMEA
Ataque de texto en claro elegido a SCMEA

Bibliografı́a
Contenido

Introducción

Sistema Criptográfico DES

Crack de contraseñas

El ataque TMTO de Hellman


Algunos algoritmos de uso frecuente

Telefonı́a Celular-CMEA
Ataque de texto en claro elegido a SCMEA

Bibliografı́a
Contenido

Introducción

Sistema Criptográfico DES

Crack de contraseñas

El ataque TMTO de Hellman


Algunos algoritmos de uso frecuente

Telefonı́a celular-CMEA
Ataque de texto en claro elegido a SCMEA

Bibliografı́a
Contenido

Introducción

Sistema Criptográfico DES

Crack de contraseñas

El ataque TMTO de Hellman


Algunos algoritmos de uso frecuente

Telefonı́a Celular-CMEA
Ataque de texto en claro elegido a SCMEA

Bibliografı́a
Introducción
En esta Lectura retomamos la Lectura fundamental V para mostrar
el contexto del uso de las tablas públicas de ciframiento DES.

Además, a modo de ilustración histórica se describe la forma como se


atacaban los sistema de contraseñas en sistemas operativos que
usaban sistemas criptográficos como el DES. Cabe anotar que tal
estudio no es muy diferente al que a la fecha se realiza para estudiar
sistemas generantes de contraseñas.

Se describen también ataques a los sistemas de ciframiento CMEA


y SCMEA usados para cifrar información en dispositivos móviles.
Forma gráfica del algoritmo DES
Se recuerda que en el caso de DES, una permutación inicial es
aplicada al texto en claro de 64 bits (ver, Stinson, 2006)

IP(x) = L0 R0 ,

Después de 16 vueltas realizadas en el proceso de ciframiento, se


aplica la permutación inversa IP−1 , para obtener el texto cifrado
final. Esto es,

y = IP−1 (R16 L16 ).

En cada vuelta actua una función fKi tal que

fKi : {0, 1}32 × {0, 1}48 → {0, 1}32 ,

f (A, J).
Se recuerda que en el caso de DES, una permutación inicial es
aplicada al texto en claro de 64 bits (ver, Stinson, 2006)

IP(x) = L0 R0 ,

Después de 16 vueltas realizadas en el proceso de ciframiento, se


aplica la permutación inversa IP−1 , para obtener el texto cifrado
final. Esto es,

y = IP−1 (R16 L16 ).

En cada vuelta actua una función fKi tal que

fKi : {0, 1}32 × {0, 1}48 → {0, 1}32 ,

f (A, J).
Se recuerda que en el caso de DES, una permutación inicial es
aplicada al texto en claro de 64 bits (ver, Stinson, 2006)

IP(x) = L0 R0 ,

Después de 16 vueltas realizadas en el proceso de ciframiento, se


aplica la permutación inversa IP−1 , para obtener el texto cifrado
final. Esto es,

y = IP−1 (R16 L16 ).

En cada vuelta actua una función fKi tal que

fKi : {0, 1}32 × {0, 1}48 → {0, 1}32 ,

f (A, J).
Se recuerda que en el caso de DES, una permutación inicial es
aplicada al texto en claro de 64 bits (ver, Stinson, 2006)

IP(x) = L0 R0 ,

Después de 16 vueltas realizadas en el proceso de ciframiento, se


aplica la permutación inversa IP−1 , para obtener el texto cifrado
final. Esto es,

y = IP−1 (R16 L16 ).

En cada vuelta actua una función fKi tal que

fKi : {0, 1}32 × {0, 1}48 → {0, 1}32 ,

f (A, J).
Se recuerda que en el caso de DES, una permutación inicial es
aplicada al texto en claro de 64 bits (ver, Stinson, 2006)

IP(x) = L0 R0 ,

Después de 16 vueltas realizadas en el proceso de ciframiento, se


aplica la permutación inversa IP−1 , para obtener el texto cifrado
final. Esto es,

y = IP−1 (R16 L16 ).

En cada vuelta actua una función fKi tal que

fKi : {0, 1}32 × {0, 1}48 → {0, 1}32 ,

f (A, J).
Se recuerda que en el caso de DES, una permutación inicial es
aplicada al texto en claro de 64 bits (ver, Stinson, 2006)

IP(x) = L0 R0 ,

Después de 16 vueltas realizadas en el proceso de ciframiento, se


aplica la permutación inversa IP−1 , para obtener el texto cifrado
final. Esto es,

y = IP−1 (R16 L16 ).

En cada vuelta actua una función fKi tal que

fKi : {0, 1}32 × {0, 1}48 → {0, 1}32 ,

f (A, J).
Se recuerda que en el caso de DES, una permutación inicial es
aplicada al texto en claro de 64 bits (ver, Stinson, 2006)

IP(x) = L0 R0 ,

Después de 16 vueltas realizadas en el proceso de ciframiento, se


aplica la permutación inversa IP−1 , para obtener el texto cifrado
final. Esto es,

y = IP−1 (R16 L16 ).

En cada vuelta actua una función fKi tal que

fKi : {0, 1}32 × {0, 1}48 → {0, 1}32 ,

f (A, J).
En este caso la función E /P(A), construye una lista de 48 bits a
partir de otra A con 32 bits.

Se calcula E (A) ⊕ J, escribiendo el resultado en bloques Bi cada


uno con 6 bits.

B = B1 B2 . . . B8

En el siguiente paso como en el caso S − DES, se usan 8 cajas,


para obtener una entrada desarrollada en binario de 4 bits, por
cada uno de los bloques Bi . En este caso tenemos que

Si : {0, 1}6 → {0, 1}4 ,

Sj (Bj ) = Cj , debe ser tal que los bits b1 b6 , es el desarrollo en


binario de una fila de la caja correspondiente, mientras que los bits
b2 b3 b4 b5 son el desarrollo en binario de la columna de la caja.

Realizamos por último una permutación de 32 bits a la lista


En este caso la función E /P(A), construye una lista de 48 bits a
partir de otra A con 32 bits.

Se calcula E (A) ⊕ J, escribiendo el resultado en bloques Bi cada


uno con 6 bits.

B = B1 B2 . . . B8

En el siguiente paso como en el caso S − DES, se usan 8 cajas,


para obtener una entrada desarrollada en binario de 4 bits, por
cada uno de los bloques Bi . En este caso tenemos que

Si : {0, 1}6 → {0, 1}4 ,

Sj (Bj ) = Cj , debe ser tal que los bits b1 b6 , es el desarrollo en


binario de una fila de la caja correspondiente, mientras que los bits
b2 b3 b4 b5 son el desarrollo en binario de la columna de la caja.

Realizamos por último una permutación de 32 bits a la lista


En este caso la función E /P(A), construye una lista de 48 bits a
partir de otra A con 32 bits.

Se calcula E (A) ⊕ J, escribiendo el resultado en bloques Bi cada


uno con 6 bits.

B = B1 B2 . . . B8

En el siguiente paso como en el caso S − DES, se usan 8 cajas,


para obtener una entrada desarrollada en binario de 4 bits, por
cada uno de los bloques Bi . En este caso tenemos que

Si : {0, 1}6 → {0, 1}4 ,

Sj (Bj ) = Cj , debe ser tal que los bits b1 b6 , es el desarrollo en


binario de una fila de la caja correspondiente, mientras que los bits
b2 b3 b4 b5 son el desarrollo en binario de la columna de la caja.

Realizamos por último una permutación de 32 bits a la lista


En este caso la función E /P(A), construye una lista de 48 bits a
partir de otra A con 32 bits.

Se calcula E (A) ⊕ J, escribiendo el resultado en bloques Bi cada


uno con 6 bits.

B = B1 B2 . . . B8

En el siguiente paso como en el caso S − DES, se usan 8 cajas,


para obtener una entrada desarrollada en binario de 4 bits, por
cada uno de los bloques Bi . En este caso tenemos que

Si : {0, 1}6 → {0, 1}4 ,

Sj (Bj ) = Cj , debe ser tal que los bits b1 b6 , es el desarrollo en


binario de una fila de la caja correspondiente, mientras que los bits
b2 b3 b4 b5 son el desarrollo en binario de la columna de la caja.

Realizamos por último una permutación de 32 bits a la lista


En este caso la función E /P(A), construye una lista de 48 bits a
partir de otra A con 32 bits.

Se calcula E (A) ⊕ J, escribiendo el resultado en bloques Bi cada


uno con 6 bits.

B = B1 B2 . . . B8

En el siguiente paso como en el caso S − DES, se usan 8 cajas,


para obtener una entrada desarrollada en binario de 4 bits, por
cada uno de los bloques Bi . En este caso tenemos que

Si : {0, 1}6 → {0, 1}4 ,

Sj (Bj ) = Cj , debe ser tal que los bits b1 b6 , es el desarrollo en


binario de una fila de la caja correspondiente, mientras que los bits
b2 b3 b4 b5 son el desarrollo en binario de la columna de la caja.

Realizamos por último una permutación de 32 bits a la lista


En este caso la función E /P(A), construye una lista de 48 bits a
partir de otra A con 32 bits.

Se calcula E (A) ⊕ J, escribiendo el resultado en bloques Bi cada


uno con 6 bits.

B = B1 B2 . . . B8

En el siguiente paso como en el caso S − DES, se usan 8 cajas,


para obtener una entrada desarrollada en binario de 4 bits, por
cada uno de los bloques Bi . En este caso tenemos que

Si : {0, 1}6 → {0, 1}4 ,

Sj (Bj ) = Cj , debe ser tal que los bits b1 b6 , es el desarrollo en


binario de una fila de la caja correspondiente, mientras que los bits
b2 b3 b4 b5 son el desarrollo en binario de la columna de la caja.

Realizamos por último una permutación de 32 bits a la lista


En este caso la función E /P(A), construye una lista de 48 bits a
partir de otra A con 32 bits.

Se calcula E (A) ⊕ J, escribiendo el resultado en bloques Bi cada


uno con 6 bits.

B = B1 B2 . . . B8

En el siguiente paso como en el caso S − DES, se usan 8 cajas,


para obtener una entrada desarrollada en binario de 4 bits, por
cada uno de los bloques Bi . En este caso tenemos que

Si : {0, 1}6 → {0, 1}4 ,

Sj (Bj ) = Cj , debe ser tal que los bits b1 b6 , es el desarrollo en


binario de una fila de la caja correspondiente, mientras que los bits
b2 b3 b4 b5 son el desarrollo en binario de la columna de la caja.

Realizamos por último una permutación de 32 bits a la lista


En este caso la función E /P(A), construye una lista de 48 bits a
partir de otra A con 32 bits.

Se calcula E (A) ⊕ J, escribiendo el resultado en bloques Bi cada


uno con 6 bits.

B = B1 B2 . . . B8

En el siguiente paso como en el caso S − DES, se usan 8 cajas,


para obtener una entrada desarrollada en binario de 4 bits, por
cada uno de los bloques Bi . En este caso tenemos que

Si : {0, 1}6 → {0, 1}4 ,

Sj (Bj ) = Cj , debe ser tal que los bits b1 b6 , es el desarrollo en


binario de una fila de la caja correspondiente, mientras que los bits
b2 b3 b4 b5 son el desarrollo en binario de la columna de la caja.

Realizamos por último una permutación de 32 bits a la lista


Cj = C1 C2 C3 C4 C5 C6 C7 C8 , lo cual es la salida de la función fKi en
el correspondiente estado.

A continuación se describe gráficamente el funcionamiento de este


algoritmo.
DES 1
DES 2
DES 3
DES 4
DES 5
DES 6
DES 7
DES 8
LAS CAJAS-DES
Crack de contraseñas

Cualquier atacante dispone de dos opciones cuando intenta


adivinar una contraseña. Puede obtener una copia del hash de la
contraseña y a partir de ese momento utilizar las herramientas de
fuerza bruta para romper el hash cifrado (ver, Jones y otros, 2003).

También puede intentar adivinar directamente la contraseña. El


crack de contraseñas es una vieja técnica que tiene cierto exito
debido a que los humanos no son muy buenos generando
secuencias aleatorias de caracteres.

Resulta importante entender como y donde se almacenan la mayor


parte de las contraseñas para saber que están haciendo estas
herramientas y los métodos que fundamentan su uso.
Crack de contraseñas

Cualquier atacante dispone de dos opciones cuando intenta


adivinar una contraseña. Puede obtener una copia del hash de la
contraseña a partir de ese momento utilizar las herramientas de
fuerza bruta para romper el hash cifrado (ver, Jones y otros, 2003).

También puede intentar adivinar directamente la contraseña. El


crack de contraseñas es una vieja técnica que tiene cierto éxito
debido a que los humanos no son muy buenos generando secuencias
aleatorias de caracteres.

Resulta importante entender como y donde se almacenan la mayor


parte de las contraseñas para saber que están haciendo estas
herramientas y los métodos que fundamentan su uso.
Crack de contraseñas

Cualquier atacante dispone de dos opciones cuando intenta


adivinar una contraseña. Puede obtener una copia del hash de la
contraseña a partir de ese momento utilizar las herramientas de
fuerza bruta para romper el hash cifrado (ver, Jones y otros, 2003).

También puede intentar adivinar directamente la contraseña. El


crack de contraseñas es una vieja técnica que tiene cierto exito
debido a que los humanos no son muy buenos generando
secuencias aleatorias de caracteres.

Resulta importante entender cómo y dónde se almacenan la mayor


parte de las contraseñas para saber qué están haciendo estas
herramientas y los métodos que fundamentan su uso.
Haremos nuestra descripción con los sistemas Unix y Windows
clásicos. Tales descripciones no varían mucho con respecto a los
sistemas que actualmente se utilizan.

En estos sistemas las contraseñas se almacenan como hashes


unidireccionales y estas contarseñas por lo general no pueden ser
descifradas.
Haremos nuestra descripción con los sistemas Unix y Windows
clásicos; tales descripciones no varían mucho con respecto a los
sistemas que actualmente se utilizan.

En estos sistemas las contraseñas se almacenan como hashes


unidireccionales y estas contarseñas por lo general no pueden ser
descifradas.
Una familia hash es una cúadrupla (X , Y, K, H) que satisface las
siguientes condiciones:
1 X es un conjunto de posibles mensajes,

2 Y es un conjunto finito de mensajes comprimidos o paquetes


de autenticación,

3 K es el espacio de posibles claves,

4 Para cada K ∈ K existe una función hash hK ∈ H. Cada


hK : X → Y.
Una familia hash es una cuadrupla (X , Y, K, H) que satisface las
siguientes condiciones :
1 X es un conjunto de posibles mensajes,

2 Y es un conjunto finito de mensajes comprimidos o paquetes


de autenticación,

3 K es el espacio de posibles claves,

4 Para cada K ∈ K existe una función hash hK ∈ H. Cada


hK : X → Y.
Una familia hash es una cuadrupla (X , Y, K, H) que satisface las
siguientes condiciones :
1 X es un conjunto de posibles mensajes,

2 Y es un conjunto finito de mensajes comprimidos o paquetes


de autenticación,

3 K es el espacio de posibles claves,

4 Para cada K ∈ K existe una función hash hK ∈ H. Cada


hK : X → Y.
Una familia hash es una cuadrupla (X , Y, K, H) que satisface las
siguientes condiciones :
1 X es un conjunto de posibles mensajes,

2 Y es un conjunto finito de mensajes comprimidos o paquetes


de autenticación,

3 K es el espacio de posibles claves,

4 Para cada K ∈ K existe una función hash hK ∈ H. Cada


hK : X → Y.
Una familia hash es una cuadrupla (X , Y, K, H) que satisface las
siguientes condiciones :
1 X es un conjunto de posibles mensajes,

2 Y es un conjunto finito de mensajes comprimidos o paquetes


de autenticación,

3 K es el espacio de posibles claves,

4 Para cada K ∈ K existe una función hash hK ∈ H. Cada


hK : X → Y.
Una familia hash es una cuadrupla (X , Y, K, H) que satisface las
siguientes condiciones :
1 X es un conjunto de posibles mensajes,

2 Y es un conjunto finito de mensajes comprimidos o paquetes


de autenticación,

3 K es el espacio de posibles claves,

4 Para cada K ∈ K existe una función hash hK ∈ H. Cada


hK : X → Y.
Una familia hash es una cuadrupla (X , Y, K, H) que satisface las
siguientes condiciones :
1 X es un conjunto de posibles mensajes,

2 Y es un conjunto finito de mensajes comprimidos o paquetes


de autenticación,

3 K es el espacio de posibles claves,

4 Para cada K ∈ K existe una función hash hK ∈ H. Cada


hK : X → Y.
Un par (x, y ) ∈ X × Y es una pareja válida con la clave K si
hK (x) = y .

Una función hash desasegurada es una función h : X → Y, para la


que X = Y.
Un par (x, y ) ∈ X × Y es una pareja válida con la clave K si
hK (x) = y .

Una función hash desasegurada es una función h : X → Y, para la


que X = Y.
Problemas de seguridad en funciones hash
Los siguientes son los tres tipos de problemas que una función
hash debe ser capaz de resolver:

Preimagen

Entrada Una función hash h : X → Y y un elemento y ∈ Y,

Encontrar x ∈ X , tal que h(x) = y .


Problemas de seguridad en funciones hash
Los siguientes son los tres tipos de problemas que una función
hash debe ser capaz de resolver :

Preimagen

Entrada Una función hash h : X → Y y un elemento y ∈ Y,

Encontrar x ∈ X , tal que h(x) = y .


Problemas de seguridad en funciones hash
Los siguientes son los tres tipos de problemas que una función
hash debe ser capaz de resolver :

Preimagen

Entrada Una función hash h : X → Y y un elemento y ∈ Y,

Encontrar x ∈ X , tal que h(x) = y .


Problemas de seguridad en funciones hash
Los siguientes son los tres tipos de problemas que una función
hash debe ser capaz de resolver :

Preimagen

Entrada Una función hash h : X → Y y un elemento y ∈ Y,

Encontrar x ∈ X , tal que h(x) = y .


Problemas de seguridad en funciones hash
Los siguientes son los tres tipos de problemas que una función
hash debe ser capaz de resolver :

Preimagen

Entrada Una función hash h : X → Y y un elemento y ∈ Y,

Encontrar x ∈ X , tal que h(x) = y .


Problemas de seguridad en funciones hash
Los siguientes son los tres tipos de problemas que una función
hash debe ser capaz de resolver :

Preimagen

Entrada Una función hash h : X → Y y un elemento y ∈ Y,

Encontrar x ∈ X , tal que h(x) = y .


Segunda preimagen

Entrada Una función hash h : X → Y y un elemento x ∈ X .

Encontrar x 0 ∈ X tal que x 0 6= x y h(x 0 ) = h(x).

Colisión

Entrada Una función hash h : X → Y.

Encontrar x, x 0 tales que x 6= x 0 y h(x 0 ) = h(x).


Segunda preimagen

Entrada Una función hash h : X → Y y un elemento x ∈ X .

Encontrar x 0 ∈ X tal que x 0 6= x y h(x 0 ) = h(x).

Colisión

Entrada Una función hash h : X → Y.

Encontrar x, x 0 tales que x 6= x 0 y h(x 0 ) = h(x).


Segunda preimagen

Entrada Una función hash h : X → Y y un elemento x ∈ X .

Encontrar x 0 ∈ X tal que x 0 6= x y h(x 0 ) = h(x).

Colisión

Entrada Una función hash h : X → Y.

Encontrar x, x 0 tales que x 6= x 0 y h(x 0 ) = h(x).


Segunda preimagen

Entrada Una función hash h : X → Y y un elemento x ∈ X .

Encontrar x 0 ∈ X tal que x 0 6= x y h(x 0 ) = h(x).

Colisión

Entrada Una función hash h : X → Y.

Encontrar x, x 0 tales que x 6= x 0 y h(x 0 ) = h(x).


Segunda preimagen

Entrada Una función hash h : X → Y y un elemento x ∈ X .

Encontrar x 0 ∈ X tal que x 0 6= x y h(x 0 ) = h(x).

Colisión

Entrada Una función hash h : X → Y.

Encontrar x, x 0 tales que x 6= x 0 y h(x 0 ) = h(x).


Además el inicio de sesión de cualquier usuario sigue un proceso
relativamente sencillo.

Por ejemplo la contraseña de Patricia que es abc123 se almacena


en un sistema Unix clásico utilizando el hash kUge2g 0BqUb7k.

Imagine que Patricia comete un error al intentar iniciar una sesión


en el sistema y escribe como contraseña abc124. El sistema Unix
llama a su función crypt() y la ejecuta sobre la contraseña abc124
para generar un hash temporal. El hash correspondiente a abc124
no coincide con el hash almacenado de abc123, por lo que el
sistema le dice a Patricia que ha introducido una contraseña
incorrecta.
Además el inicio de sesión de cualquier usuario sigue un proceso
relativamente sencillo.

Por ejemplo la contraseña de Patricia que es abc123 se almacena


en un sistema Unix clásico utilizando el hash kUge2g 0BqUb7k.

Imagine que Patricia comete un error al intentar iniciar una sesión


en el sistema y escribe como contraseña abc124. El sistema Unix
llama a su función crypt() y la ejecuta sobre la contraseña abc124
para generar un hash temporal. El hash correspondiente a abc124
no coincide con el hash almacenado de abc123, por lo que el
sistema le dice a Patricia que ha introducido una contraseña
incorrecta.
Además el inicio de sesión de cualquier usuario sigue un proceso
relativamente sencillo.

Por ejemplo la contraseña de Patricia que es abc123 se almacena


en un sistema Unix clásico utilizando el hash kUge2g 0BqUb7k.

Imagine que Patricia comete un error al intentar iniciar una sesión


en el sistema y escribe como contraseña abc124. El sistema Unix
llama a su función crypt() y la ejecuta sobre la contraseña abc124
para generar un hash temporal. El hash correspondiente a abc124 no
coincide con el hash almacenado de abc123, por lo que el sistema le
dice a Patricia que ha introducido una contraseña incorrecta.
Capturar el hash almacenado de una palabra conocida y
compararlo con el hash obtenido a partir de la auténtica
contraseña, es la base para los ataques de crack de
contraseñas.
Ciertos sistemas operativos, (recordar por ejemplo los basados en
Windows NT 4.0) disponen de un método para forzar el empleo de
contraseñas cuasi-complejas entre sus usuarios.

Por ejemplo la herramienta PassFilt.dll, que apareció en el Service


Pack 2, permite a los administradores establecer algunas reglas
rudimentarias para definir las contraseñas de los usuarios.

Obligar al cumplimiento de ciertas reglas de construcción de


contraseñas suele ser una buena medida de seguridad.

No basta con aplicar los últimos parches de seguridad e imponer la


configuración mas estricta del servidor; una contraseña poco
afortunada puede conducir a la derrota del sistema con la misma
rapidez que lo harı́a un desbordamiento de búfer.
Ciertos sistemas operativos, (recordar por ejemplo los basados en
Windows NT 4.0) disponen de un metódo para forzar el empleo de
contraseñas cuasi-complejas entre sus usuarios.

Por ejemplo la herramienta PassFilt.dll, que apareció en el Service


Pack 2, permite a los administradores establecer algunas reglas
rudimentarias para definir las contraseñas de los usuarios.

Obligar al cumplimiento de ciertas reglas de construcción de


contraseñas suele ser una buena medida de seguridad.

No basta con aplicar los últimos parches de seguridad e imponer la


configuración mas estricta del servidor; una contraseña poco
afortunada puede conducir a la derrota del sistema con la misma
rapidez que lo harı́a un desbordamiento de búfer.
Ciertos sistemas operativos, (recordar por ejemplo los basados en
Windows NT 4.0) disponen de un metódo para forzar el empleo de
contraseñas cuasi-complejas entre sus usuarios.

Por ejemplo la herramienta PassFilt.dll, que apareció en el Service


Pack 2, permite a los administradores establecer algunas reglas
rudimentarias para definir las contraseñas de los usuarios.

Obligar al cumplimiento de ciertas reglas de construcción de


contraseñas suele ser una buena medida de seguridad.

No basta con aplicar los últimos parches de seguridad e imponer la


configuración mas estricta del servidor; una contraseña poco
afortunada puede conducir a la derrota del sistema con la misma
rapidez que lo harı́a un desbordamiento de búfer.
Ciertos sistemas operativos, (recordar por ejemplo los basados en
Windows NT 4.0) disponen de un metódo para forzar el empleo de
contraseñas cuasi-complejas entre sus usuarios.

Por ejemplo la herramienta PassFilt.dll, que apareció en el Service


Pack 2, permite a los administradores establecer algunas reglas
rudimentarias para definir las contraseñas de los usuarios.

Obligar al cumplimiento de ciertas reglas de construcción de


contraseñas suele ser una buena medida de seguridad.

No basta con aplicar los últimos parches de seguridad e imponer la


configuración más estricta del servidor; una contraseña poco
afortunada puede conducir a la derrota del sistema con la misma
rapidez que lo harı́a un desbordamiento de búfer.
PassFilt.dll puede encontrarse presente en un sistema NT, pero
requiere la realización de ciertas modificaciones en el registro antes
que pueda funcionar:
1 Verifique que PassFilt.dll se encuentra en el directorio
C : \WINNT\System32 (o en cualquier otro sitio en el que
resida (SYSTEMROOT)).
2 Utilice el editor del registro (en este caso regedt32.exe
funciona mejor que regedit.exe), para abrir la ubicación
HKEY LOCAL MACHINE\System\CurrentControlSet
\Control\Lsa.
3 En el panel derecho, haga clic en la clave Notification
Packages para resaltarlo.
4 Seleccione edición | cadena múltiple.
PassFilt.dll puede encontrarse presente en un sistema NT, pero
requiere la realización de ciertas modificaciones en el registro antes
que pueda funcionar :
1 Verifique que PassFilt.dll se encuentra en el directorio
C : \WINNT\System32 (o en cualquier otro sitio en el que
resida (SYSTEMROOT)).
2 Utilice el editor del registro (en este caso regedt32.exe
funciona mejor que regedit.exe), para abrir la ubicación
HKEY LOCAL MACHINE\System\CurrentControlSet
\Control\Lsa.
3 En el panel derecho, haga clic en la clave Notification
Packages para resaltarlo.
4 Seleccione edición | cadena múltiple.
PassFilt.dll puede encontrarse presente en un sistema NT, pero
requiere la realización de ciertas modificaciones en el registro antes
que pueda funcionar :
1 Verifique que PassFilt.dll se encuentra en el directorio
C : \WINNT\System32 (o en cualquier otro sitio en el que
resida (SYSTEMROOT)).
2 Utilice el editor del registro (en este caso regedt32.exe
funciona mejor que regedit.exe), para abrir la ubicación
HKEY LOCAL MACHINE\System\CurrentControlSet
\Control\Lsa.
3 En el panel derecho, haga clic en la clave Notification
Packages para resaltarlo.
4 Seleccione edición | cadena múltiple.
PassFilt.dll puede encontrarse presente en un sistema NT, pero
requiere la realización de ciertas modificaciones en el registro antes
que pueda funcionar :
1 Verifique que PassFilt.dll se encuentra en el directorio
C : \WINNT\System32 (o en cualquier otro sitio en el que
resida (SYSTEMROOT)).
2 Utilice el editor del registro (en este caso regedt32.exe
funciona mejor que regedit.exe), para abrir la ubicación
HKEY LOCAL MACHINE\System\CurrentControlSet
\Control\Lsa.
3 En el panel derecho, haga clic en la clave Notification
Packages para resaltarlo.
4 Seleccione edición | cadena múltiple.
PassFilt.dll puede encontrarse presente en un sistema NT, pero
requiere la realización de ciertas modificaciones en el registro antes
que pueda funcionar :
1 Verifique que PassFilt.dll se encuentra en el directorio
C : \WINNT\System32 (o en cualquier otro sitio en el que
resida (SYSTEMROOT)).
2 Utilice el editor del registro (en este caso regedt32.exe
funciona mejor que regedit.exe), para abrir la ubicación
HKEY LOCAL MACHINE\System\CurrentControlSet
\Control\Lsa.
3 En el panel derecho, haga clic en la clave Notification
Packages para resaltarlo.
4 Seleccione edición | cadena múltiple.
PassFilt.dll puede encontrarse presente en un sistema NT, pero
requiere la realización de ciertas modificaciones en el registro antes
que pueda funcionar :
1 Verifique que PassFilt.dll se encuentra en el directorio
C : \WINNT\System32 (o en cualquier otro sitio en el que
resida (SYSTEMROOT)).
2 Utilice el editor del registro (en este caso regedt32.exe
funciona mejor que regedit.exe), para abrir la ubicación
HKEY LOCAL MACHINE\System\CurrentControlSet
\Control\Lsa.
3 En el panel derecho, haga clic en la clave Notification
Packages para resaltarlo.
4 Seleccione edición | cadena múltiple.
PassFilt.dll puede encontrarse presente en un sistema NT, pero
requiere la realización de ciertas modificaciones en el registro antes
que pueda funcionar :
1 Verifique que PassFilt.dll se encuentra en el directorio
C : \WINNT\System32 (o en cualquier otro sitio en el que
resida (SYSTEMROOT)).
2 Utilice el editor del registro (en este caso regedt32.exe
funciona mejor que regedit.exe), para abrir la ubicación
HKEY LOCAL MACHINE\System\CurrentControlSet
\Control\Lsa.
3 En el panel derecho, haga clic en la clave Notification
Packages para resaltarlo.
4 Seleccione edición | cadena múltiple.
1 Si ya existe un valor para FPNWCLNT, elimínelo salvo que
se necesite la compatibilidad con Novell.
2 Escriba el valor passfilt
1 Si ya existe un valor para FPNWCLNT, elimínelo salvo que
se necesite la compatibilidad con Novell.
2 Escriba el valor passfilt
Una vez instalada la aplicación (PassFilt.dll), las contraseñas
posteriores que defina cualquier usuario salvo el administrador,
estarán sujetas a determinadas reglas.

Las restricciones que aplique PassFilt.dll son solo un pequeño paso


hacia contraseñas más fuertes.

De esta forma Windows verificará que cada nueva contraseña


cumpla con las siguientes reglas :
Una vez instalada la aplicación (PassFilt.dll), las contraseñas
posteriores que defina cualquier usuario salvo el administrador
estarán sujetas a determinadas reglas.

Las restricciones que aplique PassFilt.dll son solo un pequeño paso


hacia contraseñas más fuertes.

De esta forma Windows verificará que cada nueva contraseña


cumpla con las siguientes reglas :
Una vez instalada la aplicación (PassFilt.dll), las contraseñas
posteriores que defina cualquier usuario salvo el administrador
estarán sujetas a determinadas reglas.

Las restricciones que aplique PassFilt.dll son solo un pequeño paso


hacia contraseñas más fuertes.

De esta forma Windows verificará que cada nueva contraseña


cumpla con las siguientes reglas:
1 No contiene parte del nombre de cuenta del usuario.
2 Tiene un mı́nimo de 8 caracteres.
3 Contiene caracteres de al menos 3 de las siguientes categorı́as

1 Mayúsculas (A a la Z).
2 Minúsculas (a a la z).
3 Dı́gitos numéricos (0 al 9).

4 Caracteres no alfanuméricos (signos de puntuación,


combinaciones de teclas con mayúsculas, etc).
1 No contiene parte del nombre de cuenta del usuario.
2 Tiene un mı́nimo de 8 caracteres.
3 Contiene caracteres de al menos 3 de las siguientes categorı́as

1 Mayúsculas (A a la Z).
2 Minúsculas (a a la z).
3 Dı́gitos numéricos (0 al 9).

4 Caracteres no alfanuméricos (signos de puntuación,


combinaciones de teclas con mayúsculas, etc).
1 No contiene parte del nombre de cuenta del usuario.
2 Tiene un mı́nimo de 8 caracteres.
3 Contiene caracteres de al menos 3 de las siguientes categorı́as

1 Mayúsculas (A a la Z).
2 Minúsculas (a a la z).
3 Dı́gitos numéricos (0 al 9).

4 Caracteres no alfanuméricos (signos de puntuación,


combinaciones de teclas con mayúsculas, etc).
1 No contiene parte del nombre de cuenta del usuario.
2 Tiene un mı́nimo de 8 caracteres.
3 Contiene caracteres de al menos 3 de las siguientes categorı́as

1 Mayúsculas (A a la Z).
2 Minúsculas (a a la z).
3 Dı́gitos numéricos (0 al 9).

4 Caracteres no alfanuméricos (signos de puntuación,


combinaciones de teclas con mayúsculas, etc).
1 No contiene parte del nombre de cuenta del usuario.
2 Tiene un mı́nimo de 8 caracteres.
3 Contiene caracteres de al menos 3 de las siguientes categorı́as

1 Mayúsculas (A a la Z).
2 Minúsculas (a a la z).
3 Dı́gitos numéricos (0 al 9).

4 Caracteres no alfanuméricos (signos de puntuación,


combinaciones de teclas con mayúsculas, etc).
1 No contiene parte del nombre de cuenta del usuario.
2 Tiene un mı́nimo de 8 caracteres.
3 Contiene caracteres de al menos 3 de las siguientes categorı́as

1 Mayúsculas (A a la Z).
2 Minúsculas (a a la z).
3 Dı́gitos numéricos (0 al 9).

4 Caracteres no alfanuméricos (signos de puntuación,


combinaciones de teclas con mayúsculas, etc).
1 No contiene parte del nombre de cuenta del usuario.
2 Tiene un mı́nimo de 8 caracteres.
3 Contiene caracteres de al menos 3 de las siguientes categorı́as

1 Mayúsculas (A a la Z).
2 Minúsculas (a a la z).
3 Dı́gitos numéricos (0 al 9).

4 Caracteres no alfanuméricos (signos de puntuación,


combinaciones de teclas con mayúsculas, etc).
1 No contiene parte del nombre de cuenta del usuario.
2 Tiene un mı́nimo de 8 caracteres.
3 Contiene caracteres de al menos 3 de las siguientes categorı́as

1 Mayúsculas (A a la Z).
2 Minúsculas (a a la z).
3 Dı́gitos numéricos (0 al 9).

4 Caracteres no alfanuméricos (signos de puntuación,


combinaciones de teclas con mayúsculas, etc).
1 No contiene parte del nombre de cuenta del usuario.
2 Tiene un mı́nimo de 8 caracteres.
3 Contiene caracteres de al menos 3 de las siguientes categorı́as

1 Mayúsculas (A a la Z).
2 Minúsculas (a a la z).
3 Dı́gitos numéricos (0 al 9).

4 Caracteres no alfanuméricos (signos de puntuación,


combinaciones de teclas con mayúsculas, etc).
1 No contiene parte del nombre de cuenta del usuario.
2 Tiene un mı́nimo de 8 caracteres.
3 Contiene caracteres de al menos 3 de las siguientes categorı́as

1 Mayúsculas (A a la Z).
2 Minúsculas (a a la z).
3 Dı́gitos numéricos (0 al 9).

4 Caracteres no alfanuméricos (signos de puntuación,


combinaciones de teclas con mayúsculas, etc).
1 No contiene parte del nombre de cuenta del usuario.
2 Tiene un mı́nimo de 8 caracteres.
3 Contiene caracteres de al menos 3 de las siguientes categorı́as

1 Mayúsculas (A a la Z).
2 Minúsculas (a a la z).
3 Dı́gitos numéricos (0 al 9).

4 Caracteres no alfanuméricos (signos de puntuación,


combinaciones de teclas con mayúsculas, etc).
Contraseñas débiles
Las siguientes son ejemplos de contraseñas débiles que satisfacen
las condiciones PassFilt.dll
1 Passw0rd
2 Password!
3 p4ssw0rd!
4 Pa55werd.
Las cuales aparecen frecuentemente en diccionarios de contraseñas,
que suelen poseer la mayorı́a de los crackers. Tales diccionarios, por
lo general contienen permutaciones de palabras comunes que
contienen letras y simbolos.
Contraseñas débiles
Las siguientes son ejemplos de contraseñas débiles que satisfacen
las condiciones PassFilt.dll
1 Passw0rd
2 Password!
3 p4ssw0rd!
4 Pa55werd.
Las cuales aparecen frecuentemente en diccionarios de contraseñas,
que suelen poseer la mayorı́a de los crackers. Tales diccionarios, por
lo general contienen permutaciones de palabras comunes que
contienen letras y simbolos.
Contraseñas débiles
Las siguientes son ejemplos de contraseñas débiles que satisfacen
las condiciones PassFilt.dll
1 Passw0rd
2 Password!
3 p4ssw0rd!
4 Pa55werd.
Las cuales aparecen frecuentemente en diccionarios de contraseñas,
que suelen poseer la mayorı́a de los crackers. Tales diccionarios, por
lo general contienen permutaciones de palabras comunes que
contienen letras y simbolos.
Contraseñas débiles
Las siguientes son ejemplos de contraseñas débiles que satisfacen
las condiciones PassFilt.dll
1 Passw0rd
2 Password!
3 p4ssw0rd!
4 Pa55werd.
Las cuales aparecen frecuentemente en diccionarios de contraseñas,
que suelen poseer la mayorı́a de los crackers. Tales diccionarios, por
lo general contienen permutaciones de palabras comunes que
contienen letras y simbolos.
Contraseñas débiles
Las siguientes son ejemplos de contraseñas débiles que satisfacen
las condiciones PassFilt.dll
1 Passw0rd
2 Password!
3 p4ssw0rd!
4 Pa55werd.
Las cuales aparecen frecuentemente en diccionarios de contraseñas,
que suelen poseer la mayorı́a de los crackers. Tales diccionarios, por
lo general contienen permutaciones de palabras comunes que
contienen letras y simbolos.
Contraseñas débiles
Las siguientes son ejemplos de contraseñas débiles que satisfacen
las condiciones PassFilt.dll
1 Passw0rd
2 Password!
3 p4ssw0rd!
4 Pa55werd.
Las cuales aparecen frecuentemente en diccionarios de contraseñas,
que suelen poseer la mayorı́a de los crackers. Tales diccionarios, por
lo general contienen permutaciones de palabras comunes que
contienen letras y simbolos.
Contraseñas débiles
Las siguientes son ejemplos de contraseñas débiles que satisfacen
las condiciones PassFilt.dll
1 Passw0rd
2 Password!
3 p4ssw0rd!
4 Pa55werd.
las cuales aparecen frecuentemente en diccionarios de contraseñas,
que suelen poseer la mayorı́a de los crackers. Tales diccionarios, por lo
general, contienen permutaciones de palabras comunes que
contienen letras y símbolos.
Sucesores de NT
Si actualmente se desea activar la obligatoriedad de utilizar
contraseñas complejas, acceda a la directiva de seguridad local, en
herramientas administrativas de Panel de control.
Caso Linux
En el caso LINUX se hace necesario instalar una biblioteca cracklib
(o libcrack).

Para llevar a cabo la comprobación de contraseñas tan solo


necesitaremos modificar un archivo de texto que contenga la
configuración PAM (Pluggable Authentication Module), que
controla cualquier interacción del usuario que necesite una
contraseña.

Este será uno de los siguientes archivos

\etc\pam.com
\etc\pam · d\passwd.
Caso Linux
En el caso LINUX se hace necesario instalar una biblioteca cracklib
(o libcrack).

Para llevar a cabo la comprobación de contraseñas tan solo


necesitaremos modificar un archivo de texto que contenga la
configuración PAM (Pluggable Authentication Module), que
controla cualquier interacción del usuario que necesite una
contraseña.

Este será uno de los siguientes archivos

\etc\pam.com
\etc\pam · d\passwd.
Caso Linux
En el caso LINUX se hace necesario instalar una biblioteca cracklib
(o libcrack).

Para llevar a cabo la comprobación de contraseñas tan solo


necesitaremos modificar un archivo de texto que contenga la
configuración PAM (Pluggable Authentication Module), que
controla cualquier interacción del usuario que necesite una
contraseña.

Este será uno de los siguientes archivos

\etc\pam.com
\etc\pam · d\passwd.
Caso Linux
En el caso LINUX se hace necesario instalar una biblioteca cracklib
(o libcrack).

Para llevar a cabo la comprobación de contraseñas tan solo


necesitaremos modificar un archivo de texto que contenga la
configuración PAM (Pluggable Authentication Module), que
controla cualquier interacción del usuario que necesite una
contraseña.

Este será uno de los siguientes archivos

\etc\pam.com
\etc\pam · d\passwd.
Caso Linux
En el caso LINUX se hace necesario instalar una biblioteca cracklib
(o libcrack).

Para llevar a cabo la comprobación de contraseñas tan solo


necesitaremos modificar un archivo de texto que contenga la
configuración PAM (Pluggable Authentication Module), que
controla cualquier interacción del usuario que necesite una
contraseña.

Este será uno de los siguientes archivos

\etc\pam.com
\etc\pam · d\passwd.
Caso Linux
En el caso LINUX se hace necesario instalar una biblioteca cracklib
(o libcrack).

Para llevar a cabo la comprobación de contraseñas tan solo


necesitaremos modificar un archivo de texto que contenga la
configuración PAM (Pluggable Authentication Module), que
controla cualquier interacción del usuario que necesite una
contraseña.

Este será uno de los siguientes archivos

\etc\pam.com
\etc\pam · d\passwd.
Otro tipo de aplicación que solia utilizarse en el caso Linux es
OpenBSD LOGIN.CONF.
Las entradas mas importantes del archivo login.conf son default
por que se aplica a todos los usuarios y daemon por que se aplica
al usuario root. Cada entrada puede tener varias opciones :
1 localcipher=algorithm Default=old. Define el algoritmo de
cifrado que se desea utilizar. Las mejores opciones son md5,
AES, blowfish y N. En donde N es el número de vueltas que
se van a utilizar (N < 32). El valor old representa DES y se
debe evitar por que con este algoritmo las contraseñas no
pueden tener una longitud superior a los 8 caracteres y los
crackers de contraseñas funcionan de manera muy eficiente
contra este algoritmo.
2 ycipher=algorithm Los mismos valores que en el caso de
local cipher. Se utiliza por un tema de compatibilidad con los
inicios de sesión distribuidas basados en el sistema de
información de red NIS.
Otro tipo de aplicación que solia utilizarse en el caso Linux es
OpenBSD LOGIN.CONF.
Las entradas más importantes del archivo login.conf son default
porque se aplica a todos los usuarios y daemon porque se aplica
al usuario root. Cada entrada puede tener varias opciones:
1 localcipher=algorithm Default=old. Define el algoritmo de
cifrado que se desea utilizar. Las mejores opciones son md5,
AES, blowfish y N. En donde N es el número de vueltas que
se van a utilizar (N < 32). El valor old representa DES y se
debe evitar por que con este algoritmo las contraseñas no
pueden tener una longitud superior a los 8 caracteres y los
crackers de contraseñas funcionan de manera muy eficiente
contra este algoritmo.
2 ycipher=algorithm Los mismos valores que en el caso de
local cipher. Se utiliza por un tema de compatibilidad con los
inicios de sesión distribuidas basados en el sistema de
información de red NIS.
Otro tipo de aplicación que solia utilizarse en el caso Linux es
OpenBSD LOGIN.CONF.
Las entradas mas importantes del archivo login.conf son default
por que se aplica a todos los usuarios y daemon por que se aplica
al usuario root. Cada entrada puede tener varias opciones :
1 localcipher=algorithm Default=old. Define el algoritmo de
cifrado que se desea utilizar. Las mejores opciones son md5,
AES, blowfish y N. En donde N es el número de vueltas que
se van a utilizar (N < 32). El valor old representa DES y se
debe evitar porque con este algoritmo, las contraseñas no
pueden tener una longitud superior a los 8 caracteres y los
crackers de contraseñas funcionan de manera muy eficiente
contra este algoritmo.
2 ycipher=algorithm Los mismos valores que en el caso de
local cipher. Se utiliza por un tema de compatibilidad con los
inicios de sesión distribuidas basados en el sistema de
información de red NIS.
Otro tipo de aplicación que solia utilizarse en el caso Linux es
OpenBSD LOGIN.CONF.
Las entradas mas importantes del archivo login.conf son default
por que se aplica a todos los usuarios y daemon por que se aplica
al usuario root. Cada entrada puede tener varias opciones :
1 localcipher=algorithm Default=old. Define el algoritmo de
cifrado que se desea utilizar. Las mejores opciones son md5,
AES, blowfish y N. En donde N es el número de vueltas que
se van a utilizar (N < 32). El valor old representa DES y se
debe evitar por que con este algoritmo las contraseñas no
pueden tener una longitud superior a los 8 caracteres y los
crackers de contraseñas funcionan de manera muy eficiente
contra este algoritmo.
2 ycipher=algorithm Los mismos valores que en el caso de
local cipher. Se utiliza por un tema de compatibilidad con los
inicios de sesión distribuidas basados en el sistema de
información de red NIS.
Otro tipo de aplicación que solia utilizarse en el caso Linux es
OpenBSD LOGIN.CONF.
Las entradas mas importantes del archivo login.conf son default
por que se aplica a todos los usuarios y daemon por que se aplica
al usuario root. Cada entrada puede tener varias opciones :
1 localcipher=algorithm Default=old. Define el algoritmo de
cifrado que se desea utilizar. Las mejores opciones son md5,
AES, blowfish y N. En donde N es el número de vueltas que
se van a utilizar (N < 32). El valor old representa DES y se
debe evitar por que con este algoritmo las contraseñas no
pueden tener una longitud superior a los 8 caracteres y los
crackers de contraseñas funcionan de manera muy eficiente
contra este algoritmo.
2 ycipher=algorithm Los mismos valores que en el caso de
local cipher. Se utiliza por un tema de compatibilidad con los
inicios de sesión distribuidas basados en el sistema de
información de red NIS.
Otro tipo de aplicación que solia utilizarse en el caso Linux es
OpenBSD LOGIN.CONF.
Las entradas mas importantes del archivo login.conf son default
por que se aplica a todos los usuarios y daemon por que se aplica
al usuario root. Cada entrada puede tener varias opciones :
1 localcipher=algorithm Default=old. Define el algoritmo de
cifrado que se desea utilizar. Las mejores opciones son md5,
AES, blowfish y N. En donde N es el número de vueltas que
se van a utilizar (N < 32). El valor old representa DES y se
debe evitar por que con este algoritmo las contraseñas no
pueden tener una longitud superior a los 8 caracteres y los
crackers de contraseñas funcionan de manera muy eficiente
contra este algoritmo.
2 ycipher=algorithm Los mismos valores que en el caso de
local cipher. Se utiliza por un tema de compatibilidad con los
inicios de sesión distribuidas basados en el sistema de
información de red NIS.
Otro tipo de aplicación que solia utilizarse en el caso Linux es
OpenBSD LOGIN.CONF.
Las entradas mas importantes del archivo login.conf son default
por que se aplica a todos los usuarios y daemon por que se aplica
al usuario root. Cada entrada puede tener varias opciones :
1 localcipher=algorithm Default=old. Define el algoritmo de
cifrado que se desea utilizar. Las mejores opciones son md5,
AES, blowfish y N. En donde N es el número de vueltas que
se van a utilizar (N < 32). El valor old representa DES y se
debe evitar por que con este algoritmo las contraseñas no
pueden tener una longitud superior a los 8 caracteres y los
crackers de contraseñas funcionan de manera muy eficiente
contra este algoritmo.
2 ycipher=algorithm Los mismos valores que en el caso de
local cipher. Se utiliza por un tema de compatibilidad con los
inicios de sesión distribuidas basados en el sistema de
información de red NIS.
1 minpasswordlen=N Default =8. La mı́nima longitud de
contraseña aceptable.
2 passwordcheck=program Especifı́ca un programa externo de
comprobación de contraseñas. Se tiene que utilizar con
especial cuidado ya que el programa externo puede estar
sujeto a troyanos, errores o desbordamientos de búfer.
3 passwordtries=N. Default=3. El número de veces que se
pedirá al usuario que especifique una nueva contraseña si la
contraseña introducida anteriormente no cumple los
estándares OpenBSD. El usuario podrá ignorar los estándares
salvo que este valor se defina como 0.
1 minpasswordlen=N Default =8. La mı́nima longitud de
contraseña aceptable.
2 passwordcheck=program Especifı́ca un programa externo de
comprobación de contraseñas. Se tiene que utilizar con
especial cuidado ya que el programa externo puede estar
sujeto a troyanos, errores o desbordamientos de búfer.
3 passwordtries=N. Default=3. El número de veces que se
pedirá al usuario que especifique una nueva contraseña si la
contraseña introducida anteriormente no cumple los
estándares OpenBSD. El usuario podrá ignorar los estándares
salvo que este valor se defina como 0.
1 minpasswordlen=N Default =8. La mı́nima longitud de
contraseña aceptable.
2 passwordcheck=program Especifica un programa externo
de comprobación de contraseñas. Se tiene que utilizar con
especial cuidado ya que el programa externo puede estar
sujeto a troyanos, errores o desbordamientos de búfer.
3 passwordtries=N. Default=3. El número de veces que se
pedirá al usuario que especifique una nueva contraseña si la
contraseña introducida anteriormente no cumple los
estándares OpenBSD. El usuario podrá ignorar los estándares
salvo que este valor se defina como 0.
1 minpasswordlen=N Default =8. La mı́nima longitud de
contraseña aceptable.
2 passwordcheck=program Especifı́ca un programa externo de
comprobación de contraseñas. Se tiene que utilizar con
especial cuidado ya que el programa externo puede estar
sujeto a troyanos, errores o desbordamientos de búfer.
3 passwordtries=N. Default=3. El número de veces que se
pedirá al usuario que especifique una nueva contraseña si la
contraseña introducida anteriormente no cumple los
estándares OpenBSD. El usuario podrá ignorar los estándares
salvo que este valor se defina como 0.
1 minpasswordlen=N Default =8. La mı́nima longitud de
contraseña aceptable.
2 passwordcheck=program Especifı́ca un programa externo de
comprobación de contraseñas. Se tiene que utilizar con
especial cuidado ya que el programa externo puede estar
sujeto a troyanos, errores o desbordamientos de búfer.
3 passwordtries=N. Default=3. El número de veces que se
pedirá al usuario que especifique una nueva contraseña si la
contraseña introducida anteriormente no cumple los
estándares OpenBSD. El usuario podrá ignorar los estándares
salvo que este valor se defina como 0.
Ejemplo
Un archivo login.conf contenı́a algo como lo siguiente ;
daemon : \

: path = /usr /sbin : \


: umask = 077 : \
(1)
: localcipher = blowfish, 31
: passwordretries = 0.
Ejemplo
Un archivo login.conf contenı́a algo como lo siguiente ;
daemon : \

: path = /usr /sbin : \


: umask = 077 : \
(1)
: localcipher = blowfish, 31
: passwordretries = 0.
Ejemplo
Un archivo login.conf contenı́a algo como lo siguiente
daemon : \

: path = /usr /sbin : \


: umask = 077 : \
(1)
: localcipher = blowfish, 31
: passwordretries = 0.
John the ripper
John the ripper (www.openwall.com/john) es probablemente el
cracker de contraseñas más rápido y versátil existente. Soporta 6
diferentes esquemas de hash de distintos sistemas operativos y es
ejecutable en al menos 13 sistemas operativos distintos.
El Ataque TMTO de Hellman
En esta sección se describe un ataque a un sistema criptográfico en
bloque que use en la labor de encripción una clave de 64 bits.
Suponga que Oscar desea atacar el ciframiento de un bloque de 64
bits con una clave de 64 bits.

Como la clave consta de 64 bits el espacio de claves consta de 264


claves distintas.

En este caso, Oscar elige un texto en claro P y luego obtiene el


correspondiente texto cifrado C = E (P, K ). Obtener la clave K
desconocida es el objetivo de Oscar.

Para ello, Oscar elige un punto de inicio de 64 bits, que denotamos


SP y despues construye una cadena de ciframientos como lo
describimos a continuación empezando con SP;
Suponga que Oscar desea atacar el ciframiento de un bloque de 64
bits con una clave de 64 bits.

Como la clave consta de 64 bits el espacio de claves consta de 264


claves distintas.

En este caso, Oscar elige un texto en claro P y luego obtiene el


correspondiente texto cifrado C = E (P, K ). Obtener la clave K
desconocida es el objetivo de Oscar.

Para ello, Oscar elige un punto de inicio de 64 bits, que denotamos


SP y despues construye una cadena de ciframientos como lo
describimos a continuación empezando con SP;
Suponga que Oscar desea atacar el ciframiento de un bloque de 64
bits con una clave de 64 bits.

Como la clave consta de 64 bits el espacio de claves consta de 264


claves distintas.

En este caso, Oscar elige un texto en claro P y luego obtiene el


correspondiente texto cifrado C = E (P, K ). Obtener la clave K
desconocida es el objetivo de Oscar.

Para ello, Oscar elige un punto de inicio de 64 bits, que denotamos


SP y despues construye una cadena de ciframientos como lo
describimos a continuación empezando con SP;
Suponga que Oscar desea atacar el ciframiento de un bloque de 64
bits con una clave de 64 bits.

Como la clave consta de 64 bits el espacio de claves consta de 264


claves distintas.

En este caso, Oscar elige un texto en claro P y luego obtiene el


correspondiente texto cifrado C = E (P, K ). Obtener la clave K
desconocida es el objetivo de Oscar.

Para ello, Oscar elige un punto de inicio de 64 bits, que denotamos


SP y después construye una cadena de ciframientos como lo
describimos a continuación empezando con SP;
K0 = SP
K1 = E (P, SP)
K2 = E (P, K1 )
K3 = E (P, K2 ) (2)
..
.
EP = Kt−1 = E (P, Kt−2 )

donde EP = Kt−1 es el punto final de la cadena de cifrados de


longitud t.

Observe que Oscar usa el texto cifrado generado en el primer paso


como la clave a ser usada en el siguiente paso.
K0 = SP
K1 = E (P, SP)
K2 = E (P, K1 )
K3 = E (P, K2 ) (2)
..
.
EP = Kt−1 = E (P, Kt−2 )

donde EP = Kt−1 es el punto final de la cadena de cifrados de


longitud t.

Observe que Oscar usa el texto cifrado generado en el primer paso


como la clave a ser usada en el siguiente paso.
Supongamos que Oscar guarda las siguientes salidas:

(SP0 , EP0 ), (SP1 , EP1 ), (SP2 , EP2 ), . . . , (SPm−1 , SPm−1 ).

En general para estos casos deben guardarse 2m = 233 palabras


cada una con n bits.

El conjunto de puntos iniciales y finales será usado cada vez que


Oscar realice un ataque.

Una vez realizados los cálculos anteriores, se implementa el ataque


de la siguiente forma:

Oscar elige el mismo texto en claro P utilizado en la fase de


precálculo con el que obtiene un texto cifrado C . Para encontrar la
clave K calcula una cadena de ciframientos, comenzando con C de
longitud máxima t. Esto es, Oscar calcula:
Supongamos que Oscar guarda las siguientes salidas:

(SP0, EP0), (SP1, EP1), (SP2, EP2), . . . , (SPm−1, SPm−1).

En general, para estos casos deben guardarse 2m = 233 palabras


cada una con n bits.

El conjunto de puntos iniciales y finales será usado cada vez que


Oscar realice un ataque.

Una vez realizados los cálculos anteriores, se implementa el ataque


de la siguiente forma:

Oscar elige el mismo texto en claro P utilizado en la fase de


precálculo con el que obtiene un texto cifrado C . Para encontrar la
clave K calcula una cadena de ciframientos, comenzando con C de
longitud máxima t. Esto es, Oscar calcula:
Supongamos que Oscar guarda las siguientes salidas:

(SP0 , EP0 ), (SP1 , EP1 ), (SP2 , EP2 ), . . . , (SPm−1 , SPm−1 ).

En general para estos casos deben guardarse 2m = 233 palabras


cada una con n bits.

El conjunto de puntos iniciales y finales será usado cada vez que


Oscar realice un ataque.

Una vez realizados los cálculos anteriores, se implementa el ataque


de la siguiente forma:

Oscar elige el mismo texto en claro P utilizado en la fase de


precálculo con el que obtiene un texto cifrado C . Para encontrar la
clave K calcula una cadena de ciframientos, comenzando con C de
longitud máxima t. Esto es, Oscar calcula:
Supongamos que Oscar guarda las siguientes salidas:

(SP0 , EP0 ), (SP1 , EP1 ), (SP2 , EP2 ), . . . , (SPm−1 , SPm−1 ).

En general para estos casos deben guardarse 2m = 233 palabras


cada una con n bits.

El conjunto de puntos iniciales y finales será usado cada vez que


Oscar realice un ataque.

Una vez realizados los cálculos anteriores, se implementa el ataque


de la siguiente forma:

Oscar elige el mismo texto en claro P utilizado en la fase de


precálculo con el que obtiene un texto cifrado C . Para encontrar la
clave K calcula una cadena de ciframientos, comenzando con C de
longitud máxima t. Esto es, Oscar calcula:
Supongamos que Oscar guarda las siguientes salidas:

(SP0 , EP0 ), (SP1 , EP1 ), (SP2 , EP2 ), . . . , (SPm−1 , SPm−1 ).

En general para estos casos deben guardarse 2m = 233 palabras


cada una con n bits.

El conjunto de puntos iniciales y finales será usado cada vez que


Oscar realice un ataque.

Una vez realizados los cálculos anteriores, se implementa el ataque


de la siguiente forma:

Oscar elige el mismo texto en claro P utilizado en la fase de


precálculo con el que obtiene un texto cifrado C . Para encontrar la
clave K calcula una cadena de ciframientos, comenzando con C de
longitud máxima t. Esto es, Oscar calcula:
X0 = C
X1 = E (P, X0 )
X2 = E (P, X1 ) (3)
X3 = E (P, X2 )
..
.

En cada paso i = 1, 2 . . . hasta el máximo valor t Oscar compara


Xi con los puntos finales guardados,

EP0 , EP1 , . . . , EPm−1 .

Como C es un posible valor de la clave C debe poderse lograr en


algún lugar de una cadena. Por ejemplo si C está en la cadena j
entonces para algún i ∈ {0, 1, . . . , t − 1}, Oscar encontrará
Xi = EPj .
X0 = C
X1 = E (P, X0 )
X2 = E (P, X1 ) (3)
X3 = E (P, X2 )
..
.

En cada paso i = 1, 2 . . . hasta el máximo valor t Oscar compara


Xi con los puntos finales guardados,

EP0 , EP1 , . . . , EPm−1 .

Como C es un posible valor de la clave C debe poderse lograr en


algún lugar de una cadena. Por ejemplo si C está en la cadena j
entonces para algún i ∈ {0, 1, . . . , t − 1}, Oscar encontrará
Xi = EPj .
Una vez encontrados i, j tales que Xi = EPj , Oscar puede
reconstruir la parte inicial de la cadena j de SPj , realizando los
siguientes cálculos:

Y0 = SPj
Y1 = E (P, Y0 )
Y2 = E (P, Y1 )
Y3 = E (P, Y2 ) (4)
..
.
Yt−i−1 = E (P, Yt−i−2 )
Yt−i = X0 = E (P, Yt−i−1 ).

Como C = X0 = E (P, K ), podemos concluir K = Yt−i−1 .


Para evitar cálculos innecesarios Oscar debe evitar cadenas que se
mezclen o ciclos, ya que si ellas ocurren los cálculos realizados
tenderán a replicarse, con lo que la busqueda de la clave resultará
ser mas costosa.

Si Oscar reduce ciclos y fusiones entonces podrá reducir las falsas


alarmas y con esto los cálculos requeridos para obtener la clave K .
Para lograr esto debemos adoptar una función aletoria F
(generalmente una permutación es usada si n = k) y con esta
función una cadena se calcula de la siguiente forma:
Para evitar cálculos innecesarios Oscar debe evitar cadenas que se
mezclen o ciclos, ya que si ellas ocurren los cálculos realizados
tenderán a replicarse, con lo que la búsqueda de la clave resultará
ser más costosa.

Si Oscar reduce ciclos y fusiones entonces podrá reducir las falsas


alarmas y con esto los cálculos requeridos para obtener la clave K .
Para lograr esto debemos adoptar una función aleatoria F
(generalmente una permutación es usada si n = k) y con esta
función, una cadena se calcula de la siguiente forma:
K0 = SP
K1 = F (E (P, SP))
K2 = F (E (P, K1 ))
K3 = F (E (P, K2 )) (5)
..
.
Kt−1 = EP = F ((E (P, Kt−2 ))).

Oscar intentará usar una función F por cada cadena, lo cual requiere
mucho esfuerzo computacional. Por esto, es preferible elegir r
diferentes funciones Fi con i = 0, . . . , r − 1 y con cada una de ellas
construye m cadenas cada una comenzando en un punto del tipo SP,
cada cadena tendrá longitud t.
El conjunto de cadenas correspondiente a una función especı́fica se
llama una tabla. Con lo que tenemos r tablas con m cadenas de
longitud t.
Algoritmo para encontrar parejas del tipo (SP, EP)
Find (SPij , EPij ), i = 0, 1, . . . , r − 1 and j = 0, 1, . . . m − 1
findChains
for i = 0 to r − 1
Choose a random Fi
Generate table i
for j = 0 to m − 1
Generate a random starting point SPij
K0 = SPij
for l = 1 to t − 1
Kl = Fi (E (P, Kl−1 ))
next l
EPij = Kt−1
next j
next i
end findChains
Algoritmo para encontrar EP de C
Given C ,search for an end point EP
findEP(C )
for i = 0 to r − 1
Y = Fi (C )
for j = 1 to t
for l = 0 to m − 1
if Y = EPil then
found = findKey(i, l, j)
if not found then
false alarm
else found = K
return(found)
end if
end if
next l
Algoritmo para encontrar EP de C
Y = Fi (E (P, Y ))
next j
next i
return(key not found)
end findEP
Algoritmo para encontrar la clave a partir de SP
Is key K at position t − j − 1 in chain l of table i?
findKey(i, l, j)
Y = SPil
for q = 1 to t − j − 1
Y = Fi (E (P, Y ))
next q
K =Y
if C = E (P, Y ) then
return(K )
else false alarm
return(not found)
end if
end findKey
Mobile
El método CMEA para cifrar mensajes en teléfonos celulares fue
introducido por James Reeds (crypto.hurlant.com).

CMEA es un sistema de ciframiento en bloque empleado en la TIA


(Telecommunications Industry Association) para dar una seguridad
a las comunicaciones con este tipo de dispositivos.

CMEA emplea claves de 64 bits y un bloque de tamaño variable,


en este caso el tamaño del bloque es calculado en bytes. dos a seis
bytes es el tamaño usual de los bloques.

El cifrado requiere de una tabla conocida como Cava (cava no es


una permutación ya que solo usa una lista de 164 valores no
necesariamente uniformes), en esta tabla 97 de los bytes ocurren
solo una vez, mientras que 44 de ellos aparecen dos veces y 21 lo
hacen tres veces. Los bytes restantes ocurren cuatro veces.
El metódo CMEA para cifrar mensajes en teléfonos celulares fué
introducido por James Reeds (crypto.hurlant.com).

CMEA es un sistema de ciframiento en bloque empleado en la TIA


(Telecommunications Industry Association), para dar una seguridad
a las comunicaciones con este tipo de dispositivos.

CMEA emplea claves de 64 bits y un bloque de tamaño variable,


en este caso el tamaño del bloque es calculado en bytes. dos a seis
bytes es el tamaño usual de los bloques.

El cifrado requiere de una tabla conocida como Cava (cava no es


una permutación ya que solo usa una lista de 164 valores no
necesariamente uniformes), en esta tabla 97 de los bytes ocurren
solo una vez, mientras que 44 de ellos aparecen dos veces y 21 lo
hacen tres veces. Los bytes restantes ocurren cuatro veces.
El metódo CMEA para cifrar mensajes en teléfonos celulares fué
introducido por James Reeds (crypto.hurlant.com).

CMEA es un sistema de ciframiento en bloque empleado en la TIA


(Telecommunications Industry Association) para dar una seguridad
a las comunicaciones con este tipo de dispositivos.

CMEA emplea claves de 64 bits y un bloque de tamaño variable. En


este caso, el tamaño del bloque es calculado en bytes. Dos a seis bytes
es el tamaño usual de los bloques.

El cifrado requiere de una tabla conocida como Cava (cava no es


una permutación ya que solo usa una lista de 164 valores no
necesariamente uniformes), en esta tabla 97 de los bytes ocurren
solo una vez, mientras que 44 de ellos aparecen dos veces y 21 lo
hacen tres veces. Los bytes restantes ocurren cuatro veces.
El metódo CMEA para cifrar mensajes en teléfonos celulares fué
introducido por James Reeds (crypto.hurlant.com).

CMEA es un sistema de ciframiento en bloque empleado en la TIA


(Telecommunications Industry Association) para dar una seguridad
a las comunicaciones con este tipo de dispositivos.

CMEA emplea claves de 64 bits y un bloque de tamaño variable,


en este caso el tamaño del bloque es calculado en bytes. dos a seis
bytes es el tamaño usual de los bloques.

El cifrado requiere de una tabla conocida como Cava (cava no es


una permutación ya que solo usa una lista de 164 valores no
necesariamente uniformes). En esta tabla 97 de los bytes ocurren
solo una vez, mientras que 44 de ellos aparecen dos veces y 21 lo
hacen tres veces. Los bytes restantes ocurren cuatro veces.
Dado un byte que consta de dígitos hexadecimales x, y . Sea C [xy ] la
entrada en la fila x y columna y de la cava. Por ejemplo:
C [0x4e] = 0x09, puesto que 0x09 está en la fila 0x4 y columna
0xe, en la tabla.
Mobile
Sean K0 , K1 , . . . , K7 los ocho bytes de la clave CMEA, dada esta
clave realizamos las siguientes operaciones:

Q(x) = C [(x ⊕ K0 ) + K1 ] + x
R(x) = C [(Q(x) ⊕ K2 ) + K3 ] + x
(6)
S(x) = C [(R(x) ⊕ K4 ) + K5 ] + x
T (x) = C [(R(x) ⊕ K6 ) + K7 ] + x.

En este caso x es un byte y las adiciones se realizan módulo 256. Por


la definición de S, T y Q, observamos que T (x) − x,
Q(x) − x, S(x) − x y R(x) − x están en la cava.
Nota
Note que, el sistema CMEA es su propio inverso de forma tal,
que se usa el mismo procedimiento tanto como para cifrar como
para descifrar información.
CMEA
∨ is OR
(c[0], c[1], . . . , c[n − 1]) = output block of ciphertexts bytes
1 (p[0], p[1], . . . , p[n − 1]) = input block of plaintexts bytes
2 z =0
3 for i = 0 to n − 1
4 k = T (z ⊕ i)
5 p[i] = p[i] + k
6 z = z + p[i]
7 next i
8 h = bn/2c
9 for i = 0 to h − 1
10 p[i] = p[i] ⊕ (p[n − 1 − i] ∨ 1)
CMEA
∨ is OR
(c[0], c[1], . . . , c[n − 1]) = output block of ciphertexts bytes
1 (p[0], p[1], . . . , p[n − 1]) = input block of plaintexts bytes
2 z =0
3 for i = 0 to n − 1
4 k = T (z ⊕ i)
5 p[i] = p[i] + k
6 z = z + p[i]
7 next i
8 h = bn/2c
9 for i = 0 to h − 1
10 p[i] = p[i] ⊕ (p[n − 1 − i] ∨ 1)
CMEA
∨ is OR
(c[0], c[1], . . . , c[n − 1]) = output block of ciphertexts bytes
1 (p[0], p[1], . . . , p[n − 1]) = input block of plaintexts bytes
2 z =0
3 for i = 0 to n − 1
4 k = T (z ⊕ i)
5 p[i] = p[i] + k
6 z = z + p[i]
7 next i
8 h = bn/2c
9 for i = 0 to h − 1
10 p[i] = p[i] ⊕ (p[n − 1 − i] ∨ 1)
CMEA
∨ is OR
(c[0], c[1], . . . , c[n − 1]) = output block of ciphertexts bytes
1 (p[0], p[1], . . . , p[n − 1]) = input block of plaintexts bytes
2 z =0
3 for i = 0 to n − 1
4 k = T (z ⊕ i)
5 p[i] = p[i] + k
6 z = z + p[i]
7 next i
8 h = bn/2c
9 for i = 0 to h − 1
10 p[i] = p[i] ⊕ (p[n − 1 − i] ∨ 1)
CMEA
∨ is OR
(c[0], c[1], . . . , c[n − 1]) = output block of ciphertexts bytes
1 (p[0], p[1], . . . , p[n − 1]) = input block of plaintexts bytes
2 z =0
3 for i = 0 to n − 1
4 k = T (z ⊕ i)
5 p[i] = p[i] + k
6 z = z + p[i]
7 next i
8 h = bn/2c
9 for i = 0 to h − 1
10 p[i] = p[i] ⊕ (p[n − 1 − i] ∨ 1)
CMEA
∨ is OR
(c[0], c[1], . . . , c[n − 1]) = output block of ciphertexts bytes
1 (p[0], p[1], . . . , p[n − 1]) = input block of plaintexts bytes
2 z =0
3 for i = 0 to n − 1
4 k = T (z ⊕ i)
5 p[i] = p[i] + k
6 z = z + p[i]
7 next i
8 h = bn/2c
9 for i = 0 to h − 1
10 p[i] = p[i] ⊕ (p[n − 1 − i] ∨ 1)
CMEA
∨ is OR
(c[0], c[1], . . . , c[n − 1]) = output block of ciphertexts bytes
1 (p[0], p[1], . . . , p[n − 1]) = input block of plaintexts bytes
2 z =0
3 for i = 0 to n − 1
4 k = T (z ⊕ i)
5 p[i] = p[i] + k
6 z = z + p[i]
7 next i
8 h = bn/2c
9 for i = 0 to h − 1
10 p[i] = p[i] ⊕ (p[n − 1 − i] ∨ 1)
CMEA
∨ is OR
(c[0], c[1], . . . , c[n − 1]) = output block of ciphertexts bytes
1 (p[0], p[1], . . . , p[n − 1]) = input block of plaintexts bytes
2 z =0
3 for i = 0 to n − 1
4 k = T (z ⊕ i)
5 p[i] = p[i] + k
6 z = z + p[i]
7 next i
8 h = bn/2c
9 for i = 0 to h − 1
10 p[i] = p[i] ⊕ (p[n − 1 − i] ∨ 1)
CMEA
∨ is OR
(c[0], c[1], . . . , c[n − 1]) = output block of ciphertexts bytes
1 (p[0], p[1], . . . , p[n − 1]) = input block of plaintexts bytes
2 z =0
3 for i = 0 to n − 1
4 k = T (z ⊕ i)
5 p[i] = p[i] + k
6 z = z + p[i]
7 next i
8 h = bn/2c
9 for i = 0 to h − 1
10 p[i] = p[i] ⊕ (p[n − 1 − i] ∨ 1)
CMEA
∨ is OR
(c[0], c[1], . . . , c[n − 1]) = output block of ciphertexts bytes
1 (p[0], p[1], . . . , p[n − 1]) = input block of plaintexts bytes
2 z =0
3 for i = 0 to n − 1
4 k = T (z ⊕ i)
5 p[i] = p[i] + k
6 z = z + p[i]
7 next i
8 h = bn/2c
9 for i = 0 to h − 1
10 p[i] = p[i] ⊕ (p[n − 1 − i] ∨ 1)
CMEA
∨ is OR
(c[0], c[1], . . . , c[n − 1]) = output block of ciphertexts bytes
1 (p[0], p[1], . . . , p[n − 1]) = input block of plaintexts bytes
2 z =0
3 for i = 0 to n − 1
4 k = T (z ⊕ i)
5 p[i] = p[i] + k
6 z = z + p[i]
7 next i
8 h = bn/2c
9 for i = 0 to h − 1
10 p[i] = p[i] ⊕ (p[n − 1 − i] ∨ 1)
CMEA
1 next i
2 z =0
3 for i = 0 to n − 1
4 k = T (z ⊕ i)
5 z = z ⊕ p[i]
6 c[i] = p[i] − k
7 next i.
CMEA
1 next i
2 z =0
3 for i = 0 to n − 1
4 k = T (z ⊕ i)
5 z = z ⊕ p[i]
6 c[i] = p[i] − k
7 next i.
CMEA
1 next i
2 z =0
3 for i = 0 to n − 1
4 k = T (z ⊕ i)
5 z = z ⊕ p[i]
6 c[i] = p[i] − k
7 next i.
CMEA
1 next i
2 z =0
3 for i = 0 to n − 1
4 k = T (z ⊕ i)
5 z = z ⊕ p[i]
6 c[i] = p[i] − k
7 next i.
CMEA
1 next i
2 z =0
3 for i = 0 to n − 1
4 k = T (z ⊕ i)
5 z = z ⊕ p[i]
6 c[i] = p[i] − k
7 next i.
CMEA
1 next i
2 z =0
3 for i = 0 to n − 1
4 k = T (z ⊕ i)
5 z = z ⊕ p[i]
6 c[i] = p[i] − k
7 next i.
CMEA
1 next i
2 z =0
3 for i = 0 to n − 1
4 k = T (z ⊕ i)
5 z = z ⊕ p[i]
6 c[i] = p[i] − k
7 next i.
CMEA
1 next i
2 z =0
3 for i = 0 to n − 1
4 k = T (z ⊕ i)
5 z = z ⊕ p[i]
6 c[i] = p[i] − k
7 next i.
la SCMEA es la versión simplificada de CMEA, la cual se obtiene
al usar en el numeral 10 anterior la siguiente expresión:

p[i] = p[i] ⊕ p[n − 1 − i].

Ahora procederemos a atacar el sistema como ha sido descrito, lo


interesante de este ataque es que puede ser generalizado para
CMEA.

Suponga que el texto en claro tiene la forma:

(p0 , p1 , p2 ) = ((l ⊕ 1 − T (0)), (j ⊕ 2) − (l ⊕ 1) − T (l), 0)

para algún l, j. Esto no es difı́cil de realizar ya que siempre el


primer byte de CMEA es:

c0 = (l ⊕ 1 ⊕ T (j) − T (0)).

Usemos este hecho para desarrollar un eficiente ataque de texto


claro elegido.
la SCMEA es la versión simplificada de CMEA, la cual se obtiene
al usar en el numeral 10 anterior la siguiente expresión:

p[i] = p[i] ⊕ p[n − 1 − i].

Ahora procederemos a atacar el sistema como ha sido descrito, lo


interesante de este ataque es que puede ser generalizado para
CMEA.

Suponga que el texto en claro tiene la forma:

(p0 , p1 , p2 ) = ((l ⊕ 1 − T (0)), (j ⊕ 2) − (l ⊕ 1) − T (l), 0)

para algún l, j. Esto no es difı́cil de realizar ya que siempre el


primer byte de CMEA es:

c0 = (l ⊕ 1 ⊕ T (j) − T (0)).

Usemos este hecho para desarrollar un eficiente ataque de texto


claro elegido.
la SCMEA es la versión simplificada de CMEA, la cual se obtiene
al usar en el numeral 10 anterior la siguiente expresión:

p[i] = p[i] ⊕ p[n − 1 − i].

Ahora procederemos a atacar el sistema como ha sido descrito.


Lo interesante de este ataque es que puede ser generalizado para
CMEA.

Suponga que el texto en claro tiene la forma:

(p0 , p1 , p2 ) = ((l ⊕ 1 − T (0)), (j ⊕ 2) − (l ⊕ 1) − T (l), 0)

para algún l, j. Esto no es difı́cil de realizar ya que siempre el


primer byte de CMEA es:

c0 = (l ⊕ 1 ⊕ T (j) − T (0)).

Usemos este hecho para desarrollar un eficiente ataque de texto


claro elegido.
la SCMEA es la versión simplificada de CMEA, la cual se obtiene
al usar en el numeral 10 anterior la siguiente expresión:

p[i] = p[i] ⊕ p[n − 1 − i].

Ahora procederemos a atacar el sistema como ha sido descrito, lo


interesante de este ataque es que puede ser generalizado para
CMEA.

Suponga que el texto en claro tiene la forma:

(p0 , p1 , p2 ) = ((l ⊕ 1 − T (0)), (j ⊕ 2) − (l ⊕ 1) − T (l), 0)

para algún l, j. Esto no es difı́cil de realizar ya que siempre el


primer byte de CMEA es:

c0 = (l ⊕ 1 ⊕ T (j) − T (0)).

Usemos este hecho para desarrollar un eficiente ataque de texto


claro elegido.
la SCMEA es la versión simplificada de CMEA, la cual se obtiene
al usar en el numeral 10 anterior la siguiente expresión:

p[i] = p[i] ⊕ p[n − 1 − i].

Ahora procederemos a atacar el sistema como ha sido descrito, lo


interesante de este ataque es que puede ser generalizado para
CMEA.

Suponga que el texto en claro tiene la forma:

(p0 , p1 , p2 ) = ((l ⊕ 1 − T (0)), (j ⊕ 2) − (l ⊕ 1) − T (l), 0)

para algún l, j. Esto no es difı́cil de realizar ya que siempre el


primer byte de CMEA es:

c0 = (l ⊕ 1 ⊕ T (j) − T (0)).

Usemos este hecho para desarrollar un eficiente ataque de texto


claro elegido.
la SCMEA es la versión simplificada de CMEA, la cual se obtiene
al usar en el numeral 10 anterior la siguiente expresión:

p[i] = p[i] ⊕ p[n − 1 − i].

Ahora procederemos a atacar el sistema como ha sido descrito, lo


interesante de este ataque es que puede ser generalizado para
CMEA.

Suponga que el texto en claro tiene la forma:

(p0, p1, p2) = ((l ⊕ 1 − T (0)), (j ⊕ 2) − (l ⊕ 1) − T (l), 0)

para algún l, j. Esto no es difı́cil de realizar, ya que siempre el primer


byte de CMEA es:

c0 = (l ⊕ 1 ⊕ T (j) − T (0)).

Usemos este hecho para desarrollar un eficiente ataque de texto


claro elegido.
la SCMEA es la versión simplificada de CMEA, la cual se obtiene
al usar en el numeral 10 anterior la siguiente expresión:

p[i] = p[i] ⊕ p[n − 1 − i].

Ahora procederemos a atacar el sistema como ha sido descrito, lo


interesante de este ataque es que puede ser generalizado para
CMEA.

Suponga que el texto en claro tiene la forma:

(p0 , p1 , p2 ) = ((l ⊕ 1 − T (0)), (j ⊕ 2) − (l ⊕ 1) − T (l), 0)

para algún l, j. Esto no es difı́cil de realizar ya que siempre el


primer byte de CMEA es:

c0 = (l ⊕ 1 ⊕ T (j) − T (0)).

Usemos este hecho para desarrollar un eficiente ataque de texto


claro elegido.
la SCMEA es la versión simplificada de CMEA, la cual se obtiene
al usar en el numeral 10 anterior la siguiente expresión:

p[i] = p[i] ⊕ p[n − 1 − i].

Ahora procederemos a atacar el sistema como ha sido descrito, lo


interesante de este ataque es que puede ser generalizado para
CMEA.

Suponga que el texto en claro tiene la forma:

(p0 , p1 , p2 ) = ((l ⊕ 1 − T (0)), (j ⊕ 2) − (l ⊕ 1) − T (l), 0)

para algún l, j. Esto no es difı́cil de realizar ya que siempre el


primer byte de CMEA es:

c0 = (l ⊕ 1 ⊕ T (j) − T (0)).

Usemos este hecho para desarrollar un eficiente ataque de texto


claro elegido.
En primer lugar determinamos T (0) y luego lo usamos para
calcular T (j), j = 1, 2, . . . , 255

Ciframos bloques de texto en claro elegidos de la forma:

(p0 , p1 , p2 ) = (1 − x0 , 1 − x0 , 0)

hasta obtener un byte de texto cifrado c0 = (1 ⊕ x0 ) − x0 , c0 = 1


si x0 es par, c0 = 255 si x0 es impar.

De acuerdo a las ecuaciones anteriores con l = 0, j = 0 y cualquier


x0 las condiciones para c0 anteriores son consistentes con el hecho
de que x0 = T (0).
En primer lugar determinamos T (0) y luego lo usamos para
calcular T (j), j = 1, 2, . . . , 255

Ciframos bloques de texto en claro elegidos de la forma:

(p0 , p1 , p2 ) = (1 − x0 , 1 − x0 , 0)

hasta obtener un byte de texto cifrado c0 = (1 ⊕ x0 ) − x0 , c0 = 1


si x0 es par, c0 = 255 si x0 es impar.

De acuerdo a las ecuaciones anteriores con l = 0, j = 0 y cualquier


x0 las condiciones para c0 anteriores son consistentes con el hecho
de que x0 = T (0).
Como T (0) = T (0) − 0 y sabemos que T (x) − x está en la cava,
podemos restringir nuestra atención a los 164 valores de x0 que
aparecen en la tabla.

Considere un x0 para el que las condiciones para c0 se tienen,


entonces x0 es un valor hipotético para T (0).

Ahora para cada j = 1, 2, . . . , 255 elegimos:

c(p0 , p1 , p2 ) = (1 − x0 , (j ⊕ 2) − x0 , 0) (7)

para luego calcular el correspondiente texto cifrado. Si de hecho


x0 = T0 entonces de las ecuaciones dadas arriba con l = 0 se
concluye:

c0 = (1 ⊕ xj ) − x0 , (8)
Como T (0) = T (0) − 0 y sabemos que T (x) − x está en la cava,
podemos restringir nuestra atención a los 164 valores de x0 que
aparecen en la tabla.

Considere un x0 para el que las condiciones para c0 se tienen,


entonces x0 es un valor hipotético para T (0).

Ahora para cada j = 1, 2, . . . , 255 elegimos:

c(p0 , p1 , p2 ) = (1 − x0 , (j ⊕ 2) − x0 , 0) (7)

para luego calcular el correspondiente texto cifrado. Si de hecho


x0 = T0 entonces de las ecuaciones dadas arriba con l = 0 se
concluye:

c0 = (1 ⊕ xj ) − x0 , (8)
Como T (0) = T (0) − 0 y sabemos que T (x) − x está en la cava,
podemos restringir nuestra atención a los 164 valores de x0 que
aparecen en la tabla.

Considere un x0 para el que las condiciones para c0 se tienen,


entonces x0 es un valor hipotético para T (0).

Ahora para cada j = 1, 2, . . . , 255 elegimos:

c(p0 , p1 , p2 ) = (1 − x0 , (j ⊕ 2) − x0 , 0) (7)

para luego calcular el correspondiente texto cifrado. Si de hecho


x0 = T0 entonces de las ecuaciones dadas arriba con l = 0 se
concluye:

c0 = (1 ⊕ xj ) − x0 , (8)
Como T (0) = T (0) − 0 y sabemos que T (x) − x está en la cava,
podemos restringir nuestra atención a los 164 valores de x0 que
aparecen en la tabla.

Considere un x0 para el que las condiciones para c0 se tienen,


entonces x0 es un valor hipotético para T (0).

Ahora para cada j = 1, 2, . . . , 255 elegimos:

c(p0 , p1 , p2 ) = (1 − x0 , (j ⊕ 2) − x0 , 0) (7)

para luego calcular el correspondiente texto cifrado. Si de hecho


x0 = T0 entonces de las ecuaciones dadas arriba con l = 0 se
concluye:

c0 = (1 ⊕ xj ) − x0 , (8)
donde xj = T (j). Si (8) se cumple entonces podemos resolver para
xj = c0 ⊕ x0 ⊕ 1. Si es el caso que x0 = T (0) entonces concluimos
xj = T (j) y sabemos que T (j) − j está en la cava. Por
consiguiente para cada j verificamos si xj − j está en la cava.

Si para cualquier j determinamos que xj − j no está en la cava


entonces concluimos x0 6= T (0) y debemos continuar la busqueda
de T (0).

Si por el otro lado xj − j está en la cava para todo j entonces con


alta probabı́lidad encontraremos T (0).
donde xj = T (j). Si (8) se cumple entonces podemos resolver para
xj = c0 ⊕ x0 ⊕ 1. Si es el caso que x0 = T (0) entonces concluimos
xj = T (j) y sabemos que T (j) − j está en la cava. Por
consiguiente para cada j verificamos si xj − j está en la cava.

Si para cualquier j determinamos que xj − j no está en la cava


entonces concluimos x0 6= T (0) y debemos continuar la busqueda
de T (0).

Si por el otro lado xj − j está en la cava para todo j entonces con


alta probabı́lidad encontraremos T (0).
donde xj = T (j). Si (8) se cumple entonces podemos resolver para
xj = c0 ⊕ x0 ⊕ 1. Si es el caso que x0 = T (0) entonces concluimos
xj = T (j) y sabemos que T (j) − j está en la cava. Por
consiguiente para cada j verificamos si xj − j está en la cava.

Si para cualquier j determinamos que xj − j no está en la cava


entonces concluimos x0 6= T (0) y debemos continuar la búsqueda de
T (0).

Si por el otro lado xj − j está en la cava para todo j entonces con alta
probabilidad encontraremos T (0).
donde xj = T (j). Si (8) se cumple entonces podemos resolver para
xj = c0 ⊕ x0 ⊕ 1. Si es el caso que x0 = T (0) entonces concluimos
xj = T (j) y sabemos que T (j) − j está en la cava. Por
consiguiente para cada j verificamos si xj − j está en la cava.

Si para cualquier j determinamos que xj − j no está en la cava


entonces concluimos x0 6= T (0) y debemos continuar la búsqueda de
T (0).

Si por el otro lado xj − j está en la cava para todo j entonces con alta
probabilidad encontraremos T (0).
Como hay 164 valores en la cava y T (0) debe ser uno de esos
valores entonces podemos obtenerlo con 82 textos en claro
elegidos.

Una vez determinado T (0) podemos encontrar todos los T (j) para
j = 1, 2, . . . , 255 con otros 255 textos en claro elegidos, usando (8).

El número total de textos en claro elegidos son 337 bloques.


Como hay 164 valores en la cava y T (0) debe ser uno de esos
valores entonces podemos obtenerlo con 82 textos en claro
elegidos.

Una vez determinado T (0) podemos encontrar todos los T (j) para
j = 1, 2, . . . , 255 con otros 255 textos en claro elegidos, usando (8).

El número total de textos en claro elegidos son 337 bloques.


Como hay 164 valores en la cava y T (0) debe ser uno de esos
valores entonces podemos obtenerlo con 82 textos en claro
elegidos.

Una vez determinado T (0) podemos encontrar todos los T (j) para
j = 1, 2, . . . , 255 con otros 255 textos en claro elegidos, usando (8).

El número total de textos en claro elegidos son 337 bloques.


Bibliografı́a
1 A. J. Menezes, P. C, van Oorschot, Handbook of Applied
Cryptography, CRC Press, 1996.
2 K. Jones, M. Shema, B.C. Johnson, Superutilidades Hacker,
Anti-Hacker Tool Kit, translation, Osborne MacGraw-Hill,
2003.
3 D. R. Stinson, Cryptography Theory And Practice, 3-ed,
Chapman and Hall/CRC, 2006.
1 A. J. Menezes, P. C, van Oorschot, Handbook of Applied
Cryptography, CRC Press, 1996.
2 K. Jones, M. Shema, B.C. Johnson, Superutilidades Hacker,
Anti-Hacker Tool Kit, translation, Osborne MacGraw-Hill,
2003.
3 D. R. Stinson, Cryptography Theory And Practice, 3-ed,
Chapman and Hall/CRC, 2006.
1 A. J. Menezes, P. C, van Oorschot, Handbook of Applied
Cryptography, CRC Press, 1996.
2 K. Jones, M. Shema, B.C. Johnson, Superutilidades Hacker,
Anti-Hacker Tool Kit, translation, Osborne MacGraw-Hill,
2003.
3 D. R. Stinson, Cryptography Theory And Practice, 3-ed,
Chapman and Hall/CRC, 2006.

También podría gustarte