Implementación de SHA-256 en Python


Quería implementar SHA-256. Encontré una explicación del algoritmo en el documento PDF (https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf) y lo implementé basándome en eso.

Entorno

  • Python 3.10

Terminología

Primero, repasemos los términos utilizados en el cálculo de SHA-256.

dígito hexadecimal

Un valor de 16 bits que representa 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e. Un dígito hexadecimal puede representarse por una cadena de 4 caracteres (4 bits) que consiste en 0 o 1, por ejemplo, 0010, 1001.

palabra, cadena de bits de w bits
Una secuencia de dígitos hexadecimales. Ejemplos incluyen «abcdef» y «014d23e». Las palabras utilizadas en los cálculos de SHA utilizan el formato big-endian. El tamaño de palabra en SHA-256 es de 32 bits.

Pasos de Implementación

Si bien implementar desde la parte superior del documento en orden puede ser directo, al agregar partes faltantes secuencialmente, es posible que deba volver a funciones implementadas anteriormente. Por lo tanto, lo describiré aquí de manera organizada. Me enfoqué en la simplicidad en lugar de la velocidad o eficiencia e intenté evitar el uso de funciones incorporadas tanto como fuera posible, por lo que hay muchas áreas de mejora. Siguiendo los pasos a continuación, podrás implementar una función para generar SHA-256. (El código se proporciona, pero no hay mucha explicación del código en sí mismo).

  1. Implementación de Funciones Aritméticas
  2. Implementación de Funciones de Conversión
  3. Implementación de Operaciones de Bits
  4. Cálculo de SHA-256

El código completo también está disponible en Gist.