He estado protagonizando este tema durante aproximadamente tres días, y creo que necesito un segundo par de ojos sobre el problema. Estoy implementando HASH_DRBG
de NIST desde SP 800-90A Rev. 1, junio de 2015 (es el último documento según página de publicaciones especiales de NIST ). Los vectores de prueba se encuentran en Pruebas CAVP: Generadores de números aleatorios .
El problema que tengo es que no puedo llegar al resultado del vector de prueba if Sigo el algoritmo tal como se publicó. If Muevo un paso hacia abajo en algunas ranuras, luego puedo llegar al resultado correcto. Es muy inusual y no estoy seguro de lo que estoy haciendo mal.
El algoritmo con el que estoy teniendo problemas Hash_DRBG_Generate Process . Aquí está el algoritmo como una captura de pantalla de la sección 10.1.1.4 alrededor de la página 50:
ElPaso 3, Hashgen , produce los bits aleatorios de pseduo para la persona que llama. Los pasos 4-6 luego actualizan el estado para que se genere la próxima llamada.
If Ejecuto el algoritmo exactamente como se especifica, luego devuelvo la siguiente cadena de bits a la persona que llama, lo cual es incorrecto. Efectivamente, usa Current V .
6C58FE76D644750EA5BE880BB1BDD2D54C98139D70BA0F7CA8637EB2527F8BFD223DEB9187976E87
91B706804FB28534D13EC4818FB59DB430C9F04F55AA8549EAD53B39624DAD6CFDAAD99412B8AEB0
If Muevo el Paso 3 entre el Paso 6 y el Paso 7, luego puedo llegar al resultado correcto. Efectivamente, utiliza Siguiente V .
56f33d4fdbb9a5b64d26234497e9dcb87798c68d08f7c41199d4bddf97ebbf6cb5550e5d149ff4d5
bd0f05f25a6988c17436396227184af84a564335658e2f8572bea333eee2abff22ffa6de3e22aca2
Mis preguntas son muy malas:
- ¿Estoy analizando las cosas incorrectamente o haciendo algo obviamente mal?
- ¿Por qué debo pasar del Paso 3 al Paso 6 y al Paso 7?
- Si tengo que elegir, ¿debo seleccionar (a) el algoritmo correcto y el resultado incorrecto, o (b) el algoritmo incorrecto y el resultado correcto?
Aquí está el vector de prueba del que estoy trabajando. Es el primer vector de prueba ( COUNT 0
) que usa SHA1 con resistencia predictiva no . El problema ocurre en GENERAR (PRIMERA LLAMADA) . El valor V
que se muestra, 1658...ed56b
, es el valor después de que se hayan ejecutado los pasos 4-6. Sin embargo, V no toma ese valor hasta que después del Paso 3, Hashgen , se haya ejecutado.
[SHA-1]
[PredictionResistance = False]
[EntropyInputLen = 128]
[NonceLen = 64]
[PersonalizationStringLen = 0]
[AdditionalInputLen = 0]
[ReturnedBitsLen = 640]
COUNT = 0
EntropyInput = 1610b828ccd27de08ceea032a20e9208
Nonce = 492cf1709242f6b5
PersonalizationString =
** INSTANTIATE:
V = 9e8301725d5f133b4ab7d329fd2f87ae5f89d96a9dd7e2b98beee1c707b8c3fe412d1125b58bae5dc08a11dac3be4a3147347160fef218
C = e5e12450450efe5fdc777c95b8c23c938fcd592e2d788f12461936e4a16131b1f2d11ce7f0159ee1e635e62f3df8bda4fea077ad5f9d06
reseed counter = 1
EntropyInputReseed = 72d28c908edaf9a4d1e526d8f2ded544
AdditionalInputReseed =
** RESEED:
V = 745c659f2944829ca6e209c8ca2dddecf9f1861383e34e94007a3a51b8444fd5ae738e7d9c0d5e69aa97ee16c49cfd2432eb32ba5738fa
C = a1fc40009357a024d878818cf6f979a88d4cc5d760b308ae1a5b9f067972e6f7cf92ddb129a8d3c1bb0005bcf3f8871fd65e794f1990b7
reseed counter = 1
AdditionalInput =
** GENERATE (FIRST CALL):
V = 1658a59fbc9c22c17f5a8b55c1275795873e4beae49657421ad5d95831b736cd7e066c738bcbb343933c411c7c17917593c03a77bed56b
C = a1fc40009357a024d878818cf6f979a88d4cc5d760b308ae1a5b9f067972e6f7cf92ddb129a8d3c1bb0005bcf3f8871fd65e794f1990b7
reseed counter = 2
AdditionalInput =
ReturnedBits = 56f33d4fdbb9a5b64d26234497e9dcb87798c68d08f7c41199d4bddf97ebbf6cb5550e5d149ff4d5bd0f05f25a6988c17436396227184af84a564335658e2f8572bea333eee2abff22ffa6de3e22aca2
** GENERATE (SECOND CALL):
V = b854e5a04ff3c2e657d30ce2b820d13e148b11c245495ff03531785eab2a1dc54d994a5597b15c5b10001f49606c88b4ff0d61acb61820
C = a1fc40009357a024d878818cf6f979a88d4cc5d760b308ae1a5b9f067972e6f7cf92ddb129a8d3c1bb0005bcf3f8871fd65e794f1990b7
reseed counter = 3