2011-01-13 10 views
5

Tengo un entero grande y "único" (en realidad, un hash SHA1).Generar una frase pseudonatural a partir de un entero grande de forma reversible

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

Quiero (sin otro motivo que divertirme) encontrar un algoritmo para asignar ese hash SHA1 a una frase (pseudo-) inglesa generada por computadora. El mapeo debe ser bidireccional (es decir, conociendo el algoritmo, uno debe ser capaz de calcular el hash SHA1 original de esa frase.)

La frase no tiene por qué tener sentido. Incluso me conformaría con un párrafo entero de tonterías. (Aunque la calidad - inglés - de un párrafo probablemente debería ser mejor que para una mera frase.)

Un mejor algoritmo produciría frases más cortas, de aspecto más natural y más únicas.

Una variación: está bien si podré trabajar solo con una parte de hash. Digamos, los primeros seis dígitos hexadecimales están bien.

El posible uso de la frase generada: la versión humana legible de Git commit ID, para usar como lema para una versión de programa determinada, que se crea a partir de esa confirmación. (Como dije, esto es "por diversión". No pretendo que esto sea muy práctico, o que sea mucho más legible que el SHA1 mismo).

Posible enfoque: En el pasado he intentado construye una tabla de probabilidad (de palabras) y genera frases como cadenas de Markov, sembrando el generador (recogiendo ramas del árbol de probabilidad), de acuerdo con los bits que leí del SHA. Esto no fue muy exitoso, las frases resultantes fueron demasiado largas y feas. No estoy seguro de si esto fue un error, o la falla general en el algoritmo, ya que tuve que abandonarlo lo suficientemente temprano.

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

+0

Realmente no sé nada acerca de la criptografía. Así que solo quiero asegurarme de entender la pregunta. Básicamente, ¿desea codificar un entero grande en una oración única, para que suene lo más natural posible? – yurib

+0

@yurib: sí, eso es básicamente eso. –

+0

@yurib: excepto que también quiero ser capaz de convertir esta oración a ese entero más adelante. –

Respuesta

3

Un enfoque muy simple sería: Tome una lista de 1024 sustantivos, 1024 verbos y 1024 adjetivos cada. 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 un poco más complicado de publicidad por lo tanto no tan repetitivo buscando frases (por ejemplo, un poco para el singular/plural, un poco de dos para diferentes tiempos, ...). Las listas de palabras más largas usan algunos bits más, pero mi suposición es que alcanzas palabras bastante exóticas bastante rápido.

+0

¡listo! Bueno, una lección más en KISS para mí. :-) –

+0

También: creo que "palabras bastante exóticas" podría ser la mitad de la diversión. (Piensa en "Maverick Meerkat" por ejemplo.) –

+0

¿Alguien sabe dónde obtener un buen corpus de palabras, dividido por sustantivos verbos y adjetivos? –

0

La función hash significa que no es posible (dentro de unos límites razonables) obtener datos del hash, a menos que estén rotos (inseguros).

pregunta debería ser por romper algoritmo SHA-1 hash de - mirar a Google, es no que rota. 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 :-) avance

Editar: aunque sólo parte del hash es suficiente, sugiero simplemente la fuerza bruta (+ mapa simple de hash < -> frase, posiblemente en un archivo o db), el algoritmo hash de ruptura es muy "sopa fuerte" (problema difícil).

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 :-)

+0

Lo siento, no pregunto acerca de extraer información de SHA-1. Pregunto acerca de * generar * información, usando SHA-1 (un número entero grande) como una semilla. Esta no es una pregunta de seguridad. –

1

vamos a hacer, vamos a ver ... El idioma Inglés has about 1,000,000 words. Eso es alrededor de 20 bits por palabra. SHA1 es de 160 bits, por lo que necesitarás 8 palabras.Teóricamente, todo lo que tendrá que hacer es tomar la enésima palabra del diccionario inglés de Oxford, donde n es un grupo de 20 bits a la vez.

Ahora, para hacerlo más natural, puede intentar agregar "in/at/on/y/..." entre las palabras, según su tipo (sustantivos, verbos ...) usando algún algoritmo simple . (Debe eliminar todas estas palabras de su diccionario base, por supuesto).

El algoritmo es reversible: simplemente elimine todas las palabras que ha agregado y convierta cada palabra a su índice de 20 bits.

Además, prueba google "insult generator". Algunos de esos generadores son bastante agradables. Aunque no estoy seguro del número de combinaciones.

You can buy el Oxford English Dictionary en CD-ROM con más de 500,000 palabras (19-bit). Sin embargo, no estoy seguro de si sería fácil extraer las palabras y sus tipos. No estoy seguro de si es legal, pero creo que no se puede reclamar una patente en las entradas de diccionario ...

+0

-1: ¿qué se supone que significa esto? es algoritmo HASH, depende de todos los datos, y no puedes predecir colisiones, ¿es esto super ingenuo o qué? EDITAR: -1 eliminado, la pregunta es ambigua, la conversión de hash en palabras se puede entender de una manera criptográfica – peenut

+0

@peenut: lea mi comentario a su respuesta. No ** estoy ** tratando de romper SHA. –

+0

@peenut: Son solo 160 bits. Solo sugiero una asignación de 1 a 1 entre cualquier flujo de 160 bits y algo legible en inglés. –

1

Esta es una pregunta anterior, pero entropoetry es una biblioteca de JavaScript (nodo/frontend) que también resuelve este problema. Combina la poesía de Markov con la codificación de Huffman, por lo que, dado el mismo diccionario (es decir, la misma versión de la biblioteca), la conversión de la poesía ↔︎ números será bidireccional.

ejemplo, desde la línea de comandos del nudo:

> 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 technology marches on, lo que pareció una idea “sólo por diversión” en el año 2011 tiene algunos usos reales en 2017: las claves privadas memorizar criptomoneda (billetera cerebro), Enlaces Dat/IPFS, etc.

Cuestiones relacionadas