Generación de una frase pseudo-natural a partir de un gran número entero de una manera reversible

StackOverflow https://stackoverflow.com/questions/4683551

  •  11-10-2019
  •  | 
  •  

Pregunta

Tengo un número entero grande y "único" (en realidad un hash SHA1).

Nota: Mientras estoy hablando aquí de hash SHA1, esto es no una pregunta criptografía / seguridad! Estoy no tratando de romper SHA1. Imagine un número entero aleatorio de 160 bits en lugar de SHA1 si que ayudará.

Quiero (por ninguna otra razón que para divertirse) para encontrar un algoritmo para asignar ese SHA1 a una (pseudo) frase de Inglés generada por computadora. El mapeo debe ser bidireccional (es decir, conociendo el algoritmo, uno debe ser capaz de calcular el hash SHA1 original a partir de esa frase.)

La necesidad frase no tiene sentido. Incluso me atrevería a conformarse con un párrafo entero de tonterías. (Aunque la calidad - lo inglés -. De un párrafo debe probablemente será mejor que la de una simple frase)

Una mejor algoritmo produciría más cortos, frases de aspecto más natural, más único.

Una variación: está bien si voy a ser capaz de trabajar sólo con una parte de hash. Por ejemplo, los primeros seis dígitos hexadecimales está muy bien.

El posible uso de la frase generada: la versión legible por humanos de Git cometer ID, para su uso como un lema para una versión de programa dado, que se construye a partir de ese cometido. (Como ya he dicho, esto es "por diversión" No pretendo que esto es muy práctico -.. O sea mucho más fácil de leer que el propio SHA1)

enfoque posible: En el pasado he intentado construir una tabla de probabilidad (de palabras), y generar frases como las cadenas de Markov, sembrando el generador (recogiendo ramas de árbol de probabilidad), de acuerdo con los bits que leo del SHA. Esto no fue muy exitoso, las frases resultantes eran demasiado largos y feos. No estoy seguro si esto era un error, o la falla general en el algoritmo, ya que tuve que abandonarla a tiempo.

Ahora estoy pensando en intentar resolver el problema, una vez más. Cualquier consejo sobre cómo abordar esto? ¿Cree enfoque de cadena de Markov puede trabajar aquí? Algo más?

¿Fue útil?

Solución

Un enfoque muy simple sería: lista de, digamos, 1024, 1024 sustantivos verbos y los adjetivos 1024 cada toma. Su frase podría entonces ser oración de la forma

noun[bits_01-10] verb[bits11-20] adjective[bits21-30] verb[bits31-40],
noun[bits_41-50] verb[bits51-60] adjective[bits61-70] verb[bits71-80],
noun[bits_81-90] verb[bits91-100] adjective[bits101-110] verb[bits111-120] and 
noun[bits_121-130] verb[bits131-140] adjective[bits141-150] verb[bits151-160].

Con un poco más pensamiento lingüístico es probable que pueda construir anuncio un poco más complicado por lo tanto no oraciones que buscan de manera repetitiva (por ejemplo, un poco para el singular / plural, un poco de dos para los distintos tiempos verbales, ...). Más largas listas de palabras utilizan unas cuantas más bits pero mi conjetura es que en lugar de llegar a las palabras exóticas bastante rápido.

Otros consejos

Vamos, vamos a ver ... El idioma Inglés tiene aproximadamente 1.000.000 palabras . Eso es alrededor de 20 bits por palabra. SHA1 es de 160 bits, por lo que tendrá 8 palabras. En teoría, todo lo que tiene que hacer es tomar la palabra enésimo del Diccionario Oxford de Inglés, donde n es un grupo de 20 bits a la vez.

Ahora, para que sea más natural, se puede tratar de añadir "en / en / sobre / y / el ..." entre las palabras, según su tipo (sustantivos, verbos ...) utilizando algún algoritmo simple. (Debe eliminar todas estas palabras del diccionario base, por supuesto).

El algoritmo es reversible:. Basta con retirar todas las palabras que ha añadido, y convertir cada palabra a su índice de 20 bits

Además, trate de google "generador de insulto". Algunos de esos generadores son bastante agradable. No estoy seguro sobre el número de combinaciones, sin embargo.

Usted puede comprar el Diccionario Oxford de Inglés en CD-ROM con más de 500,000 palabras (19 bits). No estoy seguro de si sería fácil de extraer las palabras y sus tipos, sin embargo. No estoy seguro de si es legal, pero creo que no se puede reclamar una patente sobre el diccionario de entradas ...

Esta es una vieja pregunta, pero entropoetry es una (/ frontend nodo) de la biblioteca JavaScript que también resuelve este problema. Combina Markov poesía con la codificación de Huffman, para dado el mismo diccionario (es decir, la misma versión de la biblioteca), la conversión de poetry??numbers será bidireccional.

ejemplo, desde la línea de comandos de nodo:

> var Poet = require('entropoetry'); var p = new Poet();
> p.stringify(Buffer.from('deadbeef', 'hex'))
'old trick of loving you\nif you but'
> console.log(p.parse(`old trick of loving you
... if you but`))
<Buffer de ad be ef>

Y como la tecnología avanza en , lo que parecía una “única diversión ”idea en 2011 tiene algunos usos reales en 2017:. memorizar las claves privadas criptomoneda (billetera cerebro), enlaces Dat / IPFS, etc.

medios función hash no es posible (dentro de límites razonables) para obtener un dato de hachís, a menos que se rompe (inseguro).

pregunta debería ser por romper SHA-1 algoritmo de hash - vistazo a Google, es No es que rompe . Así que no, no se puede crear la frase Inglés de SHA-1 código hash, si se puede, por favor, hacer una gran papel en eso, muchos de ellos son inútiles, esto sería gran avance: -)

Editar si sólo parte de hash es suficiente, sugiero simplemente la fuerza bruta (+ sencilla mapa de hachís <-> frase, posiblemente en un archivo o db), rompiendo algoritmo de hash es muy " fuerte sopa"(difícil problema).

Edit2: chicos ser más específico cuando se hace la pregunta, no es mi culpa ... yo no elimina este modo que asusta a cualquier otro tipos de cifrado en torno a: -)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top