He estado pensando en el siguiente caso de uso: alguna institución quiere organizar apuestas sobre un resultado que es de su propia elección. La línea de tiempo es la siguiente:
- La organización elige el resultado en el momento T. Las apuestas son abiertas sobre cuál es el resultado.
- En el momento T + N, la decisión que tomó la institución en el momento T se libera, resolviendo las apuestas.
Por ejemplo, podemos imaginar a un canal de televisión que aloja una plataforma de juegos de apuestas sobre qué personajes morirán en la próxima temporada, que ya se ha escrito pero aún no se ha emitido.
El problema es encontrar un modo para que la organización demuestre que la información que libera en el momento T + N se ha elegido, y no se ha alterado desde entonces, el tiempo T. Eso es, por supuesto, sin divulgar la información en sí. tiempo T. Esto garantiza, en particular, que la organización no puede elegir retroactivamente el resultado para beneficiarse de alguna manera de la tendencia que han tomado las apuestas.
Mi propuesta es la siguiente:
-
En el momento T, la organización elige una clave aleatoria que mantiene secreta. Calcula un HMAC del resultado con la clave secreta y lo publica.
-
En el momento T + N, la organización libera tanto el resultado como la clave secreta.
La gente puede verificar que el HMAC es correcto, y se garantiza que el resultado publicado fue realmente el elegido en el momento T porque sería computacionalmente inviable el hecho de apuntar al HMAC publicado con otro par de (resultado, clave ) para un resultado diferente y clave .
¿Esto es correcto y correcto? Especialmente la última parte en negrita? Me parece que esto es básicamente equivalente a un ataque de preimagen en la función hash con un prefijo conocido para el preimage?