La función hash GOST , definida en los estándares GOST R 34.11-94 y GOST 34.311-95 es una función hash criptográfica de 256 bits . Inicialmente se definió en el estándar nacional ruso GOST R 34.11-94 Tecnología de la información - Seguridad de la información criptográfica - Función hash . El estándar equivalente utilizado por otros estados miembros de la CEI es GOST 34.311-95.
General | |
---|---|
Diseñadores | FAPSI y VNIIstandart ( URSS ) |
Publicado por primera vez | 1994-05-23 (desclasificado) |
Derivado de | Cifrado de bloque GOST |
Sucesores | Streebog |
Certificación | Estándar GOST |
Detalle | |
Tamaños de resumen | 256 bits |
Rondas | 32 |
Mejor criptoanálisis público | |
Un ataque de 2008 rompe la función hash completa. El artículo presenta un ataque de colisión en 2 105 veces y ataques de preimagen en 2 192 veces. [1] |
Esta función no debe confundirse con una función hash de Streebog diferente , que se define en la nueva revisión del estándar 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 en una salida de longitud fija de 256 bits. El mensaje de entrada se divide en trozos de bloques de 256 bits (ocho enteros little endian de 32 bits ); el mensaje se rellena añadiéndole tantos ceros como sean necesarios para que la longitud del mensaje sea de hasta 256 bits. Los bits restantes se completan con una suma aritmética de números enteros de 256 bits de todos los bloques hash previamente y luego un número entero de 256 bits que representa la longitud del mensaje original, en bits.
Notación básica
Las descripciones de los algoritmos utilizan las siguientes notaciones:
- - bloque de j bits lleno de ceros.
- - longitud del bloque M en bits módulo 2256 .
- - concatenación de dos bloques.
- - suma aritmética de dos bloques módulo 2256
- - xor lógico de dos bloques
Además, consideramos que el bit de orden pequeño se encuentra a la izquierda de un bloque y el bit de orden superior a la derecha.
Descripción
El mensaje de entrada se divide en bloques de 256 bits . En el caso del último bloque contiene menos de 256 bits, se antepone a la izquierda con cero bits para lograr la longitud deseada.
Cada bloque es procesado por la función de hash de pasos. , dónde , , son bloques de 256 bits.
Cada bloque de mensajes, comenzando el primero, es procesado por la función de hash de pasos. , para calcular el valor hash intermedio
La El valor puede ser elegido arbitrariamente, y por lo general es .
Después se calcula, 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:
La 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 (mientras ):
- - aplicar la función hash de paso
- - recalcular la longitud del mensaje
- - calcular la suma de control
- Función de compresión de la iteración final:
- - calcular la longitud total del mensaje en bits
- - rellenar el último mensaje con ceros
- - actualización de la suma de control
- - procesar el último bloque de mensajes
- - MD: fortalece mediante el hash de la longitud del mensaje
- - suma de control hash
- El valor de salida es .
Función hash de paso
La función de hash de paso mapea dos bloques de 256 bits en uno: . Consta de tres partes:
- Generación de claves
- Transformación cifrada usando llaves
- Transformación aleatoria
Generación de claves
El algoritmo de generación de claves utiliza:
- Dos transformaciones de bloques de 256 bits:
- Transformación , dónde son de 64 bits sub-bloques de Y .
- Transformación , dónde , y son de 8 bits sub-bloques de Y .
- Tres constantes:
- C 2 = 0
- C 3 = 0xff00ffff000000ffff0000ff00ffff0000ff00ff00ff00ffff00ff00ff00ff00
- C 4 = 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 usando GOST 28147-89 en el modo de sustitución simple de teclas. Denotemos la transformación de cifrado como E (Nota: la transformación E cifra datos de 64 bits con una clave de 256 bits). Para cifrar, 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, la transformación aleatoria se aplica a , S y m usando un registro de desplazamiento de retroalimentación lineal . En el resultado, el valor hash intermedio es obtenido.
Primero definimos la función ψ, haciendo LFSR en un bloque de 256 bits:, dónde son de 16 bits sub-bloques de la Y .
La transformación aleatoria es , dónde denota una i-ésima potencia de la función.
Valores iniciales
Hay dos conjuntos de parámetros iniciales de uso común para GOST R 34.11 94. El vector inicial para ambos conjuntos es
= 0x00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000.
Aunque el estándar GOST R 34.11 94 en sí mismo no especifica el valor inicial del algoritmo y caja S de la transformación de cifrado, pero utiliza los siguientes "parámetros de prueba" en las secciones de muestras. [3]
Caja S "Parámetros de prueba"
RFC 5831 especifica solo estos parámetros, pero RFC 4357 los denomina "parámetros de prueba" y no los recomienda para su uso en aplicaciones de producción.
Número de caja S | Valor | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 4 | 10 | 9 | 2 | 13 | 8 | 0 | 14 | 6 | 11 | 1 | 12 | 7 | 15 | 5 | 3 |
2 | 14 | 11 | 4 | 12 | 6 | 13 | 15 | 10 | 2 | 3 | 8 | 1 | 0 | 7 | 5 | 9 |
3 | 5 | 8 | 1 | 13 | 10 | 3 | 4 | 2 | 14 | 15 | 12 | 7 | 6 | 0 | 9 | 11 |
4 | 7 | 13 | 10 | 1 | 0 | 8 | 9 | 15 | 14 | 4 | 6 | 12 | 11 | 2 | 5 | 3 |
5 | 6 | 12 | 7 | 1 | 5 | 15 | 13 | 8 | 4 | 10 | 9 | 14 | 0 | 3 | 11 | 2 |
6 | 4 | 11 | 10 | 0 | 7 | 2 | 1 | 13 | 3 | 6 | 8 | 5 | 9 | 12 | 15 | 14 |
7 | 13 | 11 | 4 | 1 | 3 | 15 | 5 | 9 | 0 | 10 | 14 | 7 | 6 | 8 | 2 | 12 |
8 | 1 | 15 | 13 | 0 | 5 | 7 | 10 | 4 | 9 | 2 | 3 | 14 | 6 | 11 | 8 | 12 |
Caja S CryptoPro
El CryptoPro S-box 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.
Número de caja S | Valor | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 10 | 4 | 5 | 6 | 8 | 1 | 3 | 7 | 13 | 12 | 14 | 0 | 9 | 2 | 11 | 15 |
2 | 5 | 15 | 4 | 0 | 2 | 13 | 11 | 9 | 1 | 7 | 6 | 3 | 12 | 14 | 10 | 8 |
3 | 7 | 15 | 12 | 14 | 9 | 4 | 1 | 0 | 3 | 11 | 5 | 2 | 6 | 10 | 8 | 13 |
4 | 4 | 10 | 7 | 12 | 0 | 15 | 2 | 8 | 14 | 1 | 6 | 5 | 13 | 11 | 9 | 3 |
5 | 7 | 6 | 4 | 11 | 9 | 12 | 2 | 10 | 1 | 8 | 0 | 14 | 15 | 13 | 3 | 5 |
6 | 7 | 6 | 2 | 4 | 13 | 9 | 15 | 0 | 10 | 1 | 5 | 11 | 8 | 14 | 12 | 3 |
7 | 13 | 14 | 4 | 1 | 7 | 0 | 5 | 10 | 3 | 12 | 8 | 15 | 6 | 2 | 9 | 11 |
8 | 1 | 3 | 10 | 9 | 5 | 11 | 4 | 15 | 8 | 6 | 7 | 14 | 13 | 0 | 2 | 12 |
Criptoanálisis
En 2008, se publicó un ataque que rompe la función hash GOST completa. El artículo presenta un ataque de colisión en 2 105 veces y un primer y segundo ataque de preimagen en 2 192 veces (2 n tiempo se refiere al número aproximado de veces que se calculó el algoritmo en el ataque). [1]
Vectores de prueba de hash GOST
Hashes para "parámetros de prueba"
Los hash GOST de 256 bits (32 bytes) se representan normalmente como números hexadecimales de 64 dígitos. Aquí están los vectores de prueba para el hash GOST con "parámetros de prueba"
GOST ( "El rápido zorro marrón salta sobre el perezoso d og") = 77b7fa410c9ac58a25f49bca7d0468c9296529315eaca76bd1a10f376d1f4294
Incluso un pequeño cambio en el mensaje, con una probabilidad abrumadora, dará como resultado un hash completamente diferente debido al efecto de avalancha . Por ejemplo, cambiando d a c :
GOST ("El rápido zorro marrón salta sobre el perezoso c og") = a3ebc4daaab78b0be131dab5737a7f67e602670d543521319150d2e14eeec445
Dos muestras procedentes del estándar GOST R 34.11-94: [3]
GOST ("Este es un mensaje, longitud = 32 bytes") = b1c466d37519b82e8319819ff32595e047a28cb6f83eff1c6916a815a637fffaGOST ("Suponga que el mensaje original tiene una longitud = 50 bytes") = 471aba57a60a770d3a76130635c1fbea4ef14de51f78b4ae57dd893b62f55208
Más vectores de prueba:
GOST ("") = ce85b99cc46752fffee35cab9a7b0278abb4c2d2055cff685af4912c49490f8dGOST ("a") = d42c539e367c66e9c88a801f6649349c21871b4344c6a573f849fdce62f314ddGOST ("resumen del mensaje") = ad4434ecb18f2c99b60cbe59ec3d2469582b65273f48de72db2fde16a4889a4dGOST (128 caracteres de 'U') = 53a3a3ed25180cef0c1d85a074273e551c25660a87062a52d926a9e8fe5733a4GOST (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 ("") = 981e5f3ca30c841487830f84fb433e13ac1101569b9c13584ac483234cd656c0GOST ("a") = e74c52dd282183bf37af0079c9f78055715a103f17e3133ceff1aacf2f403011GOST ("abc") = b285056dbf18d7392d7677369524dd14747459ed8143997e163b2986f92fd42cGOST ("resumen del mensaje") = bc6041dd2aa401ebfa6e9886734174febdb4729aa972d60f549ac39b29721ba0GOST ("El rápido zorro marrón salta sobre el perro perezoso") = 9004294a361a508c586fe53d1f1b02746765e71b765472786e4770d565830a76GOST ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = 73b70a39497de53a6e08c67b6d4db853540f03e9389299d9b0156ef7e85d0f61GOST ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = 6bc7b38989b28cf93ae8842bf9d752905910a7528a61e5bce0782de43e610c90GOST ("Este es un mensaje, longitud = 32 bytes") = 2cefc2f7b7bdc514e18ea57fa74ff357e7fa17d652c75f69cb1be7893ede48ebGOST ("Suponga que el mensaje original tiene una longitud = 50 bytes") = c3730c5cbccacf915ac292676f21e8bd4ef75331d9405e5f1a61dc3130a65011GOST (128 de "U") = 1c4ac7614691bbf427fa2316216be8f10d92edfd37cd1027514c1008f649c4e8GOST (1000000 de "a") = 8693287aa62f9478f7cb312ec0866b6c4e4a0f11160441e8f4ffcd2715dd554f
Ver también
Referencias
- ↑ a b 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 conferencias en Ciencias de la Computación. 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 Streebog Hash
- ^ a b "Estándar 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
|journal=
( ayuda )
Otras lecturas
- "GOST R 34.11-94: Algoritmo de función hash" . IETF. Marzo de 2010.
- "Tecnología de la información. Seguridad de datos criptográficos. Función hash" . 2010-02-20. El texto completo del estándar GOST R 34.11-94 (en ruso).
enlaces externos
- Implementación de C y vectores de prueba para la función hash GOST de Markku-Juhani Saarinen, también contiene borradores de traducciones al inglés de los estándares GOST 28147-89 y GOST R 34.11-94. Versión con corrección de errores, 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 CryptoPro )
- La página Ecrypt de la función Hash de GOST
- Calculadora GOST en línea