__ Indice __
¿Qué es la criptografía?
¿Qué es cifrar?
Tipos de cifrado
Cifrado por sustitución en NodeJS
Código
Github
PD
Github
PD
__ ¿Qué es la criptografía? __
Se ha definido como el uso de técnicas para alterar estructuras lingüísticas de ciertos mensajes, con el fin de hacerlos ininteligible a receptores no deseados.
Estás técnicas se han utilizado en todas las áreas de conocimiento humanos, ya sea en la ciencia, tecnología y arte, así que el fin de la criptografía es el de conseguir confidencialidad en la información
Con la aparición de la informática, y el creciente uso de la digitalización. Ha hecho que el tema de privacidad sea cada vez más importante, ya que la transición de un usuario por la red puede ser interceptada y con ello nuestros datos se vuelven vulnerables.
Para lograr esto, se han creado lo que se llama, cifrados.
__ ¿Qué es un cifrado? __
El procedimiento mediante un algoritmo para transformar un mensaje, este con el fin que sea incomprensible, o al menos, difícil de entender a cualquier persona que no cuenta con la clave de seguridad
El juego de caracteres (alfabeto) usado en el mensaje sin cifrar puede no ser el mismo que el juego de caracteres que se usa en el mensaje cifrado.
A veces el texto cifrado se escribe en bloques de igual longitud. A estos bloques se les denomina grupos.
Estos grupos proporcionaban una forma de verificación adicional, ya que
el texto cifrado obtenido debía tener un número entero de grupos. Si al
cifrar el texto plano no se tiene ese número entero de grupos, entonces
se suele rellenar al final con ceros o con caracteres sin sentido.
Aunque el cifrado pueda volver secreto el contenido de un documento, es necesario complementarlo con otras técnicas criptográficas para poder comunicarse de manera segura. Puede ser necesario garantizar la integridad la autenticación de las partes, etcétera.
__ Tipos de cifrado __
Un sistema de cifrado se denomina:
- simétrico cuando utiliza la misma clave para cifrar y descifrar. Los métodos más conocidos de este tipo de cifrado son el DES, el Triple DES y el AES.
- asimétrico al usar claves diferentes: una pareja compuesta por una clave pública, que sirve para cifrar, y por una clave privada, que sirve para descifrar. El punto fundamental sobre el que se sostiene esta descomposición pública/privada es la imposibilidad práctica de deducir la clave privada a partir de la clave pública. A este tipo de cifrado también se le llama criptografía de clave pública o PKE (del inglés Public-Key Encryption). Los métodos más conocidos de este tipo de cifrado son el RSA y ElGamal.
La utilización de un sistema simétrico o asimétrico depende de las
tareas a cumplir. La criptografía asimétrica presenta dos ventajas
principales: suprime el problema de transmisión segura de la clave y
permite la firma electrónica.
No reemplaza sin embargo los sistemas simétricos, ya que los tiempos de
cálculo son evidentemente más cortos con los sistemas simétricos que
con los asimétricos.
__ Cifrado por sustitución __
El cifrado que vamos a realizar, es bastante simple. En cada blog, iremos poco a poco subiendo la dificultad.
El concepto es el siguiente:
Separaremos el abecedario en dos mitades, la primera de la A hasta la M, y la segunda cadena será de la N hasta la Z. Y vamos a estar sustituyendo la letra de una cadena, por otra letra que se encuentre en la misma posición de la otra mitad
A B C D E F G H I J K L M
↕ ↕ ↕ ↕ ↕ ↕ ↕ ↕ ↕ ↕ ↕ ↕ ↕
N O P Q R S T U V W X Y Z
Ahora vamos a realizar esto en nodejs, lo primero es importar los módulos que utilizaremos a lo largo del proyecto.
readline: Es para poder leer datos de entrada medienta el teclado en la consola de node
chalk: Nos permite imprimir nuestro texto con rgb, lo que significa que podremos darle color al texto mostrado en la consola, solamente para que se vea bonito.
La primera función que vamos a hacer, será la de recibir el texto del usuario.
readline nos pide crear una interfaz de entrada y salida (readline.createInterface()), que será el proceso donde mostraremos el texto al usuario que indicará que tiene que ingresar una palabra.
lo siguiente es lanzar la pregunta y esperar la respuesta del usuario:
Pregunta: "Ingresar la palabra que sea cifrar o descifrar"
Respuesta: Será e texto
la parte de: createCryptoText(respuesta.toString().toUpperCase()) <= Aquí estamos mandando el texto a la siguiente función que tenemos que crear, donde le mandamos el texto del usuario.toString(): Es para convertir el valor del usuario a tipo cadena de caracteres (String)
toUppercase(): Es para convertir todo nuestro texto en mayúsculas
La siguiente función ya es la interesante, esta recibe como parámetro el texto que el usuario ha introducido.
separator: Guardará cada una de las letras que vayamos sacando del texto.
n: Guardará el código ASCII de cada letra, el código ASCII es la representación numérica de cada carácter en el teclado, A = 65, Z = 90 Así con una simple suma o resta, podemos intercambiar los caracteres.
textCrypto: Guardará todo el arreglo ya cifrado del texto
arrayText: Guardará el arreglo del texto original del usuario
Al final, solamente con un foreach recorremos el arreglo, sacamos su valor de cada letra en código ASCCI con charCodeAt(), y con una condición evaluamos si la letra es menor o igual a M, si es así solamente le sumamos 13 posiciones para sacar su equivalente en la otra cadena, y si es mayor, le restamos la misma cantidad.
A = 65
N = 78
65 + 13 = 78 = N
Si lo que detectamos es un espacio en blanco, que su valor en ASCII es 32, lo vamos a cambiar por el signo que numeral.
Ya por último, mostramos el arreglo cifrado, y con otro foreach, mostramos carácter por carácter para formar la palabra entera.
Para imprimirlo, podemos ver que utilizamos chalk, para darle color
La función menu, solamente tiene como propósito hacer que el proyecto se vea más profesional, así que su función es hacer el código más estético.
Hemos terminado :D
__ Código __
const readline = require('readline');
const chalk = require('chalk');
function readText() {
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('Ingresar la palabra que desea cifrar o descifrar: ', (respuesta) => {
createCryptoText(respuesta.toString().toUpperCase())
rl.close();
});
}
function createCryptoText(text) {
let separator = "", n
let textCrypto = []
let arrayText = text.split(separator)
console.log(chalk.blue('\nArreglo del original: \n'))
console.log(arrayText)
arrayText.forEach(element => {
if(element.charCodeAt() < 78 && element.charCodeAt() >= 65) {
n = parseInt(element.charCodeAt())
textCrypto.push(String.fromCharCode(n + 13))
} else if(element.charCodeAt() >= 65) {
n = parseInt(element.charCodeAt())
textCrypto.push(String.fromCharCode(n - 13))
} else if(element.charCodeAt() == 32) {
textCrypto.push("#")
} else if(element == "#") {
textCrypto.push(" ")
}
})
console.log(chalk.red('\nArreglo de crypto: \n'))
console.log(textCrypto)
arrayText = " "
textCrypto.forEach(element => {
arrayText += element
})
console.log(chalk.yellow("\nTexto terminado: " + arrayText))
}
function menu() {
let banner =
`
██████╗██████╗ ██╗ ██╗██████╗ ████████╗ ██████╗
██╔════╝██╔══██╗╚██╗ ██╔╝██╔══██╗╚══██╔══╝██╔═══██╗
██║ ██████╔╝ ╚████╔╝ ██████╔╝ ██║ ██║ ██║
██║ ██╔══██╗ ╚██╔╝ ██╔═══╝ ██║ ██║ ██║
╚ ██████╗██║ ██║ ██║ ██║ ██║ ╚██████╔╝
╚═════╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝
`
console.log(banner)
readText()
}
menu()
Comentarios
Publicar un comentario