Alters

Secure Hash Algorithm 1 (SHA) - Parte II

Hola a todos!

De nuevo por aquí... con noticias frescas :D

Estoy haciendo un ejercicio para la uni que consiste en desarrollar el algoritmo ELGAMAL en Java, así que... ya sabéis que lo compartiré con vosotros (una vez lo tenga, y una vez acabe esta saga)

Hoy, no obstante, nos toca hablar un poquillo de algunos conceptos básicos.

Vamos allá!




En esta entrada nos toca hablar de los conceptos básicos del algoritmo. Tenemos un concepto que está "fuera" del algoritmo (la conversión entre bases), y luego bastantes funciones lógicas que me gustaría revisar con vosotros.

Conversión entre bases

El uso del algoritmo se basa en una entrada binaria, pero vamos a ser civilizados y permitir la entrada en ASCII (el texto que todos sabemos interpretar), ¿no?

Ya que estamos trabajando en COBOL, vamos a trabajar la conversión entre bases directamente desde COBOL.

Existe una función intrínseca (ORD) que da el valor decimal del caracter que se le pasa, pero vamos a jugar con otro concepto más interesante.

[code lan=cobol] 05 TEXTO-RAW PIC X(256) VALUE SPACES. 05 TEXTO REDEFINES TEXTO-RAW OCCURS 256 PIC X(01). 05 CHAR-BLOCK 10 FILLER PIC X(01). 10 CHAR PIC X(01). 05 HEX-CHAR REDEFINES CHAR-BLOCK PIC 9(04) BINARY. 05 NUM-CHAR PIC 9(03). PERFORM VARYING INDICE FROM 1 BY 1 UNTIL INDICE > LONGITUD MOVE TEXTO(INDICE) TO CHAR MOVE HEX-CHAR TO NUM-CHAR SUBTRACT 192 FROM NUM-CHAR END-PERFORM [/code]

¿Qué está pasando aquí?

Tenemos el texto en TEXTO-RAW, y lo redefinimos como un array de 256 posiciones.
Por cada posición del texto, lo movemos a CHAR, pero ¡ojo!, CHAR es en realidad un bloque de 2 bytes. Este bloque de 2 bytes está redefinido como un bloque de 4 numeros binarios, es decir, 2 bytes (ya que COBOL trabaja en BCD y un número definido como BINARY ocupa la mitad)

Finalmente, movemos a un numérico de 3, ya que el ASCII máximo es 256 (FF).

El quitarle 192 es debido a que COBOL trabaja con EDIBDC y lo más común es ASCII (con esta resta se cuadran las COLLATION).

Con esto, tenemos nuestro carácter ASCII en un decimal de 3 posiciones, pero buscamos un binario!

Así que el siguiente paso es pasar este decimal a hexadecimal, y finalmente a binario.

Para pasar a HEX, creamos una tabla de 256 registros que contenga una base de conversión, y, usando el valor decimal como índice, obtenemos la clave en HEX (es un poco chapuza, pero es lo más rápido).

Finalmente, pasamos a binario:

[code lan=cobol] DIVIDE 16 INTO NUM-CHAR GIVING HEX-VAL-1 REMAINDER HEX-VAL-2 [/code]

Esto nos dejará en HEX-VAL-1 el correspondiente primer carácter HEX, y en HEX-VAL-2 el segundo.

Usamos otra tabla de conversión para sacar el valor binario y ya lo tenemos.

Y con esto terminamos el cambio de base (tranquilos, más adelante se verá cómo es todo en conjunto.


Funciones y operaciones lógicas

Las funciones que vamos a ver serán:

AND, OR, NOT, XOR, S^L / S^R, Suma binaria

Antes de empezar, un pequeño concepto... el contador de acarreo. Este contador es un flag que se activa en nuestro microprocesador cuando "nos llevamos una", y tiene importancia para estas operaciones.

Estas operaciones (a excepción de las dos últimas y el NOT) se realizan sobre pares de bits, así que tenemos cuatro posibles entradas:

  • 0 + 0 = 0, acc = 0
  • 0 + 1 = 1, acc = 0
  • 1 + 0 = 1, acc = 0
  • 1 + 1 = 1, acc = 1

Entonces, la función AND devuelve un resultado positivo siempre que el acc es 1; la función OR devuelve positivo cuando el resultado es 1, y XOR es positivo si el resultado es 1 y no hay acc (o bien si ((a OR b) AND (NOT acc))

La función NOT es la más fácil, devuelve 0 si entra 1, y 1 si entra 0.

Las funciones S^L y S^R, también conocidas como "Left Shift (movimiento izquierda)" y "Right Shift (movimiento derecha)" se basa en desplazar un bloque de bits, de la siguiente manera:

S^L1(00110010) = 01100100

En un S^Ln, se mueven los "n" bits de la izquierda hacia el final; en un S^Rn se mueven los de la derecha.

Finalmente, la suma binaria es casi como una suma convencional, pero siempre dentro del módulo del binario máximo dentro del rango. 

¿LO QUÉ?

Un ejemplo será más claro. Imaginemos que jugamos con registros de 4 bits

0101 y 1100

Su suma sería (juntando por colores, de derecha a izquierda):

1 + 0 = 1
0 + 0 = 0
1 + 1 = 1 acc 1
0 + 1 = 1
1 + 1 (acc) = 1 acc 1

11101

En este caso, nos estamos saliendo del módulo del mayor binario máximo (1111), así que se tiene que aplicar el módulo

¿Cómo?

Mágicamente (broma), basta con no quedarnos con el acc, es decir... 1101. Más adelante os enseñaré por qué pasa esto!

En fin, esta entrada se queda un poco larga, así que me callo ya...


¡hasta la próxima!