Logo Studenta

Programación - CIBERSEGURIDAD CRIPTOGRAFIA 1 ALGORITMOS

¡Este material tiene más páginas!

Vista previa del material en texto

Criptografía: 
La criptografía es el estudio y la práctica de técnicas que se utilizan para proteger la información y los datos mediante la aplicación de algoritmos matemáticos. Su objetivo principal es garantizar la confidencialidad, integridad y autenticidad de los datos en tránsito, es decir, mientras se están transmitiendo de un punto a otro.
Existen diferentes aspectos importantes en la criptografía que se estudian en el campo de la ciberseguridad:
Estudiar los algoritmos y métodos criptográficos utilizados para proteger la confidencialidad,
Existen varios algoritmos y métodos criptográficos utilizados para proteger la confidencialidad de los datos. Algunos de los más comunes son:
AES (Advanced Encryption Standard): Es uno de los algoritmos de cifrado simétrico más ampliamente utilizados. Utiliza una clave de 128, 192 o 256 bits para cifrar y descifrar los datos. AES ha sido adoptado por el gobierno de los Estados Unidos como estándar de cifrado y es ampliamente utilizado en aplicaciones y protocolos de seguridad.
aquí tienes un ejemplo en código de cómo utilizar AES (Advanced Encryption Standard) en el lenguaje de programación Python utilizando la biblioteca criptográfica pycryptodome:
 
En este ejemplo, se genera una clave aleatoria de 256 bits utilizando get_random_bytes() de la biblioteca Crypto.Random. Luego, se crea un objeto AES con el modo ECB (Electronic Codebook) utilizando la clave generada. Los datos a cifrar se pasan a través de pad() para agregar el padding necesario antes de cifrarlos con encrypt(). Los datos cifrados se imprimen en formato hexadecimal.
Después, se descifran los datos utilizando decrypt() y se eliminan los bytes de padding utilizando unpad(). Los datos descifrados se imprimen en su forma original.
Es importante tener en cuenta que el modo ECB utilizado en este ejemplo no es seguro para cifrar grandes cantidades de datos debido a la falta de aleatoriedad en los bloques de cifrado. Se recomienda utilizar modos de cifrado más seguros, como CBC (Cipher Block Chaining) o CTR (Counter), junto con un vector de inicialización único (IV) para cada bloque de datos.
3DES (Triple Data Encryption Standard): Es una versión mejorada del algoritmo DES (Data Encryption Standard). Utiliza una clave de 168 bits y aplica tres rondas de cifrado DES para proporcionar una mayor seguridad. Aunque ha sido ampliamente utilizado en el pasado, se considera más lento y menos seguro en comparación con AES.
aquí tienes un ejemplo en código de cómo utilizar 3DES (Triple Data Encryption Standard) en el lenguaje de programación Python utilizando la biblioteca pycryptodome:
En este ejemplo, se genera una clave aleatoria de 24 bytes utilizando get_random_bytes() de la biblioteca Crypto.Random. Luego, se crea un objeto 3DES en modo CBC (Cipher Block Chaining) utilizando la clave generada.
Los datos a cifrar se pasan directamente al método encrypt(). Los datos cifrados se imprimen en formato hexadecimal.
Luego, se descifran los datos utilizando el método decrypt(). Los datos descifrados se imprimen en su forma original.
Es importante destacar que 3DES es una versión mejorada del algoritmo DES y utiliza tres rondas de cifrado DES para proporcionar mayor seguridad. Sin embargo, debido a su eficiencia computacional más lenta y a la disponibilidad de algoritmos más seguros, como AES, 3DES no es ampliamente recomendado para nuevos sistemas y aplicaciones.
RSA (Rivest-Shamir-Adleman): Es un algoritmo de cifrado asimétrico utilizado para proteger la confidencialidad de los datos mediante el intercambio seguro de claves. Se basa en la factorización de números primos y utiliza un par de claves: una clave pública para cifrar los datos y una clave privada para descifrarlos.
aquí tienes un ejemplo en código de cómo utilizar RSA (Rivest-Shamir-Adleman) en el lenguaje de programación Python utilizando la biblioteca pycryptodome:
 
En este ejemplo, se genera un par de claves RSA utilizando RSA.generate() de la biblioteca Crypto.PublicKey. Luego, se obtiene la clave pública y privada del par generado.
Los datos a cifrar se pasan al objeto PKCS1_OAEP junto con la clave pública para crear un objeto de cifrado. El método encrypt() se utiliza para cifrar los datos.
Los datos cifrados se imprimen en formato hexadecimal.
Después, se crea un objeto de descifrado utilizando la clave privada y el mismo algoritmo PKCS1_OAEP. El método decrypt() se utiliza para descifrar los datos cifrados.
Finalmente, los datos descifrados se imprimen en su forma original.
Recuerda que RSA es un algoritmo de cifrado asimétrico que utiliza un par de claves: una clave pública para cifrar los datos y una clave privada para descifrarlos.
ECC (Elliptic Curve Cryptography): Es otro algoritmo de cifrado asimétrico que utiliza curvas elípticas en lugar de operaciones matemáticas complejas. Proporciona el mismo nivel de seguridad con claves más cortas en comparación con RSA, lo que lo hace más eficiente en términos de recursos computacionales.
aquí tienes un ejemplo en código de cómo utilizar ECC (Elliptic Curve Cryptography) en el lenguaje de programación Python utilizando la biblioteca cryptography:
 
En este ejemplo, se genera una clave privada ECC utilizando ec.generate_private_key() de la biblioteca cryptography. Luego, se obtiene la clave pública correspondiente.
La clave privada se convierte en formato PEM utilizando private_bytes(), y la clave pública se convierte también en formato PEM utilizando public_bytes().
Los datos a cifrar se pasan al método encrypt() de la clave pública junto con el algoritmo ec.ECIES() para cifrar los datos.
Los datos cifrados se imprimen en formato hexadecimal.
Luego, se utiliza la clave privada para descifrar los datos cifrados utilizando el método decrypt() con el mismo algoritmo ec.ECIES().
Finalmente, los datos descifrados se imprimen en su forma original.
Es importante tener en cuenta que ECC utiliza curvas elípticas en lugar de operaciones matemáticas complejas para proporcionar seguridad criptográfica.
Además de estos algoritmos, también se utilizan otros métodos criptográficos para proteger la confidencialidad de los datos, como el cifrado por bloques, por ejemplo:
 modo CBC
El cifrado por bloques, como el modo CBC (Cipher Block Chaining), es una técnica utilizada en criptografía para cifrar y descifrar datos en bloques fijos. A continuación, te explico cómo funciona el modo CBC:
División en bloques: Los datos a cifrar se dividen en bloques de tamaño fijo. En el caso del modo CBC, cada bloque debe tener la misma longitud. Si el último bloque es más corto que el tamaño definido, se debe aplicar algún tipo de relleno (padding) para que tenga la misma longitud.
Inicialización del vector de inicialización (IV): El IV es un valor aleatorio o pseudoaleatorio que se utiliza como el primer bloque de entrada en el proceso de cifrado. El IV se combina con el primer bloque de datos antes de cifrarlo.
Operación XOR: Para cifrar cada bloque, se realiza una operación XOR (exclusiva OR) entre el bloque de datos actual y el resultado del cifrado del bloque anterior (o el IV en el caso del primer bloque). Esto garantiza que cada bloque de datos sea único y no se repita en el cifrado.
Cifrado: Cada bloque de datos, después de la operación XOR, se cifra utilizando un algoritmo de cifrado simétrico, como AES (Advanced Encryption Standard), DES (Data Encryption Standard) o 3DES (Triple Data Encryption Standard).
Iteración: Los pasos 3 y 4 se repiten para cada bloque de datos hasta que se hayan cifrado todos los bloques.
Bloque de salida: Los bloques cifrados se concatenan en el orden en que fueron cifrados para formar el mensaje cifrado final.
El proceso de descifrado en modo CBC es similar pero en sentido inverso. Los bloques cifrados se descifran utilizando el mismo algoritmo de cifrado y luego se realiza una operación XOR con el bloque cifrado anterior (o el IV en el caso del primer bloque) para obtener el bloque de datos original.
Es importante tener en cuenta que el modo CBC requiere un IV único y aleatoriopara cada cifrado para garantizar la seguridad. Además, el relleno (padding) utilizado para el último bloque de datos debe ser reversible y verificable durante el proceso de descifrado.
Aquí tienes un ejemplo en código de cómo utilizar el modo CBC en Python utilizando la biblioteca cryptography:
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from cryptography.hazmat.primitives import serialization
# Datos a cifrar
data = b'Este es un mensaje secreto'
# Contraseña y salt para la generación de clave
password = b'mi_contrasena_segura'
salt = b'mi_salt_aleatorio'
# Generación de clave mediante PBKDF2
kdf = PBKDF2HMAC(
 algorithm=hashes.SHA256(),
 length=32,
 salt=salt,
 iterations=100000,
 backend=default_backend()
)
key = kdf.derive(password)
# Generación de IV aleatorio
iv = b'mi_vector_inicial'
# Crear un objeto Cipher con el algoritmo AES y el modo CBC
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())
# Obtener el objeto de cifrado y descifrado
encryptor = cipher.encryptor()
decryptor = cipher.decryptor()
# Relleno PKCS7 para el último bloque
padder = padding.PKCS7(algorithms.AES.block_size).padder()
unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder()
# Cifrado
padded_data = padder.update(data) + padder.finalize()
ciphertext = encryptor.update(padded_data) + encryptor.finalize()
# Descifrado
decrypted_data = decryptor.update(ciphertext) + decryptor.finalize()
unpadded_data = unpadder.update(decrypted_data) + unpadder.finalize()
# Imprimir los resultados
print("Datos originales:", data)
print("Datos cifrados:", ciphertext)
print("Datos descifrados:", unpadded_data)
Recuerda que el cifrado por bloques en modo CBC es solo una de las muchas técnicas utilizadas en criptografía. La elección del modo de cifrado adecuado depende de los requisitos de seguridad y del contexto de uso.
 
cifrado por bloques modo CTR) 
El cifrado por bloques en modo CTR (Counter) es otra técnica utilizada en criptografía para cifrar datos en bloques fijos. A diferencia del modo CBC, en el que cada bloque se cifra utilizando el bloque cifrado anterior, en el modo CTR se utiliza un contador para generar una secuencia de valores de cifrado que luego se combinan con los bloques de datos originales mediante una operación XOR.
Aquí tienes una explicación paso a paso de cómo funciona el modo CTR:
División en bloques: Los datos a cifrar se dividen en bloques de tamaño fijo, donde cada bloque debe tener la misma longitud.
Generación de una secuencia de valores de cifrado: Se utiliza un contador para generar una secuencia de valores de cifrado utilizando un algoritmo de cifrado simétrico, como AES (Advanced Encryption Standard). Cada valor de cifrado se genera cifrando un bloque de datos fijo, conocido como nonce (número utilizado solo una vez), concatenado con el contador.
Operación XOR: Cada bloque de datos original se combina con el valor de cifrado correspondiente mediante una operación XOR. Esto garantiza la confidencialidad de los datos y evita la repetición de bloques cifrados.
Iteración: Los pasos 2 y 3 se repiten para cada bloque de datos hasta que se hayan cifrado todos los bloques.
Bloque de salida: Los bloques cifrados resultantes se concatenan en el orden en que fueron cifrados para formar el mensaje cifrado final.
El proceso de descifrado en modo CTR es similar al cifrado. Se genera la misma secuencia de valores de cifrado utilizando el contador y el mismo algoritmo de cifrado. Luego, se realiza una operación XOR entre los bloques de datos cifrados y los valores de cifrado correspondientes para obtener los bloques de datos originales.
Aquí tienes un ejemplo en código de cómo utilizar el modo CTR en Python utilizando la biblioteca cryptography:
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
from cryptography.hazmat.backends import default_backend
# Datos a cifrar
data = b'Este es un mensaje secreto'
# Contraseña y nonce para la generación de clave
password = b'mi_contrasena_segura'
nonce = b'mi_nonce_aleatorio'
# Generación de clave y IV
backend = default_backend()
cipher = Cipher(algorithms.AES(password), modes.CTR(nonce), backend=backend)
# Obtener el objeto de cifrado y descifrado
encryptor = cipher.encryptor()
decryptor = cipher.decryptor()
# Cifrado
ciphertext = encryptor.update(data) + encryptor.finalize()
# Descifrado
decrypted_data = decryptor.update(ciphertext) + decryptor.finalize()
# Imprimir los resultados
print("Datos originales:", data)
print("Datos cifrados:", ciphertext)
print("Datos descifrados:", decrypted_data)
En este ejemplo, se utiliza el algoritmo AES con una contraseña y un nonce para generar la clave y el IV. El objeto Cipher se crea con el algoritmo AES y el modo CTR, utilizando el nonce generado.
Luego, se obtienen los objetos de cifrado y descifrado a partir del Cipher. El cifrado se realiza llamando al método update() con los datos originales, y el descifrado se realiza llamando al método update() con los datos cifrados.
Es importante destacar que el modo CTR no proporciona integridad ni autenticidad de los datos cifrados. Si se requieren estas características, es necesario utilizar técnicas adicionales, como el uso de funciones hash o firmas digitales.
cifrado por flujo (por ejemplo, RC4).
El cifrado por flujo, como el algoritmo RC4 (Rivest Cipher 4), es otro método criptográfico utilizado para cifrar datos en tiempo real. A diferencia del cifrado por bloques, que opera en bloques fijos, el cifrado por flujo opera en un flujo continuo de bits.
Aquí tienes una explicación paso a paso de cómo funciona el cifrado por flujo con el algoritmo RC4:
Generación de la clave: Se genera una clave secreta de tamaño adecuado para el algoritmo RC4.
Inicialización del generador de secuencias: Se inicializa un generador de secuencias pseudoaleatorias (PRNG) con la clave generada. En el caso del RC4, el PRNG utiliza una permutación de bytes interna basada en la clave.
Generación del flujo cifrado: El PRNG genera un flujo continuo de bytes pseudoaleatorios. Este flujo se combina mediante una operación XOR con los datos originales para producir los datos cifrados.
Iteración: El paso 3 se repite para cada byte de los datos originales hasta que se hayan cifrado todos los datos.
Bloque de salida: Los bytes cifrados resultantes se concatenan en el orden en que fueron generados para formar el mensaje cifrado final.
El proceso de descifrado es similar al cifrado. Se genera el mismo flujo de bytes pseudoaleatorios utilizando el mismo PRNG y clave. Luego, se realiza una operación XOR entre los bytes cifrados y el flujo pseudoaleatorio correspondiente para obtener los datos originales.
Aquí tienes un ejemplo en código de cómo utilizar el cifrado por flujo con el algoritmo RC4 en Python:
from Crypto.Cipher import ARC4
# Datos a cifrar
data = b'Este es un mensaje secreto'
# Clave secreta
key = b'mi_clave_secreta'
# Crear el objeto de cifrado
cipher = ARC4.new(key)
# Cifrado
ciphertext = cipher.encrypt(data)
# Descifrado
decrypted_data = cipher.decrypt(ciphertext)
# Imprimir los resultados
print("Datos originales:", data)
print("Datos cifrados:", ciphertext)
print("Datos descifrados:", decrypted_data)
En este ejemplo, se utiliza la biblioteca pycryptodome y la clase ARC4 para crear el objeto de cifrado. Se proporciona la clave secreta al objeto de cifrado mediante el método new(). Luego, se utiliza el método encrypt() para cifrar los datos y el método decrypt() para descifrarlos.
Es importante tener en cuenta que el algoritmo RC4 ha sido considerado inseguro y se recomienda utilizar algoritmos más modernos y seguros, como AES, en su lugar.
 Estos métodos se utilizan en diferentes contextos y aplicaciones según lasnecesidades específicas de seguridad y rendimiento.
Es importante destacar que la elección del algoritmo y método criptográfico adecuados depende de varios factores, como el nivel de seguridad requerido, los recursos disponibles y las limitaciones del sistema en el que se implementará la protección de confidencialidad.

Continuar navegando