La criptografía siempre me ha fascinado. ¿Cómo es posible que un mensaje pueda viajar por internet sin que nadie (excepto el destinatario) pueda leerlo? Cuando en mi clase de Seguridad Informática nos pidieron crear nuestro propio algoritmo de encriptación, vi la oportunidad perfecta para explorar estos conceptos.
Cryptography has always fascinated me. How is it possible for a message to travel across the internet without anyone (except the recipient) being able to read it? When in my Computer Security class we were asked to create our own encryption algorithm, I saw the perfect opportunity to explore these concepts.
⚠️ Disclaimer: Este algoritmo es un ejercicio educativo. No es criptográficamente seguro para uso real. Para aplicaciones reales, usa librerías probadas como bcrypt, crypto o AES.
⚠️ Disclaimer: This algorithm is an educational exercise. It is not cryptographically secure for real-world use. For real applications, use proven libraries like bcrypt, crypto, or AES.
🔗 Código fuente: Ver repositorio en GitHub
🔗 Source code: View repository on GitHub
El algoritmo se basa en dos conceptos matemáticos simples pero poderosos: código ASCII y números primos. La belleza está en cómo los combinamos:
The algorithm is based on two simple yet powerful mathematical concepts: ASCII code and prime numbers. The beauty lies in how we combine them:
Veamos paso a paso cómo encriptamos la palabra "Osc":
Let's see step by step how we encrypt the word "Osc":
Separamos cada letra: ['O', 's', 'c']
We separate each letter: ['O', 's', 'c']
Cada carácter tiene un valor numérico único:
Each character has a unique numeric value:
'O' → 79's' → 115'c' → 99Usamos dos primos como "llaves": 7 y 3
We use two primes as "keys": 7 and 3
Esto permite identificar dónde empieza y termina cada carácter:
This allows identifying where each character starts and ends:
001659 | 002415 | 002079
001659002415002079
Reemplazamos dígitos por símbolos para añadir confusión:
We replace digits with symbols to add confusion:
0 → !1 → #3 → $Resultado: !!#659!!24#5!!2!79
// Algoritmo de Encriptación
function encrypt(text) {
const PRIME_1 = 7;
const PRIME_2 = 3;
let result = '';
for (let char of text) {
// Convertir a ASCII y multiplicar por primos
const ascii = char.charCodeAt(0);
const encrypted = ascii * PRIME_1 * PRIME_2;
// Formatear a 6 dígitos
const formatted = encrypted.toString().padStart(6, '0');
result += formatted;
}
// Reemplazar números por símbolos
return result
.replace(/0/g, '!')
.replace(/1/g, '#')
.replace(/3/g, '$');
}
// Algoritmo de Desencriptación
function decrypt(encryptedText) {
const PRIME_1 = 7;
const PRIME_2 = 3;
// Revertir reemplazos
let numbers = encryptedText
.replace(/!/g, '0')
.replace(/#/g, '1')
.replace(/\$/g, '3');
let result = '';
// Procesar en bloques de 6 dígitos
for (let i = 0; i < numbers.length; i += 6) {
const block = numbers.substring(i, i + 6);
const num = parseInt(block, 10);
// Dividir por los primos para obtener ASCII
const ascii = num / (PRIME_1 * PRIME_2);
result += String.fromCharCode(ascii);
}
return result;
}
// Ejemplos de uso
console.log(encrypt('Osc')); // !!#659!!24#5!!2!79
console.log(decrypt('!!#659!!24#5!!2!79')); // Osc
Para hacer el algoritmo accesible desde cualquier aplicación, creé una pequeña API REST:
To make the algorithm accessible from any application, I created a small REST API:
// Ejemplo de request
fetch('/encrypto', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ text: 'Hola Mundo' })
});
// Response
{
"success": true,
"original": "Hola Mundo",
"encrypted": "!!#5#2!!24!9!!#995!!2!#!..."
}
Este ejercicio me enseñó varios conceptos fundamentales de criptografía:
This exercise taught me several fundamental cryptography concepts:
Por supuesto, los algoritmos reales como AES, RSA o bcrypt son infinitamente más complejos y seguros. Pero entender estos principios básicos es el primer paso para comprender la criptografía moderna.
Of course, real algorithms like AES, RSA, or bcrypt are infinitely more complex and secure. But understanding these basic principles is the first step toward comprehending modern cryptography.
¡La seguridad informática es fascinante! Si te interesa el tema, te recomiendo explorar conceptos como hashing, salt, criptografía asimétrica y firmas digitales.
Computer security is fascinating! If you're interested in the topic, I recommend exploring concepts like hashing, salt, asymmetric cryptography, and digital signatures.