Laboratorio 4 Sebastian Gonzalez

Obtener llave mediante las mayúsculas, contar clases M y descifrar mensajes

// ==UserScript==
// @name         Laboratorio 4 Sebastian Gonzalez
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  Obtener llave mediante las mayúsculas, contar clases M y descifrar mensajes
// @author       Sebastián González
// @match        https://cripto.tiiny.site/
// @grant        none
// @require      https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.2.0/crypto-js.min.js#sha512-a+SUDuwNzXDvz4XrIcXHuCf089/iJAoN4lmrXJg18XnduKK6YlDHNRalv4yd1N40OKI80tFidF+rqTFKGPoWFQ==
// ==/UserScript==

(function() {
    'use strict';

    // Función para obtener llave
    function obtenerLlave() {
        const contenido = document.body.innerText;
        const regex = /(?:^|[.!?]\s)([A-ZÁÉÍÓÚÑ])/g;
        let matches;
        const mayusculasEncontradas = [];

        while ((matches = regex.exec(contenido)) !== null) {
            mayusculasEncontradas.push(matches[1]);
        }

        if (mayusculasEncontradas.length > 0) {
            const mayusculasUnicas = mayusculasEncontradas.join('');
            console.log('La llave es:', mayusculasUnicas);
            return mayusculasUnicas;
        } else {
            console.log('No se encontró la llave.');
            return null;
        }
    }

    // Función para contar mensajes cifrados y guardar los IDs
    function contarMcifrados() {
        const divsConClasesM = document.querySelectorAll('div[class^="M"]');
        const cantidadDivs = divsConClasesM.length;
        const idsMensajes = [];

        divsConClasesM.forEach((div) => {
            const id = div.id;
            idsMensajes.push(id);
        });

        console.log(`Los mensajes cifrados son: ${cantidadDivs}`);

        // Llamar a la función para descifrar mensajes
        const llave = obtenerLlave();
        if (llave) {
            const mensajesDescifrados = desencriptarMatriz(idsMensajes, llave);
            for (let i = 0; i < Math.min(idsMensajes.length, mensajesDescifrados.length); i++) {
            console.log(`${idsMensajes[i]} ${mensajesDescifrados[i]}`);
            }
            // Mostrar los mensajes descifrados en el HTML
            mostrarMensajesDescifrados(mensajesDescifrados);
        }
    }

    // Función para desencriptar una matriz de valores en base64 utilizando 3DES
    function desencriptarMatriz(matrizEncriptada, clave) {
        return matrizEncriptada.map(function(valorEnBase64) {
            var valorDecodificado = CryptoJS.enc.Base64.parse(valorEnBase64);
            var key = CryptoJS.enc.Utf8.parse(clave);
            var decrypted = CryptoJS.TripleDES.decrypt({
                ciphertext: valorDecodificado
            }, key, {
                mode: CryptoJS.mode.ECB,
                padding: CryptoJS.pad.Pkcs7
            });
            return CryptoJS.enc.Utf8.stringify(decrypted);
        });
    }

    // Función para mostrar mensajes descifrados en el HTML
    function mostrarMensajesDescifrados(mensajesDescifrados) {
        // Crear un contenedor para mostrar los mensajes descifrados
        const contenedorMensajes = document.createElement('div');
        contenedorMensajes.id = 'mensajesDescifradosContainer';
        document.body.appendChild(contenedorMensajes);

        // Mostrar cada mensaje descifrado en el contenedor
        mensajesDescifrados.forEach((mensaje, index) => {
            const elementoMensaje = document.createElement('p');
            elementoMensaje.textContent = `${mensaje}`;
            contenedorMensajes.appendChild(elementoMensaje);
        });
    }

    // Llamar a ambas funciones al cargar la página
    window.addEventListener('load', () => {
        contarMcifrados();
    });

})();