La función hash GOST , definida en las normas GOST R 34.11-94 y GOST 34.311-95, es una función hash criptográfica de 256 bits . Fue definida inicialmente en la norma nacional rusa GOST R 34.11-94 Tecnología de la información – Seguridad de la información criptográfica – Función hash . La norma equivalente utilizada por otros estados miembros de la CEI es GOST 34.311-95.
Esta función no debe confundirse con una función hash de Streebog diferente , que se define en la nueva revisión de la norma GOST R 34.11-2012 . [2]
La función hash GOST se basa en el cifrado de bloque GOST .
Algoritmo
GOST procesa un mensaje de longitud variable y lo convierte en una salida de longitud fija de 256 bits. El mensaje de entrada se divide en fragmentos de bloques de 256 bits (ocho enteros little endian de 32 bits); el mensaje se rellena añadiendo tantos ceros como sean necesarios para que la longitud del mensaje alcance los 256 bits. Los bits restantes se completan con una suma aritmética de enteros de 256 bits de todos los bloques previamente codificados y, a continuación, un entero de 256 bits que representa la longitud del mensaje original, en bits.
Notación básica
Las descripciones del algoritmo utilizan la siguiente notación:
- — bloque j-bit lleno de ceros.
- — longitud del bloque M en bits módulo 2 256 .
- — concatenación de dos bloques.
- — suma aritmética de dos bloques módulo 2 256 .
- — xor lógico de dos bloques.
Además, consideramos que el bit de orden pequeño se ubica a la izquierda de un bloque y el bit de orden alto a la derecha.
Descripción
El mensaje de entrada se divide en bloques de 256 bits . En caso de que el último bloque contenga menos de 256 bits, se antepone a la izquierda un bit cero para lograr la longitud deseada.
Cada bloque es procesado por la función hash escalonada , donde , , son bloques de 256 bits.
Cada bloque de mensaje, comenzando por el primero, es procesado por la función hash escalonada para calcular el valor hash intermedio.
El valor puede elegirse arbitrariamente y normalmente es .
Luego de calculado, el valor hash final se obtiene de la siguiente manera
- , donde L — es la longitud del mensaje M en bits módulo
- , donde K es la suma de control de 256 bits de M:
El es el valor deseado de la función hash del mensaje M.
Entonces el algoritmo funciona de la siguiente manera.
- Inicialización:
- — Valor inicial de 256 bits de la función hash, determinado por el usuario.
- — Suma de control
- — Longitud del mensaje
- Función de compresión de iteraciones internas: para i = 1 … n — 1 haga lo siguiente (while ):
- – aplicar función hash escalonada
- – recalcular la longitud del mensaje
- – calcular la suma de control
- Función de compresión de la iteración final:
- – Calcular la longitud completa del mensaje en bits
- – rellena el último mensaje con ceros
- – actualizar suma de control
- – procesar el último bloque de mensajes
- – MD – Fortalecimiento mediante hash de la longitud del mensaje
- – suma de control de hash
- El valor de salida es .
Función hash escalonada
La función hash de paso asigna dos bloques de 256 bits en uno: .
Consta de tres partes:

- Generación de claves
- Transformación de cifrado mediante claves
- Transformación aleatoria
Generación de claves
El algoritmo de generación de claves utiliza:
- Dos transformaciones de bloques de 256 bits:
- Transformación , donde son subbloques de 64 bits de Y.
- Transformación , donde , y son subbloques de 8 bits de Y .
- Tres constantes:
- C2 = 0
- C 3 = 0xff00ffff000000ffff0000ff00ffff0000ff00ff00ff00ff00ff00ff00ff00ff00
- C4 = 0
El algoritmo:
- Para j = 2, 3, 4 haga lo siguiente:
Transformación cifrada
Después de la generación de claves, el cifrado de se realiza utilizando GOST 28147-89 en el modo de sustitución simple en claves . Denotemos la transformación de cifrado como E (cifrado de datos de 64 bits utilizando una clave de 256 bits). Para el cifrado, el se divide en cuatro bloques de 64 bits: , y cada uno de estos bloques se cifra como:
Después de esto, los bloques de resultados se concatenan en un bloque de 256 bits: .
Transformación aleatoria
En el último paso, se aplica la transformación aleatoria a , S y m mediante un registro de desplazamiento con retroalimentación lineal . Como resultado, se obtiene el valor hash intermedio.
Primero definimos la función ψ, realizando LFSR en un bloque de 256 bits:
- ,
¿Dónde están los subbloques de 16 bits de Y ?
La transformación aleatoria es , donde denota una potencia i-ésima de la función.
Valores iniciales
Hay dos conjuntos de parámetros iniciales que se utilizan comúnmente para GOST R 34.11 94. El vector de inicio para ambos conjuntos es
- = 0x00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 .
Aunque la norma GOST R 34.11 94 en sí no especifica el valor inicial del algoritmo y el S-box de la transformación de cifrado , pero utiliza los siguientes "parámetros de prueba" en las secciones de muestras. [3]
Cuadro S "Parámetros de prueba"
RFC 5831 especifica sólo estos parámetros, pero RFC 4357 los denomina "parámetros de prueba" y no recomienda su uso en aplicaciones de producción.
Caja S de CryptoPro
La S-box de CryptoPro proviene del conjunto de parámetros "listo para producción" desarrollado por la compañía CryptoPro, también se especifica como parte de RFC 4357, sección 11.2.
Criptoanálisis
En 2008 se publicó un ataque que rompe la función hash GOST de ronda completa. El artículo presenta un ataque de colisión en 2 105 veces, y ataques de primera y segunda preimagen en 2 192 veces (2 n veces se refiere al número aproximado de veces que se calculó el algoritmo en el ataque). [1]
Vectores de prueba hash GOST
Hashes para "parámetros de prueba"
Los hashes GOST de 256 bits (32 bytes) normalmente se representan como números hexadecimales de 64 dígitos.
Aquí se muestran los vectores de prueba para el hash GOST con "parámetros de prueba"
GOST("El rápido zorro marrón salta sobre el perro perezoso " ) =
77b7fa410c9ac58a25f49bca7d0468c9296529315eaca76bd1a10f376d1f4294
Incluso un pequeño cambio en el mensaje tendrá como resultado, con una probabilidad abrumadora, un hash completamente diferente debido al efecto avalancha . Por ejemplo, cambiar d por c :
GOST("El rápido zorro marrón salta sobre el perezoso engranaje ") =
a3ebc4daaab78b0be131dab5737a7f67e602670d543521319150d2e14eeec445
Dos muestras procedentes de la norma GOST R 34.11-94: [3]
GOST("Este es un mensaje, longitud=32 bytes") =
b1c466d37519b82e8319819ff32595e047a28cb6f83eff1c6916a815a637fffa
GOST("Suponga que el mensaje original tiene una longitud = 50 bytes") =
471aba57a60a770d3a76130635c1fbea4ef14de51f78b4ae57dd893b62f55208
Más vectores de prueba:
GOST("") =
ce85b99cc46752fffee35cab9a7b0278abb4c2d2055cff685af4912c49490f8d
GOST("a") =
d42c539e367c66e9c88a801f6649349c21871b4344c6a573f849fdce62f314dd
GOST("resumen del mensaje") =
ad4434ecb18f2c99b60cbe59ec3d2469582b65273f48de72db2fde16a4889a4d
GOST( 128 caracteres de 'U' ) =
53a3a3ed25180cef0c1d85a074273e551c25660a87062a52d926a9e8fe5733a4
GOST(1000000 caracteres de 'a') =
5c00ccc2734cdd3332d3d4749576e3c1a7dbaf0e7ea74e9fa602413c90a129fa
Hashes para los parámetros de CryptoPro
El algoritmo GOST con CryptoPro S-box genera diferentes conjuntos de valores hash.
GOST("") = 981e5f3ca30c841487830f84fb433e13ac1101569b9c13584ac483234cd656c0
GOST("a") = e74c52dd282183bf37af0079c9f78055715a103f17e3133ceff1aacf2f403011
GOST("abc") = b285056dbf18d7392d7677369524dd14747459ed8143997e163b2986f92fd42c
GOST("resumen del mensaje") =
bc6041dd2aa401ebfa6e9886734174febdb4729aa972d60f549ac39b29721ba0
GOST("El rápido zorro marrón salta sobre el perro perezoso") =
9004294a361a508c586fe53d1f1b02746765e71b765472786e4770d565830a76
GOST("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =
73b70a39497de53a6e08c67b6d4db853540f03e9389299d9b0156ef7e85d0f61
GOST("12345678901234567890123456789012345678901234567890123456789012345678901234567890") =
6bc7b38989b28cf93ae8842bf9d752905910a7528a61e5bce0782de43e610c90
GOST("Este es un mensaje, longitud=32 bytes") =
2cefc2f7b7bdc514e18ea57fa74ff357e7fa17d652c75f69cb1be7893ede48eb
GOST("Suponga que el mensaje original tiene una longitud = 50 bytes") =
c3730c5cbccacf915ac292676f21e8bd4ef75331d9405e5f1a61dc3130a65011
GOST(128 de "U") = 1c4ac7614691bbf427fa2316216be8f10d92edfd37cd1027514c1008f649c4e8
GOST(1000000 de "a") = 8693287aa62f9478f7cb312ec0866b6c4e4a0f11160441e8f4ffcd2715dd554f
Véase también
Referencias
- ^ ab Mendel, Florian; Pramstaller, Norbert; Rechberger, Christian; Kontak, Marcin; Szmidt, Janusz (2008). "Criptoanálisis de la función hash GOST". En Wagner, David (ed.). Avances en criptología – CRYPTO 2008. Apuntes de clase en informática. Vol. 5157. Alemania : Springer Berlin Heidelberg . págs. 162–178. doi :10.1007/978-3-540-85174-5_10. ISBN 978-3-540-85173-8.
- ^ GOST R 34.11-2012: Función hash de Streebog
- ^ ab "Norma GOST R 34.11-94. Tecnología de la información. Seguridad de datos criptográficos. Función hash. Adición A." 1994.
{{cite journal}}: Requiere citar revista|journal=( ayuda )
Lectura adicional
- Dolmatov, V. (marzo de 2010). Dolmatov, V (ed.). "GOST R 34.11-94: Algoritmo de función hash". IETF. doi : 10.17487/RFC5831 .
{{cite journal}}: Requiere citar revista|journal=( ayuda ) - "Tecnología de la información. Seguridad de datos criptográficos. Función hash". 20 de febrero de 2010.El texto completo de la norma GOST R 34.11-94 (en ruso).
Enlaces externos
- Implementación en C y vectores de prueba para la función hash GOST de Markku-Juhani Saarinen. También contiene traducciones preliminares al inglés de las normas GOST 28147-89 y GOST R 34.11-94. Versión con errores corregidos, consulte [1].
- Implementación de C++ con flujos STL [ enlace muerto permanente ] .
- RHash, una herramienta de línea de comandos de código abierto , que puede calcular y verificar el hash GOST (admite ambos conjuntos de parámetros).
- Implementación de GOST R 34.11-94 en JavaScript (parámetros de CryptoPro)
- Página de cifrado de la función hash de GOST
- Calculadora GOST en línea Archivado el 6 de noviembre de 2014 en Wayback Machine