Cifrado por libro
Oculte un mensaje en un pasaje que comparte con otra persona: con una clave de 13 palabras, «quick fox river» se convierte en 2 4 12, y esos números se descifran en las mismas palabras. Pensado para acertijos y clases. Gratis en su navegador.
- Gratis
- Funciona en su navegador
- Sin registro
- Sus datos no salen de su equipo
Ejecutar — gratis
Ejemplo resuelto
- Acción
- Encrypt
- Resultado
- 2 4 12
- Cantidad de palabras de la clave
- 13
- Posiciones
- 2, 4, 12
- Palabras
- quick, fox, river
Un cifrado por libro oculta un mensaje breve señalando palabras que ya existen en un pasaje compartido, en lugar de inventar un alfabeto de sustitución. Pegue cualquier texto clave que usted y su interlocutor compartan—un párrafo, un poema o una página impresa—y cifre una frase en una lista de posiciones de palabra (desde 1), o descifre esos números de nuevo en las palabras originales. La coincidencia no distingue mayúsculas, se elimina la puntuación inicial y final al tokenizar, y las palabras del mensaje que no aparecen en la clave se enumeran para que pueda ampliar el pasaje o reformular el texto en claro. El motor es puro y determinista: la misma clave y el mismo mensaje siempre producen las mismas posiciones, sin llamadas de red, semillas aleatorias ni relojes.
Cómo el cifrado por libro usa las posiciones de palabra
Los cifrados por libro clásicos tratan un texto compartido como un libro de códigos. En lugar de sustituir letras por otras letras, cada unidad del mensaje secreto se escribe como un puntero hacia ese texto—casi siempre un índice de palabra contado desde el inicio del pasaje. Esta herramienta aplica una forma clara y didáctica de esa idea: el texto clave se divide por espacios en blanco, a cada token se le quita la puntuación inicial y final, y la secuencia resultante se numera desde uno.
Al cifrar, cada palabra del mensaje se busca sin distinguir mayúsculas contra la primera aparición de esa misma palabra en la lista de la clave, y el cifrado es la lista de esas posiciones (base 1) separadas por espacios. Al descifrar, el campo mensaje se lee como enteros separados por espacios, comas o punto y coma; cada número se resuelve a la palabra de ese índice en la clave.
Como solo se usa la primera coincidencia, cifrar y descifrar siguen siendo inequívocos aunque una palabra se repita más adelante en el pasaje. Los caracteres que no son letras y quedan fuera de los tokens de palabra nunca se convierten en posiciones por sí solos, de modo que usted siempre razona sobre palabras completas. Esta construcción es deliberadamente más débil que la criptografía moderna y está pensada para la enseñanza, acertijos recreativos, calentamientos de CTF y ofuscación reversible ligera—no para proteger secretos reales en tránsito o en reposo.
La frecuencia y el contexto siguen filtrándose cuando la clave es un libro público conocido; trate el pasaje compartido como secreto compartido solo en el espíritu de un truco clásico de salón, no como un canal autenticado.
Qué puede hacer con ella
Historia de la cripto en el aula
Muestre a los estudiantes cómo un pasaje compartido se convierte en libro de códigos y cómo los índices de palabra cifran y descifran sin alfabeto de sustitución de letras.
Diseño de acertijos y escape rooms
Codifique pistas breves como listas de posiciones que solo se abren cuando los jugadores poseen el mismo párrafo o poema impreso.
CTF y cifrados de afición
Genere retos de cifrado por libro reversibles e informe de las palabras clave ausentes para que los autores afinan el pasaje antes de publicarlo.
Preguntas frecuentes
¿Qué entradas necesita el cifrado por libro?
Encrypt espera palabras en claro; decrypt espera números de posición con base 1.
¿Qué ocurre si una palabra del mensaje no está en la clave?
Amplíe el pasaje clave o reformule el mensaje para cubrirla.
¿Qué incluye una respuesta exitosa?
Result son posiciones separadas por espacios al cifrar y palabras separadas por espacios al descifrar.
¿El cifrado por libro es determinista y seguro?
Es un cifrado clásico de posiciones para enseñanza y acertijos, no seguridad criptográfica moderna.
¿Qué ocurre si una palabra aparece varias veces en el pasaje?
Se usa siempre su primera aparición, de modo que cada palabra tiene una sola posición. Así el cifrado y el descifrado no dan lugar a dudas aunque la palabra se repita más adelante en el texto.
Herramientas relacionadas
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, por email y desde Telegram — y pronto también desde nuestra app.
Llámela desde su stack
curl -X POST https://api.kit.forhosting.com/enc/book-cipher \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"key_text":"The quick brown fox jumps over the lazy dog near the river bank","message":"quick fox river"}'const res = await fetch("https://api.kit.forhosting.com/enc/book-cipher", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"key_text": "The quick brown fox jumps over the lazy dog near the river bank",
"message": "quick fox river"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/enc/book-cipher",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"key_text": "The quick brown fox jumps over the lazy dog near the river bank",
"message": "quick fox river"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/enc/book-cipher", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"key_text":"The quick brown fox jumps over the lazy dog near the river bank","message":"quick fox river"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"key_text":"The quick brown fox jumps over the lazy dog near the river bank","message":"quick fox river"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/enc/book-cipher", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Ejemplo de solicitud
{
"key_text": "The quick brown fox jumps over the lazy dog near the river bank",
"message": "quick fox river"
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "enc.book_cipher",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |
Notas técnicas
Úselo gratis en el navegador para demostraciones en clase y diseño de acertijos, o invoque la misma lógica por la API a $0.002 por petición exitosa.
Cifrar, descifrar y palabras ausentes
Al cifrar, el mensaje se tokeniza en palabras igual que la clave; cada palabra se asocia a su primera posición en la clave cuando está presente. Las palabras ausentes no abortan una llamada de cifrado exitosa: se informan para que el autor pueda ampliar el pasaje clave o eliminar vocabulario raro sin adivinar qué token falló. El descifrado nunca inventa vocabulario ausente: cada número se asocia a una palabra de la clave o rechaza la petición. Un ida y vuelta de cifrado y luego descifrado con la misma clave restaura las formas superficiales de la clave para cada palabra presente, que pueden diferir en mayúsculas del texto en claro original conservando las mismas entradas del diccionario. Envíe una cadena key_text obligatoria y una cadena message obligatoria, y opcionalmente fije action en encrypt o decrypt (encrypt es el valor por defecto). La respuesta incluye la acción normalizada, cuántas palabras contiene la clave, el mensaje original, una cadena result de posiciones separadas por espacios por cada palabra encontrada, los arrays paralelos de posiciones y formas superficiales tomadas de la clave, una lista missing_words de tokens que nunca aparecen en la clave, y los contadores words_found y words_total. Al descifrar, el mensaje solo debe contener posiciones enteras positivas; un fragmento no numérico o una posición mayor que el recuento de palabras de la clave falla de inmediato con invalid_input indicando el problema. Un key_text vacío tras la tokenización, un message vacío tras la tokenización al cifrar, campos ausentes y valores de action ilegales también fallan con invalid_input y no se cobran.
Uso de la API, precios y consejos prácticos
Use action decrypt cuando el mensaje ya sea una lista de posiciones producida para esa misma clave. Nunca reutilice la página de una novela pública como si fuera una clave moderna: cualquiera que adivine el libro puede intentar las mismas búsquedas. El estado es beta mientras se estabiliza la superficie pública, pero las reglas de mapeo de posiciones siguen esta construcción clásica fija y no cambiarán para entradas idénticas. Llame a la capacidad con key_text y message como campos obligatorios. El precio de la API alojada es un importe fijo de $0.002 por petición exitosa; los fallos de validación como un key_text ausente, un pasaje vacío, un token de descifrado no entero o una posición fuera de rango no consumen saldo. Prefiera un pasaje lo bastante largo para cubrir su vocabulario de modo que missing_words quede vacío, y una redacción distintiva para verificar a mano los índices de primera aparición. En canalizaciones, envíe cada mensaje como su propia tarea y recoja los resultados con su flujo habitual de webhook o enlace firmado. Mantenga los nombres de campo explícitos en lugar de empaquetar prosa libre en un solo bloque: el contrato se alinea con OpenAPI, tipos de SDK y controles de formulario, y evita un análisis ambiguo de clave frente a texto cifrado.
Preguntas técnicas
¿Cuánto cuesta la API del cifrado por libro?
Cada llamada exitosa a la API cuesta $0.002. El mismo motor se ejecuta gratis en su navegador sin cuenta. La entrada inválida no se cobra.