¿Por qué la etiqueta se repite dos veces en un hash etiquetado?

Me di cuenta de que el mensaje hash para el hash etiquetado en BIP340 tiene el prefijo SHA256 (etiqueta) || SHA256 (etiqueta), que también describe el motivo

Debido a que se trata de una constante específica del contexto de 64 bytes de longitud y el tamaño del bloque SHA256 también es de 64 bytes, son posibles implementaciones optimizadas (idénticas al propio SHA256, pero con un estado inicial modificado). Usar SHA256 del nombre de la etiqueta en sí es razonablemente simple y eficiente para las implementaciones que no eligen usar la optimización.

pero tengo algunas confusiones

  1. "Las implementaciones optimizadas son posibles": ¿De qué se habla específicamente de la optimización aquí? ¿Se debe a que el prefijo tiene el mismo tamaño que el tamaño de bloque de SHA-256? Si es así, ¿se puede generalizar esta conclusión a todos los algoritmos de hashing de bloques? es decir, el mismo tamaño del prefijo y el bloque del algoritmo puede conducir a la optimización.
  2. "Usar SHA256 del nombre de la etiqueta en sí es razonablemente simple y eficiente para las implementaciones que no eligen usar la optimización". : ¿Significa esto que si la implementación no tiene la intención de adoptar la optimización, entonces no puede repetir la etiqueta? es decir, el hash etiquetado sería SHA256( SHA256(tag) || msg).

Respuestas (1)

  1. "Las implementaciones optimizadas son posibles": ¿De qué se habla específicamente de la optimización aquí? ¿Se debe a que el prefijo tiene el mismo tamaño que el tamaño de bloque de SHA-256? Si es así, ¿se puede generalizar esta conclusión a todos los algoritmos de hashing de bloques? es decir, el mismo tamaño del prefijo y el bloque del algoritmo puede conducir a la optimización.

Sí, significa que el estado hash SHA256 SHA256(SHA256(tag)||SHA256(tag)||se puede precalcular. Si la etiqueta tuviera solo 32 bytes, esto no funcionaría, ya que necesitaría saber 32 bytes de datos antes de poder procesar el primer bloque.

  1. "Usar SHA256 del nombre de la etiqueta en sí es razonablemente simple y eficiente para las implementaciones que no eligen usar la optimización".: ¿Significa esto que si la implementación no tiene la intención de adoptar la optimización, entonces no puede repetir la etiqueta? es decir, el hash etiquetado sería SHA256( SHA256(tag) || msg).

No, eso daría un resultado diferente. Todo esto dice que es una construcción simple para concatenar la etiqueta hash dos veces. Obviamente, no duplicarlo sería aún más simple, pero eso prescindiría de la optimización del punto anterior.

Muchas gracias por su respuesta. Para P1: ¿Entonces esta optimización necesita almacenar en caché el estado intermedio SHA256(SHA256(tag) || SHA256(tag)||localmente? Entonces, en el futuro, ¿cada vez que se calcula el hash de la etiqueta a partir de la lectura del estado del caché? Para P2: lamento mucho haber entendido mal esta declaración antes, ahora entiendo que esta es la razón por la cual la etiqueta elige SHA256 directamente.
Correcto, el estado después de procesar los primeros 64 bytes se puede precalcular y, por lo tanto, el cálculo de un hash etiquetado puede comenzar en ese punto en lugar de tener que volver a hacerlo cada vez.
Entonces, si la longitud del prefijo es un múltiplo del tamaño del bloque, ¿la optimización aún funciona? es decir, un relleno directo a la etiqueta y su uso como prefijo. Por ejemplo, prefix = (tag_size, tag, padding), solo necesito asegurarme de que sea un múltiplo del tamaño del bloque. Pero la desventaja es que esto limitaría la longitud de la etiqueta. ¿Corrige? ¡Apreciaré tu respuesta!