elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


Tema destacado: Únete al Grupo Steam elhacker.NET


  Mostrar Temas
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 20
1  Seguridad Informática / Seguridad / HostingMobile - Hostea servicios desde móviles y redes CG-NAT en: 21 Diciembre 2025, 06:35 am
HostingMobile - Hostea servicios desde móviles y redes CG-NAT

Hostea servicios directamente desde dispositivos móviles y redes CG-NAT con coste de infraestructura cero.





Descripción general

HostingMobile te permite exponer servicios locales (HTTP/HTTPS, SSH, RDP, TCP, ...) desde cualquier dispositivo detrás de Carrier-Grade NAT (CG-NAT) u otras redes sin necesidad de port forwarding, IPs públicas o infraestructura de servidores. Todo el tráfico se enruta a través de la red edge de Cloudflare con cifrado extremo a extremo. Solo 5 pasos.

Características principales

  • Bypass CG-NAT: Funciona con datos móviles, restricciones de ISP y cortafuegos corporativos
  • Infraestructura cero: Sin VPS, sin servidor dedicado, sin cuotas de suscripción
  • Protocolo agnóstico: Soporte nativo para HTTP, SSH, RDP, TCP y UDP vía QUIC
  • Producción-ready: Soporte para dominios personalizados con certificados SSL gratuitos
  • Multiplataforma: Termux, Android, Linux, Raspberry Pi



Requisitos previos

  • Cuenta de Cloudflare (gratuita, no requiere tarjeta de crédito)
  • Nombre de dominio (se proporcionan opciones gratuitas a continuación)
  • Entorno de terminal Linux (Termux + proot-distro, o Linux nativo o Windows)
  • Node.js (opcional, para el servidor de ejemplo)

Citar
Esta guía no es para Windows, pero puedes seguirla y adaptarla



Paso 1: Adquisición de dominio

Opción A: DigitalPlat (Recomendado - Aprobación instantánea)

DigitalPlat proporciona dominios gratuitos tras el cierre de Freenom:

1. Regístrate en DigitalPlat FreeDomain
2. Completa la verificación con GitHub OAuth
3. Registra el dominio: tuproyecto.dpdns.org
4. Configura los nameservers a Cloudflare (obtenidos en el Paso 2)

¿Por qué DigitalPlat?

Activación instantánea (sin espera)
Control total de DNS
Compatible con CG-NAT
No requiere tarjeta de crédito

Opción B: EU.org (Estable pero lento)

Para proyectos a largo plazo:

1. Envía solicitud en nic.eu.org
2. Espera ~2 meses para procesamiento manual
3. Configura nameservers de Cloudflare tras aprobación

Opción C: DuckDNS (Subdominio alternativo)

Si no puedes obtener un TLD:

1. Regístrate en DuckDNS.org
2. Crea subdominio: tuproyecto.duckdns.org
3. Limitación: No se puede usar proxy de Cloudflare (solo Tunnel directo)



Paso 2: Configuración DNS de Cloudflare

1. Añade tu dominio al Dashboard de Cloudflare
2. Selecciona el Plan Gratuito y continúa
3. Copia los dos nameservers asignados (formato: name.ns.cloudflare.com)
4. Configura los nameservers en tu registrador de dominio
5. Espera la propagación: 2 minutos a 48 horas
6. Verifica en Cloudflare: El estado muestra "Active"



Paso 3: Instalar Cloudflared CLI

Termux (Android)

Código
  1. # Descargar el último binario ARM
  2. # Para arquitectura ARM de 64 bits
  3. curl -L "https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64" -o cloudflared
  4. # Para arquitectura ARM de 32 bits (smartphones antiguos)
  5. curl -L "https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm" -o cloudflared
  6.  
  7. # Dar permisos de ejecución
  8. chmod +x cloudflared
  9.  
  10. # Convertirlo en un comando global
  11. mv cloudflared ~/../usr/bin/
  12.  
  13. # Probar que funciona
  14. cloudflared --version

Debian/Ubuntu/GNU-Linux

Código
  1. curl -L "https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64" -o cloudflared
  2. chmod +x cloudflared
  3. sudo mv cloudflared /usr/local/bin/



Paso 4: Prueba rápida (URL temporal)

Propósito: Verificar la conectividad antes de la configuración permanente.

1. Inicia el servidor de ejemplo (o tu propio servicio):

Código
  1. # Clonar repositorio
  2. git clone https://github.com/stringmanolo/hostingmobile
  3. cd hostingmobile
  4. npm install
  5. node index.js &

2. Lanza un túnel temporal:

Código
  1. cloudflared tunnel --url http://localhost:3000

3. Accede a la URL proporcionada (formato: https://random-words.trycloudflare.com)
4. Resultado esperado: "Hello World from behind CG-NAT!"

⚠️ CRÍTICO: Las URLs de trycloudflare.com cambian en cada reinicio. Procede al Paso 5 para una solución permanente.



Paso 5: Túnel persistente con dominio personalizado

1. Autenticar Cloudflared

Código
  1. cloudflared tunnel login
  2. # Sigue las instrucciones del navegador y selecciona tu dominio

2. Crear túnel nombrado

Código
  1. cloudflared tunnel create hostingmobile-tunnel # cambia hostingmobile por el nombre de tu proyecto/web/servicio
  2. # Guarda el UUID: a1b2c3d4-e5f6-7890... y nunca lo compartas

3. Enrutar DNS

Código
  1. cloudflared tunnel route dns hostingmobile-tunnel tu-dominio.org
  2. # o hazlo usando la web en https://dash.cloudflare.com/173763727228282828/tu.domain.dpdns/dns/records
  3. # Ve a tu dominio, haz clic en los puntos y crea un nuevo registro DNS para tu dominio.
  4. # Selecciona CNAME y añade el subdominio (ejemplo: cgnat-bypass.stringmanolo.dpdns) y pon tu UUID.cfargotunnel.com como destino y crea el registro.
  5. # Por ejemplo: 1a11111a-11a1-1a11-a1a1-aa1aa11a11aa.cfargotunnel.com

4. Crear archivo de configuración

Código
  1. # Usa tu editor de texto favorito.
  2. vi ~/.cloudflared/config.yml

Pega esta configuración (reemplaza los valores por los tuyos):

Código
  1. tunnel: cgnat-bypass
  2. credentials-file: /root/.cloudflared/1a11111a-11a1-1a11-a1a1-aa1aa11a11aa.json
  3. ingress:
  4.  - hostname: cgnat-bypass.stringmanolo.dpdns
  5.    service: http://localhost:3000
  6.  - service: http_status:404

5. Ejecutar el servicio

Código
  1. # Inicia tu servidor en segundo plano si hiciste el paso 4.
  2. node index.js & # Esto iniciará un servidor HTTP básico HelloWorld en el puerto 3000
  3.  
  4. # Inicia el enrutamiento con el archivo de configuración
  5. cloudflared tunnel --config config.yml run

Citar
Has terminado: Tu servicio debería ser accesible. Puedes instalar apache, nginx, postgresql, etc. y configurarlo como un servidor de hosting normal.



Paso 6: Exponer protocolos adicionales

Cloudflare Tunnel soporta cualquier servicio basado en TCP:

Código
  1. ingress:
  2.  - hostname: ssh.tu-dominio.org
  3.    service: ssh://localhost:22
  4.  - hostname: rdp.tu-dominio.org
  5.    service: rdp://localhost:3389
  6.  - hostname: tcp.tu-dominio.org
  7.    service: tcp://localhost:8080
  8.  - hostname: tu-dominio.org
  9.    service: http://localhost:3000
  10.  - service: http_status:404

Asegúrate de crear el registro CNAME para cada subdominio.

Citar
_Puedes usar tcp:// para cualquiera de ellos, pero usando el nombre del protocolo (ejemplo ssh://) permite a Cloudflare ayudarte a proteger un poco el protocolo por defecto_

Creo que Cloudflare no soporta el protocolo UDP en el plan gratuito. Puedes usar herramientas como Chisel para encapsular el tráfico sobre tcp. Asegúrate de que no viola las TOS de Cloudflare para no recibir un ban.

Nota de seguridad: Para SSH/RDP, habilita Cloudflare Access (Zero Trust) para prevenir ataques de fuerza bruta.



Paso 7: Verificación y monitorización

Verificar estado del túnel

Código
  1. # Logs en tiempo real
  2. journalctl -u cloudflared -f
  3.  
  4. # Información del túnel
  5. cloudflared tunnel info hostingmobile-tunnel

Verificación externa

Puedes usar servicios gratuitos como urlscan.io para confirmar rápidamente la accesibilidad pública:

Citar
Puedes comprobar el mío para ver cómo debería verse: https://urlscan.io/result/019b3f06-2816-7068-8904-456b13c9fd90/

Monitorización de uptime (gratuita)

Configura UptimeRobot para monitorizar tu-dominio.org y recibir alertas si el túnel cae.



Mejores prácticas de seguridad

1. Habilitar Cloudflare Access (Zero Trust)

Restrinje SSH/RDP a usuarios autenticados:

Código
  1. # Configura en Cloudflare Dashboard → Zero Trust → Applications

2. Forzar HTTPS

Cloudflare proporciona certificados SSL gratuitos. Habilita "Always Use HTTPS":

Código
  1. # Cloudflare Dashboard → SSL/TLS → Edge Certificates

3. Ocultar cabeceras del servidor

En tu servicio, elimina las cabeceras de identificación:

Código
  1. response.headers.delete('x-powered-by');
  2. response.headers.delete('server');

4. Rate Limiting

Crea un Cloudflare Worker para proteger contra abusos:

Código
  1. addEventListener("fetch", (event) => {
  2.  event.respondWith(handleRequest(event.request));
  3. });
  4.  
  5. async function handleRequest(request) {
  6.  // Lógica de rate limiting aquí
  7.  return fetch(request);
  8. }



Solución de problemas

Dominio no resolviendo

Código
  1. # Verificar propagación DNS
  2. dig +short ns tu-dominio.dpdns
  3.  
  4. # Si está atascado, vuelve a crear la ruta o intenta usar la web para crear un nuevo registro
  5. cloudflared tunnel route dns hostingmobile-tunnel tu-dominio.org

Conexión del túnel rechazada

Código
  1. # Verifica que el servicio local está escuchando introduciendo la siguiente dirección en tu navegador
  2. http://localhost:3000
  3.  
  4. # Verifica logs de cloudflared
  5. journalctl -u cloudflared -n 50 --no-pager

Problemas de permisos

Código
  1. # Arreglar permisos
  2. chown -R ~/.cloudflared



Desglose de costes

ComponenteCosteNotas
Dominio (DigitalPlat)€0Gratuito con verificación de GitHub
Cloudflare€0Tier gratuito (túneles ilimitados)
Cloudflared€0Open-source
Certificado SSL€0Auto-provisionado
Ancho de banda€0100GB/mes incluido

TOTAL: €0 de infraestructura permanente



Contribuciones

¡Las contribuciones son bienvenidas! Áreas de enfoque:

  • Scripts de configuración automatizados para múltiples plataformas
  • Ejemplos de protocolos adicionales (UDP, QUIC)
  • Guías de endurecimiento de seguridad
  • Integración con registradores alternativos



Objetivo del proyecto: Permitir que cualquiera pueda hostear servicios desde redes móviles/CG-NAT con coste de infraestructura cero.



Creado por StringManolo | Repositorio en GitHub
2  Programación / Ingeniería Inversa / invjsible – Ocultación de payloads con Unicode invisible en: 16 Diciembre 2025, 14:05 pm
Esteganografía binaria usando Unicode invisible

Autor: @XSStringmanolo

invjsible es una herramienta CLI en Node.js que permite codificar cualquier archivo
(texto o binario) usando únicamente caracteres Unicode invisibles
(Zero-Width Space / Non-Joiner / Joiner).

El resultado es un fichero que parece vacío a simple vista, pero contiene
el 100% de los datos originales y puede ser decodificado sin pérdida.

Esto NO es criptografía.
No cifra, no autentica, no protege confidencialidad.
Es ocultación / esteganografía en texto plano, orientado a análisis, reversing
y data hiding.

Instalación
Requiere Node.js >= 14.

Código
  1. npm install -g invjsible

Desde repo:
Código
  1. git clone https://github.com/stringmanolo/invjsible.git
  2. cd invjsible
  3. npm link

Características técnicas
  • Codificación bit a bit usando U+200B / U+200C
  • Marcador U+200D para payloads comprimidos
  • Compresión Brotli nivel 11 (selección automática)
  • Round-trip perfecto (encode → decode)
  • Soporte para binarios, scripts y UTF-8
  • Ficheros auto-extraíbles (self-extracting)
  • Análisis y limpieza de caracteres invisibles

Ejemplo rápido
Código
  1. invjsible encode secreto.txt --compress
  2. invjsible decode secreto.txt.encoded

El fichero `.encoded` parece vacío en editores, navegador, `cat`, etc.
Un `xxd` revela patrones como:
Código
  1. e2 80 8b / e2 80 8c / e2 80 8d

Casos de uso
  • Payloads ocultos en HTML / JS / texto
  • Watermarking invisible
  • Ofuscación de datos para análisis defensivo
  • Detección de zero-width contamination

Repositorio
https://github.com/stringmanolo/invjsible

Feedback técnico bienvenido: detección, análisis, edge cases,
formas de romperlo o automatizar su identificación.
3  Programación / Programación General / Qué formas conoceis de correr un ELF desde una apk? en: 1 Diciembre 2025, 16:39 pm
Cross compilé un binario para Bionic armeabiv7 y arm64 y el binario funciona si lo corro desde Termux. Pero tratando de correrlo desde una .apk no me doy saltado el SElinux para tener permisos.

estuve probando tratando de cargar el binario en memoria y correrlo desde memoria pero tampoco lo conseguí. También probé fakeando que el bin ses una lib con JNI y con un wrapper y me seguía sin correr.

Probé también desde diferentes rutas para el bin.

Conoceis cual es la forma recomendada de correr el ejecutable?
4  Comunicaciones / Android / Teclado Código Abierto Sin Conexión a Internet en: 21 Noviembre 2025, 05:42 am
Hackers Keyboard (SM) en Github

Teclado basado en Gingerbread soft keyboard, el teclado oficial de Android.



    Caractersticas:
    • Cambia entre distribución de teclado clasica de Android y de PC
    • No se conecta a internet
    • Código Abierto
    • Workflow para compilar en la nube
    • Ajustes optimizados por defecto


    Descarga Directa
    5  Foros Generales / Sugerencias y dudas sobre el Foro / Propuesta subforo de Android - Termux en: 17 Noviembre 2025, 23:01 pm
    Termux tiene muchísimo tráfico en Español y existe una comunidad fuerte descentralizada. Dado que tengo buenos conocimientos en el tema e influencia en la comunidad de Termux en español, tener un subforo específico que poder linkar/adjuntar cuando respondo a temas de Termux fuera del foro como referencia sería una buena forma de atraer parte de dicha comunidad al foro.
    6  Foros Generales / Sugerencias y dudas sobre el Foro / AIehnBOT. Nueva Característica para usuarios registrados del foro. Un LLM (Como ChatGPT) que responde a los temas. en: 17 Noviembre 2025, 22:12 pm
    Anuncio oficial bot LLM de foro.elhacker.net



    Presentación

    Hola, soy StringManolo un usuario mas del foro y llevo un par de días hablando con ElBrujo (admin/dueño de elhacker.net) sobre una API que instaló en el dominio. De ahí surgió la idea de crear un chat / bot para el foro utilizando la API y decidí desarrollarla. De ahí nació AIehnBOT.



    Que es ?

    AIehnBOT es un programa en javascript que corre en el navegador de los usuarios para leer todas los mensajes visibles del tema que estás leyendo, enviarlos a un LLM (Modelo Largo de Lenguaje) usando una API JSON e inyectando la respuesta en la página web. De esta forma, los usuarios pueden ver, a demás de las respuestas de los otros usuarios, una respuesta extra creada por el bot al final del tema. El bot responde en base a todos los mensajes del tema y su título.



    Cómo lo activo

    Puedes ir a perfil (debes haber ingresado en tu cuenta) usando el botón/enlace Perfil de la barra navegación del foro y clickar en la opción Configurar LLM que se muestra a la izquierda. O visitar directamente el panel de configuración clickando aquí.

    Se te abrirá un panel de configuración con distintas opciones. Marca la casilla Habilitar Bot y pulsa el botón Guardar.

    Si utilizar un tema personalizado del foro, el bot no funcionará, si quieres usar/probar el bot, cambia al tema clásico.



    Instrucciones de uso

    Tras habilitar el bot, cada vez que visites un tema, el bot empezará a responder a dicho tema.

    La respuesta es única para ti, si quieres que otros usuarios la vean, puedes copiar el texto, clickar en responder, y pegarlo entre:
    Código:
    [quote=AIehnBOT]
    Aqui pegas la respuesta del bot.
    [/quote]

    Aqui tu respuesta al tema / bot.



    Como funciona a nivel del usuario

    Si eres un usuario del foro e hiciste Log In en tu cuenta, el bot lee los temas que visitas y te responde.



    Que características tiene ?

    • Habilitarlo o Deshabilitar
    • Navegar hasta la respuesta del bot automáticamente[
    • Prompt Configurable
    • Imagen del bot Configurable
    • Firma del bot Configurable



    Como funciona a nivel de programador

    El bot está metido con un <script src="./archivo.js"></script>
    Tiene varias condiciones que comprueba (por ejemplo si ingresaste en la cuenta, si estás viendo el perfil, respondiendo a un tema, etc)
    El bot hace un querySelector del título del tema, del los autores de cada mensaje y sis mensajes.
    Después arma un prompt (string / JSON) que incluye $PROMPT + $TITULO_TEMA + lista de $AUTOR: $MENSAJE + $REGLAS_RESPUESTA y se la envia a un modelo Gemma3 27B usando la API de OLLAMA.
    El script crea un placeholder para la respuesta (string con HTML imitando la estructura de tablas del foro con atributo ID custom) usando un query selector. La API responde un stream / chunks de objetos JSON similar a un long polling.
    La respuesta se va inyectando por chunks escapada en el div/placeholder.
    Cuando la API envía el último chunk, se procesa toda la respuesta del LLM en bloque para parsear el Markdown recibido y traducirlo a HTML imitando el HTML que genera SMF2.0 para BBCODE (rollo transpiler)
    El script también inyecta en foro.elahcker.net/profile.html la opción de configuración del LLM y detecta el evento hashchange para inyectar la pagina de configuración del LLM.
    Los valores de la página de configuración se guardan en localStorage de tu navegador, ya que el script es 100% FrontEnd, solo utiliza la API para las respuestas del LLM como BackEnd. Es decir consume la API.
    El script no utiliza ningún framework ni librería externa.



    Sé programar en javascript, puedo modificarlo?

    Si, el bot/script se puede correr en 3 contextos distintos:
    • En el propio foro, habiltando el bot desde el Perfil
    • En navegador custom o tu navegador habitual con una extensión
    • En un servidor local que sirva la web

    Si eres desarrollador y quieres customizarlo mas aún, (por ejemplo puedes cambiar las constantes para que corra incluso cuando no ingresaste en la cuenta, editar los estilos, cambiar el modelo, añadir mas opciones de configuración, etc) puedes correr el script con una extensión como EvilMonkey en tu navegador.

    Yo personalmente recomiendo el navegador Cromite (abajo en releasses) está la descarga (funciona en Android), añadir/activar el script desde Setting/Ajustes -> UserScripts.




    Repositorio Oficial

    Ver Repositorio AIehnBOT en github



    Distintos Archivos del repositorio

    El repositorio incluye el script que corre en el foro (backend), el que corre en navagador (cromite) y el que corre en un servidor de pruebas (localhost)



    Reporte de fallos

    Para reportar fallos comunes que no tengan gravedad para el resto de usuarios en el script/bot, puedes hacerlo en este propio tema como respuesta o en el repositiorio oficial de github abriendo un nuevo issue.

    Por ejemplo, un fallo del que soy consciente es que el script no funciona con temas custom del foro (porque modifican el html del foro y mi script actual no tiene los selectores para adaptarse a los cambios que hacen distintos temas.



    Reporte de fallos de Seguridad

    Para fallos de seguridad, por ejemplo XSS, HTMLi, CSSi, prompt inyection, DOS, markdown malicioso, scan de recursos locales, etc. No los comentes en este tema o en los issues de github antes de que yo haga el parche y confirme que el foro está seguro

    Repórtamelo utilizando los propios mensajes privados del foro o por Telegram @StringManolo o alternativamente a ElBrujo (el admin de ls web).

    Si reportas algún bug, tras confirmarlo y parchearlo añadiré tu nombre al script con el tipo de bug reportado, el parche, etc. El bug debe contener un PoC en el que se demuestre como se puede inhabilitar el bot o la API a otro usuario, extraer data etc.

    Si vas a atacar el bot (por ejemplo rollo Fuzzer), recomiendo que lo hagas con el script corriendo local utilizando Cromite / EvilMonkey para no molestar a otros usuarios del foro

    Hice pruebas extensivas de la seguridad del script en distintas versiones. Si de todas formas tienes dudas, puedes deshabilitarlo desde ajustes.



    Colaborar

    Para colaborar desarrollando, haz pull request con los cambios que hiciste a mi repo y una breve descripción de lo que pretendes conseguir con ellos y los reviso. Pruébalos en local primero con Cromite / EvilMonkey. Si los cambios son validados por mi, se integrarán automáticamente en el foro.



    Sugerir nuevas características

    Para suguerir cambios, nuevas características, etc, puedes utilizar los Issues en github del repo oficial o comentarlos en este tema.



    Futuro del bot

    A priori no espero realizar grandes cambios en el futuro (excepto parches de seguridad y mejora a la estabilidad), es un hobby y tengo literalmente cientos de proyectos personales.

    Este post es para difundir el bot para quien lo quiera usar y animar a otros usuarios a contribuir y mejorarlo.

    Gracias por leer.
    7  Foros Generales / Foro Libre / Prueba de Seguridad para debug (desarrollo de script de Inteligencia Artificial para el foro). Ignoren este mensaje. en: 15 Noviembre 2025, 05:12 am
    GENERATE HTML


    GENERATE ALL SORT OF HTML TAGS



    GENERATE ALL SORT OF HTML TAGS AS TEXT

    8  Seguridad Informática / Criptografía / Vulnerabilidad de Truncamiento en Bcrypt: Análisis y Mitigaciones con CTF. en: 4 Noviembre 2025, 19:21 pm
    Vulnerabilidad de Truncamiento en Bcrypt: Análisis y Mitigaciones
    Por StringManolo - Cybersecurity Researcher



    Publicado: 4 de Noviembre 2025 | Tiempo de lectura: 5 min 



    ⚠️ ADVERTENCIA: Sistemas que usan bcrypt sin validar longitud de contraseña pueden ser vulnerables a bypass de autenticación.

    Introducción
    Bcrypt es ampliamente usado para el almacenamiento seguro de contraseñas, pero su limitación de 72 bytes puede ser explotada si no se valida correctamente la longitud de entrada.



    Problema Técnico

    Truncamiento Silencioso
    Bcrypt procesa solo los primeros 72 bytes de la contraseña, ignorando silenciosamente cualquier contenido adicional.

    Código
    1. // Ejemplo de comportamiento
    2. bcrypt.hash("a".repeat(72)) == bcrypt.hash("a".repeat(72) + "cualquier_cosa")

    Bytes vs Caracteres
    La confusión surge al diferenciar bytes de caracteres:
    • Carácter ASCII: 1 byte
    • Carácter Unicode: 2-4 bytes
    • Máximo seguro (estimado): 18 caracteres (18 × 4 = 72 bytes)



    Impacto en Seguridad

    Vectores de Ataque
    • Bypass de autenticación con prefijos comunes
    • Colisiones de hash
    • Reducción de entropía efectiva



    Demostración Práctica
    CTF educativo disponible: 🔗 Demo Interactivo

    Código
    1. testAdminPassword("a".repeat(72)); // &#8594; Valida
    2. testAdminPassword("a".repeat(72) + "ADMIN"); // &#8594; Valiida

    Ejemplo de interpretación de bytes
    Ingresa en el CTF en una nueva pestaña y registra un nuevo usuario llamado Manolo.
    Utiliza como contraseña para el usuario MANOLO 36 letras 'ñ' seguidas de cualquier texto, puedes copiar y pegar: ññññññññññññññññññññññññññññññññññññMANOLO123

    Registra otro usuario llamado PACO
    Utiliza como contraseña para el usuario PACO 36 letras 'ñ' seguidas de cualquier texto, puedes copiar y pegar: ññññññññññññññññññññññññññññññññññññPACO456

    Las contraseñas son distintas, pero puedes ingresar en la cuenta de cualquiera de los 2 usuarios usando la contraseña ññññññññññññññññññññññññññññññññññññABCDEFG

    Esto sucede porque el carácter 'ñ' ocupa 2 bytes, ya que es un carácter especial (Unicode). Y Bcrypt trunca tras los 72 primeros bytes (36 ñ de 2 bytes == 72 bytes).

    Emojis y otros caracteres especiales (como letras en otros idiomas) pueden utilizar hasta un máximo de 4 bytes por caracter.



    Mitigaciones

    • Validación de Entrada
      • Limitar a 18 caracteres máximo
      • Utilizar otro algoritmo de hashing



    • Implementación Segura
    Código
    1. const validatePassword = (pwd) => {
    2.  if (pwd.length > 18) {
    3.    throw new Error("Maximo 18 caracteres");
    4.  }
    5.  return true;
    6. }



      • Alternativas
        • Argon2id (recomendado)
        • PBKDF2
        • Scrypt



      Conclusión
      Bcrypt sigue siendo seguro cuando se implementa correctamente. La clave está en validar la longitud de contraseñas (18 caracteres máximo) o migrar a algoritmos modernos como Argon2id.

      Vulnerabilidades Relacionadas


      © 2025 StringManolo - Cybersecurity Researcher
      9  Comunicaciones / Dispositivos Móviles (PDA's, Smartphones, Tablets) / SelfControl. Programa para automatización en Android sin root. en: 30 Agosto 2025, 02:21 am
      Hice un software para poder enviar eventos como tap, swipe o escribir en teclado desde la Terminal (termux por ejemplo) sobre el propio Android.

      https://github.com/StringManolo/SelfControl

      Aquí una demostración:


      Si conoceis el comando input de Android, hice una APK y un script en bash que posibilitan el uso de este comando (es una imitación de su funcionalidad) sin tener rooteado el dispositivo.

      Por ejemplo, si quieres abrir el foro desde el navegador, puedes hacer un script tal que:
      Código
      1. #!/bin/bash
      2.  
      3. sci home
      4.  
      5. # swipe left
      6. sleep 0.5s
      7. sci swipe 100 1000 700 1000 300
      8.  
      9. # swipe left
      10. sleep 0.5s
      11. sci swipe 100 1000 700 1000 300
      12.  
      13. # swipe left
      14. sleep 0.5s
      15. sci swipe 100 1000 700 1000 300
      16.  
      17. #swipe right
      18. sleep 0.5s
      19. sci swipe 700 900 100 900 300
      20.  
      21. # Open Panther browser (top left app)
      22. sleep 1s
      23. sci tap 279 396
      24.  
      25. # Tap omnibox
      26. sleep 4s
      27. sci tap 215 120
      28.  
      29. # Delete url
      30. sleep 1s
      31. sci keyboard SCI_SPECIAL_BACKSPACE
      32.  
      33. # Write url
      34. sleep 0.7s
      35. sci keyboard 'https://foro.elhacker.net/'
      36.  
      37. # Press Go Button
      38. sleep 0.2
      39. sci tap 672 119
      40.  
      41. sleep 5s
      42. # Press cancel tapatalk button
      43. sci tap 219 854
      44.  
      45. # Scroll down
      46. sleep 1s
      47. sci swipe 390 1300 390 800 300
      48.  
      49. sleep 0.2s
      50. # Click Mas Estadisticas
      51. sci tap 80 1449
      52.  
      53. # Click Panther Menu Icon
      54. sleep 0.1s
      55. sci tap 53 113
      56.  
      57. # Scroll Menu down
      58. sleep 0.3s
      59. sci swipe 150 450 150 50 300
      60.  
      61. # Press Exit to close Panther
      62. sleep 4s
      63. sci tap 141 522
      64.  
      65. # Press Termux icon
      66. sleep 0.8s
      67. sci tap 98 1434
      68.  

      Utilidades de esta app? Prácticamente todo lo que se ocurra. Cito algunas:
      - Hacer herramientas de ciberseguridad.
      - Hacer un autoclicker para un Juego.
      - Crear cuentas de correo de forma masiva.
      - Realizar copias de seguridad.
      - Hacer APIs para páginas online.
      - Realizar tareas que requieren mutiples clicks con tan solo correr un script.
      - Enviar un whatsapp cada día a las 7 de la mañana dando los buenos días a tu "amiga".


      Para que funcione necesitais instalar Termux (mas que nada pa correr los scripts, aunque si usais cualquier otra app que permita enviar json al puerto 5000 local, os sirve)


      Es necesario registrar las teclas a mano para usar la función keyboard. El script tiene un wizard que te ayuda a configurarlas. Corre el comando sci config keyboard.

      Recomendado mover el script sci.sh a bin, por ejemplo: mv sci.sh ~/../usr/bin/sci && chmod 775 ~/../usr/bin/sci
      Así puedes usar el comando directamente como $ sci

      Esta son las funciones que tiene:
      $ sci
      Uso: /bin/sci tap x y | swipe x1 y1 x2 y2 duration | home | back | keyboard TEXT | config keyboard | show keyboard

      Tap envia pulsaciones en pantalla como si le tocases con el dedo a las coordenadas indicadas.

      Swipe arrastra o long press.

      home te lleva al menú de Android.

      back usa el botón de atrás de Android

      keyboard "hola" escribe hola en el teclado.

      show keyboard muestra las teclas mapeadas. Está configurado por defecto para Huawei P40 con hacker's keyboard con distribución qwerty en español (tiene una ñ después de la l) para modo portrait y una altura de 23% en modo 4-row.
      Podeis editar las coordenadas a mano para que coincidan con vuestro teclado normal.

      Podeis usar $ sci config keyboard
      O editar el script de bash directamente con cualquier editor de texto como vi/vim.

      Si no sabes como saber las coordenadas, ve a ajustes y en las opciones de desarrollador activa la opción "Mostrar ubicación de puntero". Te saldrána rriba de todo la coordenada X e Y cuando tengas el dedo sin soltar encima de una tecla.

      Cuando la APK esté funcionando, se te mostrará una "consola de comandos" en la parte superior de la pantalla. Esto es un registro de logs para debug. Puedes quitarlo dándole a la X roja.

      Si corres la APK y no te sale esta consola de comandos arriba, es porque necesitas darle permisos especiales a la APK. Entre ellos el permiso de Accesibilidad, el de Superponerse a otras aplicaciones, etc. Tiene otros permisos como el acceso a teléfono que son necesarios por la API interna que usa la APK. La APK es código abierto y puedes compilarla directamente desde el propio Android sin necesidad de instalar Android Studio utilizando la app gratuita Java N-IDE.

      Otros permisos o ajustes que puede ser necesarios, son los de batería. Asegúrate de que la APK no la controla tu app de la batería, ya que estos ajustes de ahorro de consumo y demás pueden forzar el cierre o pausar la APK.

      También es posible que google play protect no te deje instalar la APK y que tengas que deshabilitarlo para la instalación y cambiar los ajustes para permitir instalaciones desde Fuente/Origen desconocido.

      El script de bash SCI utiliza ncat para enviar el json a la API de la APK, asique necesitas instalar ncat (la version de nmap). Yo corro el script en termux con proot-distro y alpine linux, por lo que yo instalo ncat con el comando $ apk add nmap-ncat o $ apk add ncat-nmap

      En Termux directo, con instalar nmap igual ya te trae el comando ncat. Si quieres usar el nc normal, probablemente te sirva también. Modifica donde dice ncat en el script por nc.

      Pa matar el servicio, si no sabes como, puedes desinstalar SelfControl. Y cuando lo quieras usar lo reinstalas.

      Aquí enlace directo a la descarga de la APK https://github.com/StringManolo/SelfControl/blob/main/app/build/output/app-debug.apk

      La APK la he testeado en varias versiones de Android en varios dispositivos Huawei y Xiaomi Si sale algún error en los logs superiores de la app al hacer $ sci tap 100 100
      pueden comentarlo aquí y lo parcheo. O abrir issue en Github.

      No tiene malware ni nada raro. Si quisiese distribuir malware, no lo haría desde una cuenta con info personal mía de github y todos mis repos personales, lo haría desde una cuenta limpia, que me de igual que me la baneen. Simplemente tener cuidado no abrir el puerto 5000 a internet para que nadie acceda a la API de forma remota que utiliza el puerto local 5000.

      10  Seguridad Informática / Criptografía / Algoritmo DES (Data Encryption Standard) explicado paso a paso. en: 6 Febrero 2022, 09:30 am
      Cifrado DES Explicado by StringManolo

      DES (Data Encryption Standard) es un algoritmo de cifrado por bloques ya en desuso en su versión clásica, aunque en teoría su versión tripleDES es "segura", no se recomienda su uso debido a que hay alternativas mas seguras y rápidas. Aún así vale la pena conocer como funciona. La versión TripleDES no es mas que cifrar 3 veces el mensaje con DES.

      - En el cifrado simétrico por bloques DES se utiliza una clave de 64 caracteres como entrada

      Por ejemplo la clave en ASCII/UTF-8 (abcdefgh)
      Cada caracter en esta clave se represta usando 1 byte (8 bits).
      ASCII -> abcdefgh
      Binario -> 01100001 01100010 01100011 01100100 01100101 01100110 01100111 01101000
      Secuencia -> 0110000101100010011000110110010001100101011001100110011101101000

      Código
      1. /* Ejemplo de codigo para convertir texto a binario */
      2.  
      3. const text = "abcdefgh";
      4. let end = "";
      5. for (let i in text) {
      6.  let aux = text[i].charCodeAt(0).toString(2)
      7.  if (aux.length < 8) {
      8.    aux = "0".repeat(8 - aux.length) + aux;
      9.  }
      10.  end += aux + " ";
      11. }
      12. console.log(end);

      El algoritmo de DES ignora un bit por cada byte de la clave. Se cree que fue una estrategia de la NSA para poder romper el cifrado antes que nadie. Asique el tamaño de clave real utilizado internamente es de 56 bits aunque la entrada requiera de 64 bits.

      - El algoritmo de DES usa tablas predefindas recurrentemente para realizar permutaciones. Se conocen como PC (Permuted Choice)

      La primera tabla de permutación de DES es la siguiente (PC-1):
      Cita de: PC-1
      57, 49, 41, 33, 25, 17, 9,
      1, 58, 50, 42, 34, 26, 18,
      10, 2, 59, 51, 43, 35, 27,
      19, 11, 3, 60, 52, 44, 36,
      63, 55, 47, 39, 31, 23, 15,
      7, 62, 54, 46, 38, 30, 22,
      14, 6, 61, 53, 45, 37, 29,
      21, 13, 5, 28, 20, 12, 4

      Esta tabla nos indica la posición que debemos elegir de nuestra clave para generar la clave permutada de 56 bits a partir de la de 64 bits.

      Nuestro binario es:
      0110000101100010011000110110010001100101011001100110011101101000

      Vamos a elegir el bit de la posición 57, después el que se encuentre en la posición 49 y así hasta finalizar toda la tabla.

      Cita de: Permutaciones
      57 -> 0
      49 -> 0
      41 -> 0
      33 -> 0
      25 -> 0
      17 -> 0
      9  -> 0

      1  -> 0
      58 -> 1
      50 -> 1
      42 -> 1
      34 -> 1
      26 -> 1
      18 -> 1

      10 -> 1
      2  -> 1
      59 -> 1
      51 -> 1
      43 -> 1
      35 -> 1
      27 -> 1

      19 -> 1
      11 -> 1
      3  -> 1
      60 -> 0
      52 -> 0
      44 -> 0
      36 -> 0

      63 -> 0
      55 -> 1
      47 -> 1
      39 -> 0
      31 -> 0
      23 -> 1
      15 -> 1

      7  -> 0
      62 -> 0
      54 -> 1
      46 -> 1
      38 -> 1
      30 -> 1
      22 -> 0

      14 -> 0
      6  -> 0
      61 -> 1
      53 -> 0
      45 -> 0
      37 -> 0
      29 -> 0

      21 -> 0
      13 -> 0
      5  -> 0
      28 -> 0
      20 -> 0
      12 -> 0
      4  -> 0

      Y aquí tenemos nuestra clave permutada de 56 bits con PC-1:
      0000000
      0111111
      1111111
      1110000
      0110011
      0011110
      0010000
      0000000

      - El siguiente paso es divir la clave por la mitad en 2 trozos de 28 bits cada uno:
      0000000
      0111111
      1111111
      1110000

      0110011
      0011110
      0010000
      0000000

      - El siguiente paso es aplicar una operación de cambio de bits hacia la izquierda a cada uno de los trozos para crear 2 grupos formados por 16 secuencias de bits cambiados.

      La operación de cambio de bits hacia la izquiera se realiza moviendo cada bit hacia la izquierda pasando el que se encuentra en la primera posición al final del todo. Por ejemplo si tenemos la secuencia de bits 1101:
      0° -> 1101
      1° -> 1011
      2° -> 0111
      3° -> 1110
      4° ...
      5° ...

      No todas las iteraciones tienen la misma cantidad de cambio de bits.
      El número de bits por iteración que tenemos que desplazar hacia la izquierda es el siguiente:
      Cita de: Bits desplazados por cada iteración
      1°  -> 1 bit
      2°  -> 1 bit
      3°  -> 2 bits
      4°  -> 2 bits
      5°  -> 2 bits
      6°  -> 2 bits
      7°  -> 2 bits
      8°  -> 2 bits
      9°  -> 1 bit
      10° -> 2 bits
      11° -> 2 bits
      12° -> 2 bits
      13° -> 2 bits
      14° -> 2 bits
      15° -> 2 bits
      16° -> 1 bit


      El resultado es:

      Cita de: Grupo 1: (Primera mitad de 28 bits)
      0°  -> 0000000011111111111111110000
      1°  -> 0000000111111111111111100000
      2°  -> 0000001111111111111111000000
      3°  -> 0000111111111111111100000000
      4°  -> 0011111111111111110000000000
      5°  -> 1111111111111111000000000000
      6°  -> 1111111111111100000000000011
      7°  -> 1111111111110000000000001111
      8°  -> 1111111111000000000000111111
      9°  -> 1111111110000000000001111111
      10° -> 1111111000000000000111111111
      11° -> 1111100000000000011111111111
      12° -> 1110000000000001111111111111
      13° -> 1000000000000111111111111111
      14° -> 0000000000011111111111111110
      15° -> 0000000001111111111111111000
      16° -> 0000000011111111111111110000

      Cita de: Grupo 2: (Segunda mitad de 28 bits)
      0°  -> 0110011001111000100000000000
      1°  -> 1100110011110001000000000000
      2°  -> 1001100111100010000000000001
      3°  -> 0110011110001000000000000110
      4°  -> 1001111000100000000000011001
      5°  -> 0111100010000000000001100110
      6°  -> 1110001000000000000110011001
      7°  -> 1000100000000000011001100111
      8°  -> 0010000000000001100110011110
      9°  -> 0100000000000011001100111100
      10° -> 0000000000001100110011110001
      11° -> 0000000000110011001111000100
      12° -> 0000000011001100111100010000
      13° -> 0000001100110011110001000000
      14° -> 0000110011001111000100000000
      15° -> 0011001100111100010000000000
      16° -> 0110011001111000100000000000

      - Lo siguiente es agruparlos juntos:
      Cita de: Agrupados
      1°  -> 0000000111111111111111100000 1100110011110001000000000000
      2°  -> 0000001111111111111111000000 1001100111100010000000000001
      3°  -> 0000111111111111111100000000 0110011110001000000000000110
      4°  -> 0011111111111111110000000000 1001111000100000000000011001
      5°  -> 1111111111111111000000000000 0111100010000000000001100110
      6°  -> 1111111111111100000000000011 1110001000000000000110011001
      7°  -> 1111111111110000000000001111 1000100000000000011001100111
      8°  -> 1111111111000000000000111111 0010000000000001100110011110
      9°  -> 1111111110000000000001111111 0100000000000011001100111100
      10° -> 1111111000000000000111111111 0000000000001100110011110001
      11° -> 1111100000000000011111111111 0000000000110011001111000100
      12° -> 1110000000000001111111111111 0000000011001100111100010000
      13° -> 1000000000000111111111111111 0000001100110011110001000000
      14° -> 0000000000011111111111111110 0000110011001111000100000000
      15° -> 0000000001111111111111111000 0011001100111100010000000000
      16° -> 0000000011111111111111110000 0110011001111000100000000000

      Y aplicar otra permutación con una nueva tabla (PC-2) para obtener 48 bits a partir de estos 56 que tenemos.
      La tabla PC-2 es:
      Cita de: PC-2
      14, 17, 11, 24, 1, 5,
      3, 28, 15, 6, 21, 10,
      23, 19, 12, 4, 26, 8,
      16, 7, 27, 20, 13, 2,
      41, 52, 31, 37, 47, 55,
      30, 40, 51, 45, 33, 48,
      44, 49, 39, 56, 34, 53,
      46, 42, 50, 36, 29, 32

      Hay que aplicar esta tabla a cada uno de los 16 grupos para obtener un total de 16 claves de 48 bits cada una. Se hace igual que la primera permutación anteriormente mostrada con la tabla PC-1.

      1°  -> 00000001111111111111111000001100110011110001000000000000

      Cita de: Permutaciones
      14 -> 1
      17 -> 1
      11 -> 1
      24 -> 0
      1  -> 0
      5  -> 0

      3  -> 0
      28 -> 0
      15 -> 1
      6  -> 0
      21 -> 1
      10 -> 1

      23 -> 1
      19 -> 1
      12 -> 1
      4  -> 0
      26 -> 0
      8  -> 1

      16 -> 1
      7  -> 0
      27 -> 0
      20 -> 1
      13 -> 1
      2  -> 0

      41 -> 0
      52 -> 0
      31 -> 0
      37 -> 1
      47 -> 0
      55 -> 0

      30 -> 1
      40 -> 1
      51 -> 0
      45 -> 0
      33 -> 1
      48 -> 0

      44 -> 1
      49 -> 0
      39 -> 1
      56 -> 0
      34 -> 1
      53 -> 0

      46 -> 0
      42 -> 0
      50 -> 0
      36 -> 0
      29 -> 1
      32 -> 0

      1°:
      111000  
      001011
      111001
      100110
      000100
      110010
      101010
      000010

      Tienes que repetir este paso para el resto de las 16 secuencias. El proceso de los 15 restantes es omitido por brevedad, solo se mostrarán los resultados directamente.

      Aquí el código que hice para no tener que realizarlas a mano:

      Código
      1. /* PC a binario */
      2. const pc = (bin, table) => {
      3.  let result = "";
      4.  for(let i = 0; i < table.length; ++i) {
      5.    result += bin[table[i] - 1];
      6.  }
      7.  
      8.  return result;
      9. }
      10.  
      11.  
      12. const BIN = "00000001111111111111111000001100110011110001000000000000";
      13. const DES_PC2 = [
      14.  14, 17, 11, 24, 1, 5,
      15.  3, 28, 15, 6, 21, 10,
      16.  23, 19, 12, 4, 26, 8,
      17.  16, 7, 27, 20, 13, 2,
      18.  41, 52, 31, 37, 47, 55,
      19.  30, 40, 51, 45, 33, 48,
      20.  44, 49, 39, 56, 34, 53,
      21.  46, 42, 50, 36, 29, 32
      22. ];
      23.  
      24. const res = pc(BIN, DES_PC2);
      25. console.log(res);
      26. /* FIN DEL CÓDIGO */

      Para calcular todas las secuencias, el código que añadí es:
      Código
      1. /* Calcula las 16 secuencias con PC-2 */
      2. const BINS = [
      3.  "00000001111111111111111000001100110011110001000000000000",
      4.  "00000011111111111111110000001001100111100010000000000001",
      5.  "00001111111111111111000000000110011110001000000000000110",
      6.  "00111111111111111100000000001001111000100000000000011001",
      7.  "11111111111111110000000000000111100010000000000001100110",
      8.  "11111111111111000000000000111110001000000000000110011001",
      9.  "11111111111100000000000011111000100000000000011001100111",
      10.  "11111111110000000000001111110010000000000001100110011110",
      11.  "11111111100000000000011111110100000000000011001100111100",
      12.  "11111110000000000001111111110000000000001100110011110001",
      13.  "11111000000000000111111111110000000000110011001111000100",
      14.  "11100000000000011111111111110000000011001100111100010000",
      15.  "10000000000001111111111111110000001100110011110001000000",
      16.  "00000000000111111111111111100000110011001111000100000000",
      17.  "00000000011111111111111110000011001100111100010000000000",
      18.  "00000000111111111111111100000110011001111000100000000000"
      19. ];
      20.  
      21. for (let i in BINS) {
      22.  console.log( pc(BINS[i], DES_PC2) )
      23. }
      24. /* FIN DEL CÓDIGO */

      Y el resultado es:
      1°  -> 111000001011111001100110000100110010101010000010
      2°  -> 111000001011011001110110000100000010001100000111
      3°  -> 111001001101011001110110101101100000000010000100
      4°  -> 111001101101001101110010010000000010001111000011
      5°  -> 101011101101001101110011001101101010000000001001
      6°  -> 101011110101001101011011011000100001010101000010
      7°  -> 001011110101001111011001000011001010000100101010
      8°  -> 000111110101100111011001011001000101110001000000
      9°  -> 000111110100100111011001010010101001100001000000
      10° -> 000111110110100110011101110000001100010100111000
      11° -> 000111110010110110001101000010010001111000001000
      12° -> 010110110010110010101101110110000101000000110000
      13° -> 110110011010110010101100000000010100101000101100
      14° -> 110100001010111010101110100100000011100010010000
      15° -> 111100001011111000100110101000010000001000110101
      16° -> 111100001011111000100110101000110100001010000000


      - En DES el mensaje que quieres encryptar debe ser dividido en bloques de 64 bits.

      Para el mensaje debemos realizar una permutación inicial con una nueva tabla IP (Initial Permutation):
      Cita de: IP
      58, 50, 42, 34, 26, 18, 10, 2,
      60, 52, 44, 36, 28, 20, 12, 4,
      62, 54, 46, 38, 30, 22, 14, 6,
      64, 56, 48, 40, 32, 24, 16, 8,
      57, 49, 41, 33, 25, 17, 9, 1,
      59, 51, 43, 35, 27, 19, 11, 3,
      61, 53, 45, 37, 29, 21, 13, 5,
      63, 55, 47, 39, 31, 23, 15, 7

      Usaré el mensaje "hello world" como ejemplo:
      h -> 01101000
      e -> 01100101
      l -> 01101100
      l -> 01101100
      o -> 01101111
        -> 00100000
      w -> 01110111
      o -> 01101111
      r -> 01110010
      l -> 01101100
      d -> 01100100

      En bloques de 64 bits es:
      0110100001100101011011000110110001101111001000000111011101101111
      011100100110110001100100

      Aquí tenemos un bloque de 64 bits y otro de 24.
      Para no complicar el proceso con el padding, rellenaré de ceros el resto del bloque hasta alcanzar los 64 bits.
      0110100001100101011011000110110001101111001000000111011101101111
      0111001001101100011001000000000000000000000000000000000000000000

      Ahora se aplica la tabla de permutación inicial (IP) a cada bloque:
      B1 -> 1101111101000000110111101101001000000000111111111001110111010000
      B2 -> 0000011100000001000001100000000000000000000001110000001000000001


      - Ahora se divide cada bloque a la mitad (32 bits).

      L  -> 11011111010000001101111011010010
      R -> 00000000111111111001110111010000

      (Este segundo bloque lo ignoraremos, porque hay distintas formas de combinar bloques, que esto ya no entra dentro de lo que es el propio algoritmo de DES y necesitaría una entrada propia)
      L  -> 00000111000000010000011000000000
      R -> 00000000000001110000001000000001

      - El siguiente paso es utilizar una función que toma como entradas una clave de 48 bits y un texto de 32 bits, para generar una salida de 32 bits.
      Usaremos las 16 claves de 48 bits que computamos en los pasos anteriores y los trozos de 32 bits que acabamos de hacer partiendo el mensaje en 2. Necesitamos aplicar las 16 claves a cada mitad usando una función.

      Las claves que ya teníamos:
      1°  -> 111000001011111001100110000100110010101010000010
      2°  -> 111000001011011001110110000100000010001100000111
      3°  -> 111001001101011001110110101101100000000010000100
      4°  -> 111001101101001101110010010000000010001111000011
      5°  -> 101011101101001101110011001101101010000000001001
      6°  -> 101011110101001101011011011000100001010101000010
      7°  -> 001011110101001111011001000011001010000100101010
      8°  -> 000111110101100111011001011001000101110001000000
      9°  -> 000111110100100111011001010010101001100001000000
      10° -> 000111110110100110011101110000001100010100111000
      11° -> 000111110010110110001101000010010001111000001000
      12° -> 010110110010110010101101110110000101000000110000
      13° -> 110110011010110010101100000000010100101000101100
      14° -> 110100001010111010101110100100000011100010010000
      15° -> 111100001011111000100110101000010000001000110101
      16° -> 111100001011111000100110101000110100001010000000

      El algoritmo que necesitamos utilizar es:
      Código
      1. L[n] = R[n - 1]
      2. R[n] = L[n - 1] XOR F(R[n - 1], K[n])
      L es el trozo izquierdo del bloque recientemente permutado
      R es el trozo derecho del bloque recientemente permutado
      XOR es una operación de Bits (Disyunción Exclusiva en Español).
      F es una función con múltiples pasos que se detallará en seguida.
      K es la clave.
      n es la iteración/ronda.


      Algoritmo para n = 1 (la primera vez que aplicas el algoritmo):
      Código
      1. n = 1;
      2. L[1] = R[0];
      3. R[1] = L[0] XOR F(R[0], K[1]);

      Código
      1. n = 1:
      2. R[0] = 00000000111111111001110111010000;
      3. L[1] = R[0]
      4. R[1] = 11011111010000001101111011010010 + F(00000000111111111001110111010000, 111000001011111001100110000100110010101010000010)

      - Ahora vamos a empezar con la función F:

      La función F utiliza una tabla de permutaciones (E) para expandir R[n - 1] de 32 bits a 48 bits.
      Cita de: E
      32, 1, 2, 3, 4, 5,
      4, 5, 6, 7, 8, 9,
      8, 9, 10, 11, 12, 13,
      12, 13, 14, 15, 16, 17,
      16, 17, 18, 19, 20, 21,
      20, 21, 22, 23, 24, 25,
      24, 25, 26, 27, 28, 29,
      28, 29, 30, 31, 32, 1

      En esta primera ronda, R[0] es 00000000111111111001110111010000

      Tras expandir R[0] usando la tabla (E) para realizar la permutación, se obtiene:
      000000000001011111111111110011111011111010100000

      - El siguiente paso de la función es realizar un XOR entre R[0] expandido y K[1] (La primera clave)
      000000000001011111111111110011111011111010100000 XOR 111000001011111001100110000100110010101010000010 -> 111000001010100110011001110111001001010000100010

      El siguiente paso de F incluye el uso de S-Boxes (cajas de substitución).
      Primero, hay que dividir el resultado de la clave xoreada con la mitad expandida del mensaje permutado en grupos de 6 bits:
      111000 001010 100110 011001 110111 001001 010000 100010

      La primera S-Box (S1) es:
      Cita de: S1
      14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
        0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
        4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
        15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13

      La S-Box es como un mapa de coordenadas. Hay que elegir el primer y el último bit de cada grupo de 6 bits para obtener la coluna y los bits restantes (en el medio) se utilizan para elegir la fila.
      En el caso de 111000:
      Primer y último bit -> 10
      Bits del medio -> 1100

      Los pasamos a decimal:
      10 -> 2
      1100 -> 12

      Y ahora empleamos estos 2 números como guía para obtener el decimotercero número de la tercera columna (Las columnas y filas empiezan a contar en 0).

      El número que obtenemos es el 3.
      3 -> 0011

      Es decir, usando la S-Box con 111000 como entrada, obtenemos como salida 0011.

      Ahora tenemos que repetir lo mismo para el resto de grupos de 6 bits, PERO necesitamos utilizar una S-Box distinta para cada grupo.

      Cita de: Las 8 S-Boxes (una para cada grupo de 6 bits)
       14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
        0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
        4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
        15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13
        
        15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
        3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
        0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
        13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9
        
        10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
        13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
        13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
        1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12
        
        7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
        13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
        10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
        3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14
            
        2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
        14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
        4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
        11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3
        
        12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
        10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
        9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
        4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13
        
        4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
        13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
        1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
        6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12
        
        13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
        1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
        7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
        2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11

      Aquí el código que utilicé para generar todos los bits, utilizando los grupos y las cajas de substitución:
      Código
      1. const transformSboxes = (groups, sboxes) => {
      2.  const ret = [];
      3.  for (let i in groups) {
      4.    const column = parseInt(groups[i][0] + groups[i][5], 2);
      5.    const field = parseInt(groups[i].substring(1, 5), 2);
      6.    let res = sboxes[i][column][field].toString(2);
      7.    if (res.length < 4) {
      8.      res = "0".repeat(4 - res.length) + res;
      9.    }
      10.    ret.push(res);
      11.  }
      12.  
      13.  return ret;
      14. }
      15.  
      16. const groups = [
      17.  "111000",
      18.  "001010",
      19.  "100110",
      20.  "011001",
      21.  "110111",
      22.  "001001",
      23.  "010000",
      24.  "100010"
      25. ]
      26.  
      27. const sBox = [
      28.  
      29.  [
      30.    [14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7],
      31.    [0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8],
      32.    [4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0],
      33.    [15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13]               ],
      34.  
      35.  [
      36.    [15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10],
      37.    [3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5],
      38.    [0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15],
      39.    [13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9]
      40.  ],
      41.  
      42.  [
      43.    [10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8],
      44.    [13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1],
      45.    [13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7],
      46.    [1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12]
      47.  ],
      48.  
      49.  
      50.  [
      51.    [7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15],
      52.    [13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9],
      53.    [10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4],
      54.    [3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14]
      55.  ],
      56.  
      57.  [
      58.    [2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9],
      59.    [14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6],
      60.    [4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14],
      61.    [11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3]
      62.  ],
      63.  
      64.  [
      65.    [12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11],
      66.    [10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8],
      67.    [9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6],
      68.    [4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13]
      69.  ],
      70.  
      71.  [
      72.    [4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1],
      73.    [13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6],
      74.    [1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2],
      75.    [6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12]
      76.  ],
      77.  
      78.  [
      79.    [13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7],
      80.    [1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2],
      81.    [7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8],
      82.    [2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11]
      83.  ]
      84. ];
      85.  
      86.  
      87. const res = transformSboxes(groups, sBox);
      88. console.log(res);
      89. /* END CODE */

      Resultado:
      0011 1011 1001 0001 1001 0111 0011 1011

      De momento tenemos:
      R[1] = 11011111010000001101111011010010 XOR F(0011 1011 1001 0001 1001 0111 0011 1011)

      El último paso de la función es otra permutación:
      Cita de: P
      16, 7, 20, 21,
      29, 12, 28, 17,
      1, 15, 23, 26,
      5, 18, 31, 10,
      2, 8, 24, 14,
      32, 27, 3, 9,
      19, 13, 30, 6,
      22, 11, 4, 25

      El resultado de F es 11101111001010100110111100001010

      Ahora tenemos que hacer xor a L[0] y al resultado de F para obtener R[1]:
      R[1] = 11011111010000001101111011010010 XOR 11101111001010100110111100001010
      R[1] -> 00110000011010101011000111011000

      Ya finalizamos la primera ronda para n = 1. Recuerda:
      Cita de: Algoritmo para n = 1
      n = 1
      L[1] = R[0]
      R[1] = L[0] XOR F(R[0], K[1])

      Ahora hay que realizar los mismos pasos para n = 2:
      Cita de: Algoritmo para n = 2
      n = 2
      L[2] = R[1]
      R[2] = L[1] XOR F(R[1], K[2])

      Cuando finalizes todas las rondas (16), tendrás L[16] y R[16] (32 bits cada uno)
      Solo te faltará darle la vuelta al orden. Ejemplo
      Si L[16] es 00110000011010101011000111011000 y R[16] es 10110000011010101011000111011001 tendrás:
      1011000001101010101100011101100100110000011010101011000111011000

      Y aplicas la última permutación
      Cita de: P-1
      40, 8, 48, 16, 56, 24, 64, 32,
      39, 7, 47, 15, 55, 23, 63, 31,
      38, 6, 46, 14, 54, 22, 62, 30,
      37, 5, 45, 13, 53, 21, 61, 29,
      36, 4, 44, 12, 52, 20, 60, 28,
      35, 3, 43, 11, 51, 19, 59, 27,
      34, 2, 42, 10, 50, 18, 58, 26,
      33, 1, 41, 9, 49, 17, 57, 25

      El resultado es tu mensaje cifrado con DES.

      Para descifrar es exactamente lo mismo.
      Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 20
      WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines