elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Seguridad
| | |-+  Criptografía (Moderador: kub0x)
| | | |-+  Algoritmo DES (Data Encryption Standard) explicado paso a paso.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Algoritmo DES (Data Encryption Standard) explicado paso a paso.  (Leído 3,865 veces)
@XSStringManolo
Hacker/Programador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.399


Turn off the red ligth


Ver Perfil WWW
Algoritmo DES (Data Encryption Standard) explicado paso a paso.
« en: 6 Febrero 2022, 09:30 am »

Cifrado DES Explicado by StringManolo

DES (Data Encryption Standard) es un algoritmo de cifrado por bloques ya en desuso en su versión clásica, aunque en teoría su versión tripleDES es "segura", no se recomienda su uso debido a que hay alternativas mas seguras y rápidas. Aún así vale la pena conocer como funciona. La versión TripleDES no es mas que cifrar 3 veces el mensaje con DES.

- En el cifrado simétrico por bloques DES se utiliza una clave de 64 caracteres como entrada

Por ejemplo la clave en ASCII/UTF-8 (abcdefgh)
Cada caracter en esta clave se represta usando 1 byte (8 bits).
ASCII -> abcdefgh
Binario -> 01100001 01100010 01100011 01100100 01100101 01100110 01100111 01101000
Secuencia -> 0110000101100010011000110110010001100101011001100110011101101000

Código
  1. /* Ejemplo de codigo para convertir texto a binario */
  2.  
  3. const text = "abcdefgh";
  4. let end = "";
  5. for (let i in text) {
  6.  let aux = text[i].charCodeAt(0).toString(2)
  7.  if (aux.length < 8) {
  8.    aux = "0".repeat(8 - aux.length) + aux;
  9.  }
  10.  end += aux + " ";
  11. }
  12. console.log(end);

El algoritmo de DES ignora un bit por cada byte de la clave. Se cree que fue una estrategia de la NSA para poder romper el cifrado antes que nadie. Asique el tamaño de clave real utilizado internamente es de 56 bits aunque la entrada requiera de 64 bits.

- El algoritmo de DES usa tablas predefindas recurrentemente para realizar permutaciones. Se conocen como PC (Permuted Choice)

La primera tabla de permutación de DES es la siguiente (PC-1):
Cita de: PC-1
57, 49, 41, 33, 25, 17, 9,
1, 58, 50, 42, 34, 26, 18,
10, 2, 59, 51, 43, 35, 27,
19, 11, 3, 60, 52, 44, 36,
63, 55, 47, 39, 31, 23, 15,
7, 62, 54, 46, 38, 30, 22,
14, 6, 61, 53, 45, 37, 29,
21, 13, 5, 28, 20, 12, 4

Esta tabla nos indica la posición que debemos elegir de nuestra clave para generar la clave permutada de 56 bits a partir de la de 64 bits.

Nuestro binario es:
0110000101100010011000110110010001100101011001100110011101101000

Vamos a elegir el bit de la posición 57, después el que se encuentre en la posición 49 y así hasta finalizar toda la tabla.

Cita de: Permutaciones
57 -> 0
49 -> 0
41 -> 0
33 -> 0
25 -> 0
17 -> 0
9  -> 0

1  -> 0
58 -> 1
50 -> 1
42 -> 1
34 -> 1
26 -> 1
18 -> 1

10 -> 1
2  -> 1
59 -> 1
51 -> 1
43 -> 1
35 -> 1
27 -> 1

19 -> 1
11 -> 1
3  -> 1
60 -> 0
52 -> 0
44 -> 0
36 -> 0

63 -> 0
55 -> 1
47 -> 1
39 -> 0
31 -> 0
23 -> 1
15 -> 1

7  -> 0
62 -> 0
54 -> 1
46 -> 1
38 -> 1
30 -> 1
22 -> 0

14 -> 0
6  -> 0
61 -> 1
53 -> 0
45 -> 0
37 -> 0
29 -> 0

21 -> 0
13 -> 0
5  -> 0
28 -> 0
20 -> 0
12 -> 0
4  -> 0

Y aquí tenemos nuestra clave permutada de 56 bits con PC-1:
0000000
0111111
1111111
1110000
0110011
0011110
0010000
0000000

- El siguiente paso es divir la clave por la mitad en 2 trozos de 28 bits cada uno:
0000000
0111111
1111111
1110000

0110011
0011110
0010000
0000000

- El siguiente paso es aplicar una operación de cambio de bits hacia la izquierda a cada uno de los trozos para crear 2 grupos formados por 16 secuencias de bits cambiados.

La operación de cambio de bits hacia la izquiera se realiza moviendo cada bit hacia la izquierda pasando el que se encuentra en la primera posición al final del todo. Por ejemplo si tenemos la secuencia de bits 1101:
0° -> 1101
1° -> 1011
2° -> 0111
3° -> 1110
4° ...
5° ...

No todas las iteraciones tienen la misma cantidad de cambio de bits.
El número de bits por iteración que tenemos que desplazar hacia la izquierda es el siguiente:
Cita de: Bits desplazados por cada iteración
1°  -> 1 bit
2°  -> 1 bit
3°  -> 2 bits
4°  -> 2 bits
5°  -> 2 bits
6°  -> 2 bits
7°  -> 2 bits
8°  -> 2 bits
9°  -> 1 bit
10° -> 2 bits
11° -> 2 bits
12° -> 2 bits
13° -> 2 bits
14° -> 2 bits
15° -> 2 bits
16° -> 1 bit


El resultado es:

Cita de: Grupo 1: (Primera mitad de 28 bits)
0°  -> 0000000011111111111111110000
1°  -> 0000000111111111111111100000
2°  -> 0000001111111111111111000000
3°  -> 0000111111111111111100000000
4°  -> 0011111111111111110000000000
5°  -> 1111111111111111000000000000
6°  -> 1111111111111100000000000011
7°  -> 1111111111110000000000001111
8°  -> 1111111111000000000000111111
9°  -> 1111111110000000000001111111
10° -> 1111111000000000000111111111
11° -> 1111100000000000011111111111
12° -> 1110000000000001111111111111
13° -> 1000000000000111111111111111
14° -> 0000000000011111111111111110
15° -> 0000000001111111111111111000
16° -> 0000000011111111111111110000

Cita de: Grupo 2: (Segunda mitad de 28 bits)
0°  -> 0110011001111000100000000000
1°  -> 1100110011110001000000000000
2°  -> 1001100111100010000000000001
3°  -> 0110011110001000000000000110
4°  -> 1001111000100000000000011001
5°  -> 0111100010000000000001100110
6°  -> 1110001000000000000110011001
7°  -> 1000100000000000011001100111
8°  -> 0010000000000001100110011110
9°  -> 0100000000000011001100111100
10° -> 0000000000001100110011110001
11° -> 0000000000110011001111000100
12° -> 0000000011001100111100010000
13° -> 0000001100110011110001000000
14° -> 0000110011001111000100000000
15° -> 0011001100111100010000000000
16° -> 0110011001111000100000000000

- Lo siguiente es agruparlos juntos:
Cita de: Agrupados
1°  -> 0000000111111111111111100000 1100110011110001000000000000
2°  -> 0000001111111111111111000000 1001100111100010000000000001
3°  -> 0000111111111111111100000000 0110011110001000000000000110
4°  -> 0011111111111111110000000000 1001111000100000000000011001
5°  -> 1111111111111111000000000000 0111100010000000000001100110
6°  -> 1111111111111100000000000011 1110001000000000000110011001
7°  -> 1111111111110000000000001111 1000100000000000011001100111
8°  -> 1111111111000000000000111111 0010000000000001100110011110
9°  -> 1111111110000000000001111111 0100000000000011001100111100
10° -> 1111111000000000000111111111 0000000000001100110011110001
11° -> 1111100000000000011111111111 0000000000110011001111000100
12° -> 1110000000000001111111111111 0000000011001100111100010000
13° -> 1000000000000111111111111111 0000001100110011110001000000
14° -> 0000000000011111111111111110 0000110011001111000100000000
15° -> 0000000001111111111111111000 0011001100111100010000000000
16° -> 0000000011111111111111110000 0110011001111000100000000000

Y aplicar otra permutación con una nueva tabla (PC-2) para obtener 48 bits a partir de estos 56 que tenemos.
La tabla PC-2 es:
Cita de: PC-2
14, 17, 11, 24, 1, 5,
3, 28, 15, 6, 21, 10,
23, 19, 12, 4, 26, 8,
16, 7, 27, 20, 13, 2,
41, 52, 31, 37, 47, 55,
30, 40, 51, 45, 33, 48,
44, 49, 39, 56, 34, 53,
46, 42, 50, 36, 29, 32

Hay que aplicar esta tabla a cada uno de los 16 grupos para obtener un total de 16 claves de 48 bits cada una. Se hace igual que la primera permutación anteriormente mostrada con la tabla PC-1.

1°  -> 00000001111111111111111000001100110011110001000000000000

Cita de: Permutaciones
14 -> 1
17 -> 1
11 -> 1
24 -> 0
1  -> 0
5  -> 0

3  -> 0
28 -> 0
15 -> 1
6  -> 0
21 -> 1
10 -> 1

23 -> 1
19 -> 1
12 -> 1
4  -> 0
26 -> 0
8  -> 1

16 -> 1
7  -> 0
27 -> 0
20 -> 1
13 -> 1
2  -> 0

41 -> 0
52 -> 0
31 -> 0
37 -> 1
47 -> 0
55 -> 0

30 -> 1
40 -> 1
51 -> 0
45 -> 0
33 -> 1
48 -> 0

44 -> 1
49 -> 0
39 -> 1
56 -> 0
34 -> 1
53 -> 0

46 -> 0
42 -> 0
50 -> 0
36 -> 0
29 -> 1
32 -> 0

1°:
111000  
001011
111001
100110
000100
110010
101010
000010

Tienes que repetir este paso para el resto de las 16 secuencias. El proceso de los 15 restantes es omitido por brevedad, solo se mostrarán los resultados directamente.

Aquí el código que hice para no tener que realizarlas a mano:

Código
  1. /* PC a binario */
  2. const pc = (bin, table) => {
  3.  let result = "";
  4.  for(let i = 0; i < table.length; ++i) {
  5.    result += bin[table[i] - 1];
  6.  }
  7.  
  8.  return result;
  9. }
  10.  
  11.  
  12. const BIN = "00000001111111111111111000001100110011110001000000000000";
  13. const DES_PC2 = [
  14.  14, 17, 11, 24, 1, 5,
  15.  3, 28, 15, 6, 21, 10,
  16.  23, 19, 12, 4, 26, 8,
  17.  16, 7, 27, 20, 13, 2,
  18.  41, 52, 31, 37, 47, 55,
  19.  30, 40, 51, 45, 33, 48,
  20.  44, 49, 39, 56, 34, 53,
  21.  46, 42, 50, 36, 29, 32
  22. ];
  23.  
  24. const res = pc(BIN, DES_PC2);
  25. console.log(res);
  26. /* FIN DEL CÓDIGO */

Para calcular todas las secuencias, el código que añadí es:
Código
  1. /* Calcula las 16 secuencias con PC-2 */
  2. const BINS = [
  3.  "00000001111111111111111000001100110011110001000000000000",
  4.  "00000011111111111111110000001001100111100010000000000001",
  5.  "00001111111111111111000000000110011110001000000000000110",
  6.  "00111111111111111100000000001001111000100000000000011001",
  7.  "11111111111111110000000000000111100010000000000001100110",
  8.  "11111111111111000000000000111110001000000000000110011001",
  9.  "11111111111100000000000011111000100000000000011001100111",
  10.  "11111111110000000000001111110010000000000001100110011110",
  11.  "11111111100000000000011111110100000000000011001100111100",
  12.  "11111110000000000001111111110000000000001100110011110001",
  13.  "11111000000000000111111111110000000000110011001111000100",
  14.  "11100000000000011111111111110000000011001100111100010000",
  15.  "10000000000001111111111111110000001100110011110001000000",
  16.  "00000000000111111111111111100000110011001111000100000000",
  17.  "00000000011111111111111110000011001100111100010000000000",
  18.  "00000000111111111111111100000110011001111000100000000000"
  19. ];
  20.  
  21. for (let i in BINS) {
  22.  console.log( pc(BINS[i], DES_PC2) )
  23. }
  24. /* FIN DEL CÓDIGO */

Y el resultado es:
1°  -> 111000001011111001100110000100110010101010000010
2°  -> 111000001011011001110110000100000010001100000111
3°  -> 111001001101011001110110101101100000000010000100
4°  -> 111001101101001101110010010000000010001111000011
5°  -> 101011101101001101110011001101101010000000001001
6°  -> 101011110101001101011011011000100001010101000010
7°  -> 001011110101001111011001000011001010000100101010
8°  -> 000111110101100111011001011001000101110001000000
9°  -> 000111110100100111011001010010101001100001000000
10° -> 000111110110100110011101110000001100010100111000
11° -> 000111110010110110001101000010010001111000001000
12° -> 010110110010110010101101110110000101000000110000
13° -> 110110011010110010101100000000010100101000101100
14° -> 110100001010111010101110100100000011100010010000
15° -> 111100001011111000100110101000010000001000110101
16° -> 111100001011111000100110101000110100001010000000


- En DES el mensaje que quieres encryptar debe ser dividido en bloques de 64 bits.

Para el mensaje debemos realizar una permutación inicial con una nueva tabla IP (Initial Permutation):
Cita de: IP
58, 50, 42, 34, 26, 18, 10, 2,
60, 52, 44, 36, 28, 20, 12, 4,
62, 54, 46, 38, 30, 22, 14, 6,
64, 56, 48, 40, 32, 24, 16, 8,
57, 49, 41, 33, 25, 17, 9, 1,
59, 51, 43, 35, 27, 19, 11, 3,
61, 53, 45, 37, 29, 21, 13, 5,
63, 55, 47, 39, 31, 23, 15, 7

Usaré el mensaje "hello world" como ejemplo:
h -> 01101000
e -> 01100101
l -> 01101100
l -> 01101100
o -> 01101111
  -> 00100000
w -> 01110111
o -> 01101111
r -> 01110010
l -> 01101100
d -> 01100100

En bloques de 64 bits es:
0110100001100101011011000110110001101111001000000111011101101111
011100100110110001100100

Aquí tenemos un bloque de 64 bits y otro de 24.
Para no complicar el proceso con el padding, rellenaré de ceros el resto del bloque hasta alcanzar los 64 bits.
0110100001100101011011000110110001101111001000000111011101101111
0111001001101100011001000000000000000000000000000000000000000000

Ahora se aplica la tabla de permutación inicial (IP) a cada bloque:
B1 -> 1101111101000000110111101101001000000000111111111001110111010000
B2 -> 0000011100000001000001100000000000000000000001110000001000000001


- Ahora se divide cada bloque a la mitad (32 bits).

L  -> 11011111010000001101111011010010
R -> 00000000111111111001110111010000

(Este segundo bloque lo ignoraremos, porque hay distintas formas de combinar bloques, que esto ya no entra dentro de lo que es el propio algoritmo de DES y necesitaría una entrada propia)
L  -> 00000111000000010000011000000000
R -> 00000000000001110000001000000001

- El siguiente paso es utilizar una función que toma como entradas una clave de 48 bits y un texto de 32 bits, para generar una salida de 32 bits.
Usaremos las 16 claves de 48 bits que computamos en los pasos anteriores y los trozos de 32 bits que acabamos de hacer partiendo el mensaje en 2. Necesitamos aplicar las 16 claves a cada mitad usando una función.

Las claves que ya teníamos:
1°  -> 111000001011111001100110000100110010101010000010
2°  -> 111000001011011001110110000100000010001100000111
3°  -> 111001001101011001110110101101100000000010000100
4°  -> 111001101101001101110010010000000010001111000011
5°  -> 101011101101001101110011001101101010000000001001
6°  -> 101011110101001101011011011000100001010101000010
7°  -> 001011110101001111011001000011001010000100101010
8°  -> 000111110101100111011001011001000101110001000000
9°  -> 000111110100100111011001010010101001100001000000
10° -> 000111110110100110011101110000001100010100111000
11° -> 000111110010110110001101000010010001111000001000
12° -> 010110110010110010101101110110000101000000110000
13° -> 110110011010110010101100000000010100101000101100
14° -> 110100001010111010101110100100000011100010010000
15° -> 111100001011111000100110101000010000001000110101
16° -> 111100001011111000100110101000110100001010000000

El algoritmo que necesitamos utilizar es:
Código
  1. L[n] = R[n - 1]
  2. R[n] = L[n - 1] XOR F(R[n - 1], K[n])
L es el trozo izquierdo del bloque recientemente permutado
R es el trozo derecho del bloque recientemente permutado
XOR es una operación de Bits (Disyunción Exclusiva en Español).
F es una función con múltiples pasos que se detallará en seguida.
K es la clave.
n es la iteración/ronda.


Algoritmo para n = 1 (la primera vez que aplicas el algoritmo):
Código
  1. n = 1;
  2. L[1] = R[0];
  3. R[1] = L[0] XOR F(R[0], K[1]);

Código
  1. n = 1:
  2. R[0] = 00000000111111111001110111010000;
  3. L[1] = R[0]
  4. R[1] = 11011111010000001101111011010010 + F(00000000111111111001110111010000, 111000001011111001100110000100110010101010000010)

- Ahora vamos a empezar con la función F:

La función F utiliza una tabla de permutaciones (E) para expandir R[n - 1] de 32 bits a 48 bits.
Cita de: E
32, 1, 2, 3, 4, 5,
4, 5, 6, 7, 8, 9,
8, 9, 10, 11, 12, 13,
12, 13, 14, 15, 16, 17,
16, 17, 18, 19, 20, 21,
20, 21, 22, 23, 24, 25,
24, 25, 26, 27, 28, 29,
28, 29, 30, 31, 32, 1

En esta primera ronda, R[0] es 00000000111111111001110111010000

Tras expandir R[0] usando la tabla (E) para realizar la permutación, se obtiene:
000000000001011111111111110011111011111010100000

- El siguiente paso de la función es realizar un XOR entre R[0] expandido y K[1] (La primera clave)
000000000001011111111111110011111011111010100000 XOR 111000001011111001100110000100110010101010000010 -> 111000001010100110011001110111001001010000100010

El siguiente paso de F incluye el uso de S-Boxes (cajas de substitución).
Primero, hay que dividir el resultado de la clave xoreada con la mitad expandida del mensaje permutado en grupos de 6 bits:
111000 001010 100110 011001 110111 001001 010000 100010

La primera S-Box (S1) es:
Cita de: S1
14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
  0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
  4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
  15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13

La S-Box es como un mapa de coordenadas. Hay que elegir el primer y el último bit de cada grupo de 6 bits para obtener la coluna y los bits restantes (en el medio) se utilizan para elegir la fila.
En el caso de 111000:
Primer y último bit -> 10
Bits del medio -> 1100

Los pasamos a decimal:
10 -> 2
1100 -> 12

Y ahora empleamos estos 2 números como guía para obtener el decimotercero número de la tercera columna (Las columnas y filas empiezan a contar en 0).

El número que obtenemos es el 3.
3 -> 0011

Es decir, usando la S-Box con 111000 como entrada, obtenemos como salida 0011.

Ahora tenemos que repetir lo mismo para el resto de grupos de 6 bits, PERO necesitamos utilizar una S-Box distinta para cada grupo.

Cita de: Las 8 S-Boxes (una para cada grupo de 6 bits)
 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
  0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
  4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
  15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13
  
  15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
  3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
  0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
  13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9
  
  10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
  13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
  13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
  1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12
  
  7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
  13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
  10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
  3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14
      
  2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
  14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
  4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
  11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3
  
  12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
  10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
  9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
  4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13
  
  4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
  13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
  1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
  6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12
  
  13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
  1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
  7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
  2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11

Aquí el código que utilicé para generar todos los bits, utilizando los grupos y las cajas de substitución:
Código
  1. const transformSboxes = (groups, sboxes) => {
  2.  const ret = [];
  3.  for (let i in groups) {
  4.    const column = parseInt(groups[i][0] + groups[i][5], 2);
  5.    const field = parseInt(groups[i].substring(1, 5), 2);
  6.    let res = sboxes[i][column][field].toString(2);
  7.    if (res.length < 4) {
  8.      res = "0".repeat(4 - res.length) + res;
  9.    }
  10.    ret.push(res);
  11.  }
  12.  
  13.  return ret;
  14. }
  15.  
  16. const groups = [
  17.  "111000",
  18.  "001010",
  19.  "100110",
  20.  "011001",
  21.  "110111",
  22.  "001001",
  23.  "010000",
  24.  "100010"
  25. ]
  26.  
  27. const sBox = [
  28.  
  29.  [
  30.    [14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7],
  31.    [0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8],
  32.    [4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0],
  33.    [15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13]               ],
  34.  
  35.  [
  36.    [15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10],
  37.    [3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5],
  38.    [0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15],
  39.    [13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9]
  40.  ],
  41.  
  42.  [
  43.    [10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8],
  44.    [13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1],
  45.    [13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7],
  46.    [1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12]
  47.  ],
  48.  
  49.  
  50.  [
  51.    [7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15],
  52.    [13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9],
  53.    [10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4],
  54.    [3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14]
  55.  ],
  56.  
  57.  [
  58.    [2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9],
  59.    [14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6],
  60.    [4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14],
  61.    [11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3]
  62.  ],
  63.  
  64.  [
  65.    [12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11],
  66.    [10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8],
  67.    [9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6],
  68.    [4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13]
  69.  ],
  70.  
  71.  [
  72.    [4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1],
  73.    [13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6],
  74.    [1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2],
  75.    [6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12]
  76.  ],
  77.  
  78.  [
  79.    [13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7],
  80.    [1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2],
  81.    [7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8],
  82.    [2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11]
  83.  ]
  84. ];
  85.  
  86.  
  87. const res = transformSboxes(groups, sBox);
  88. console.log(res);
  89. /* END CODE */

Resultado:
0011 1011 1001 0001 1001 0111 0011 1011

De momento tenemos:
R[1] = 11011111010000001101111011010010 XOR F(0011 1011 1001 0001 1001 0111 0011 1011)

El último paso de la función es otra permutación:
Cita de: P
16, 7, 20, 21,
29, 12, 28, 17,
1, 15, 23, 26,
5, 18, 31, 10,
2, 8, 24, 14,
32, 27, 3, 9,
19, 13, 30, 6,
22, 11, 4, 25

El resultado de F es 11101111001010100110111100001010

Ahora tenemos que hacer xor a L[0] y al resultado de F para obtener R[1]:
R[1] = 11011111010000001101111011010010 XOR 11101111001010100110111100001010
R[1] -> 00110000011010101011000111011000

Ya finalizamos la primera ronda para n = 1. Recuerda:
Cita de: Algoritmo para n = 1
n = 1
L[1] = R[0]
R[1] = L[0] XOR F(R[0], K[1])

Ahora hay que realizar los mismos pasos para n = 2:
Cita de: Algoritmo para n = 2
n = 2
L[2] = R[1]
R[2] = L[1] XOR F(R[1], K[2])

Cuando finalizes todas las rondas (16), tendrás L[16] y R[16] (32 bits cada uno)
Solo te faltará darle la vuelta al orden. Ejemplo
Si L[16] es 00110000011010101011000111011000 y R[16] es 10110000011010101011000111011001 tendrás:
1011000001101010101100011101100100110000011010101011000111011000

Y aplicas la última permutación
Cita de: P-1
40, 8, 48, 16, 56, 24, 64, 32,
39, 7, 47, 15, 55, 23, 63, 31,
38, 6, 46, 14, 54, 22, 62, 30,
37, 5, 45, 13, 53, 21, 61, 29,
36, 4, 44, 12, 52, 20, 60, 28,
35, 3, 43, 11, 51, 19, 59, 27,
34, 2, 42, 10, 50, 18, 58, 26,
33, 1, 41, 9, 49, 17, 57, 25

El resultado es tu mensaje cifrado con DES.

Para descifrar es exactamente lo mismo.


« Última modificación: 6 Febrero 2022, 09:50 am por @XSStringManolo » En línea

Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines