-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
f48272a
commit d0aec9e
Showing
28 changed files
with
921 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
[[source]] | ||
url = "https://pypi.org/simple" | ||
verify_ssl = true | ||
name = "pypi" | ||
|
||
[packages] | ||
pycryptodome = "*" | ||
numpy = "1.24.4" | ||
|
||
[dev-packages] | ||
|
||
[requires] | ||
python_version = "3.11" |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,83 @@ | ||
# Shamir-s-Shared-Secret | ||
Implementación en Python del Secreto Compartido de Shamir. Realizado para la materia de Modelo y Programación Curso 2024-1 | ||
# Shamir's Shared Secret | ||
|
||
## Dependencias | ||
|
||
Primeramente es necesario tener Python y Git instalados en el sistema en sus versiones más recientes. | ||
|
||
La mejor forma de hacerlo es seguir las instrucciones oficiales tanto del lenguaje | ||
de programación como del programa, ambas en sus webs oficiales. | ||
|
||
Uno puede instalar Python dando click [aquí](https://www.python.org/downloads/). | ||
Por su lado, las descargas de Git se encuentran en [este enlace](https://git-scm.com/downloads). | ||
|
||
Es necesario seguir las instrucciones en pantalla de ambos programas antes de seguir | ||
con los pasos siguientes. | ||
|
||
Ahora se abre una terminal (en Windows puede ser Powershell o cmd, en sistemas Mac y Linux la preferida funciona sin | ||
ningun problema) y se introduce lo siguiente: | ||
|
||
``` | ||
git clone https://github.com/Santi24Yt/shamir | ||
cd cloudcover/ | ||
``` | ||
|
||
Posteriormente se debe instalar Pipenv. Para hacer esto, en la misma terminal abierta se escribe lo siguiente: | ||
|
||
``` | ||
pip install pipenv --user | ||
pipenv install | ||
pipenv shell | ||
``` | ||
|
||
## Ejecución del Programa para Mac / Linux | ||
|
||
Una vez realizados los pasos anteriores, el programa se ejecuta en la misma terminal | ||
de la siguiente manera para encriptar un archivo: | ||
|
||
``` | ||
python3 shamir_shared_secret.py --mode c --file <nombre_del_archivo_a_encriptar> --name <nombre_del_archivo_resultante> | ||
--divisions <cantidad_de_divisiones> --minimum <cantidad_minima_para_descifrar> | ||
``` | ||
|
||
Como resultado se generará un archivo con extensión adicional `.aes` | ||
|
||
*Nota:* Durante la ejecución se pedirá una contraseña para usar en el cifrado. Es importante notar que ésta *no se | ||
mostrara en la terminal* por lo que hay que tener cuidado con lo que se escribe. | ||
|
||
Y para desencriptar un archivo se realiza lo siguiente: | ||
|
||
``` | ||
python3 shamir_shared_secret.py --mode d --file <nombre_del_archivo_a_desencriptar> --cyphered <archivo_con_las_ | ||
llaves_para_desencriptar> | ||
``` | ||
|
||
Como resultado se generará un archivo con extensión adicional `.decrypt`. Si las llaves son correctas | ||
se obtendrá el archivo original. | ||
|
||
## Ejecución del Programa para Windows | ||
|
||
Una vez realizados los pasos anteriores, el programa se ejecuta en la misma terminal | ||
de la siguiente manera para encriptar un archivo: | ||
|
||
``` | ||
python shamir_shared_secret.py --mode c --file <nombre_del_archivo_a_encriptar> --name <nombre_del_archivo_resultante> | ||
--divisions <cantidad_de_divisiones> --minimum <cantidad_minima_para_descifrar> | ||
``` | ||
|
||
*Nota:* Durante la ejecución se pedirá una contraseña para usar en el cifrado. Es importante notar que ésta *no se | ||
mostrara en la terminal* por lo que hay que tener cuidado con lo que se escribe. | ||
|
||
Y para desencriptar un archivo se realiza lo siguiente: | ||
|
||
``` | ||
python shamir_shared_secret.py --mode d --file <nombre_del_archivo_a_desencriptar> --cyphered <archivo_con_las_ | ||
llaves_para_desencriptar> | ||
``` | ||
|
||
## Finalización del Programa | ||
|
||
Para evitar gastar recursos post-uso del programa se necesita ingresar la siguiente linea en la misma terminal | ||
donde se ejecutó: | ||
``` | ||
exit | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Amet aliquam id diam maecenas ultricies. Aliquam id diam maecenas ultricies mi eget mauris pharetra. Convallis aenean et tortor at. Vestibulum mattis ullamcorper velit sed ullamcorper morbi. Ut lectus arcu bibendum at. Felis eget velit aliquet sagittis id consectetur. Proin sed libero enim sed faucibus. Eget sit amet tellus cras adipiscing enim eu. Sed tempus urna et pharetra pharetra massa massa ultricies. Risus pretium quam vulputate dignissim suspendisse in est ante in. | ||
|
||
Eget egestas purus viverra accumsan in nisl nisi scelerisque eu. Enim ut sem viverra aliquet eget sit amet tellus. Duis at consectetur lorem donec. Porttitor rhoncus dolor purus non enim praesent elementum facilisis leo. Tortor consequat id porta nibh venenatis cras sed felis. Ac auctor augue mauris augue neque gravida in fermentum et. Arcu felis bibendum ut tristique et egestas quis. Sed lectus vestibulum mattis ullamcorper velit. Eget lorem dolor sed viverra. Nec ultrices dui sapien eget mi proin. Ornare arcu odio ut sem nulla. A pellentesque sit amet porttitor eget. Ullamcorper dignissim cras tincidunt lobortis feugiat vivamus at augue. Neque ornare aenean euismod elementum nisi quis eleifend quam. Phasellus vestibulum lorem sed risus ultricies tristique. | ||
|
||
Nisi porta lorem mollis aliquam ut porttitor leo a diam. Scelerisque eleifend donec pretium vulputate sapien nec sagittis. Arcu ac tortor dignissim convallis aenean et tortor at. Amet risus nullam eget felis eget nunc. Augue neque gravida in fermentum et sollicitudin ac. Eu lobortis elementum nibh tellus. Massa tempor nec feugiat nisl pretium fusce id velit ut. Amet nisl suscipit adipiscing bibendum est ultricies integer. Quisque sagittis purus sit amet. Non arcu risus quis varius quam quisque id diam vel. Egestas congue quisque egestas diam. Dui id ornare arcu odio ut sem nulla pharetra. Odio pellentesque diam volutpat commodo sed egestas egestas fringilla phasellus. Id venenatis a condimentum vitae sapien pellentesque. Velit ut tortor pretium viverra suspendisse potenti nullam ac. | ||
|
||
Id venenatis a condimentum vitae sapien. Molestie a iaculis at erat. Aenean euismod elementum nisi quis. Purus gravida quis blandit turpis cursus in hac habitasse. Odio eu feugiat pretium nibh ipsum consequat nisl vel pretium. Arcu bibendum at varius vel pharetra vel turpis. Ipsum a arcu cursus vitae. Vulputate mi sit amet mauris. Morbi blandit cursus risus at. Rhoncus mattis rhoncus urna neque viverra. Eleifend quam adipiscing vitae proin sagittis. Est pellentesque elit ullamcorper dignissim cras. Tortor pretium viverra suspendisse potenti nullam ac tortor vitae. Nisl pretium fusce id velit ut tortor pretium viverra suspendisse. Consectetur lorem donec massa sapien faucibus et. Lorem donec massa sapien faucibus et molestie ac. Fermentum leo vel orci porta non pulvinar neque laoreet suspendisse. Bibendum enim facilisis gravida neque convallis a cras semper. | ||
|
||
Imperdiet dui accumsan sit amet nulla facilisi morbi tempus. Cras sed felis eget velit aliquet sagittis id. Arcu non odio euismod lacinia at quis risus sed. Vitae ultricies leo integer malesuada. Ante in nibh mauris cursus mattis molestie a iaculis. Aliquet eget sit amet tellus cras adipiscing. Facilisis leo vel fringilla est ullamcorper eget nulla facilisi. Nullam ac tortor vitae purus faucibus. Purus in mollis nunc sed id semper. Id neque aliquam vestibulum morbi blandit cursus risus at. Et molestie ac feugiat sed. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
pycripto == 2.6.1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
from . import decrypt_process | ||
from . import input_validator |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
""" | ||
Método para inicializar el proceso de desencriptación | ||
Author: @wallsified, @TheSinotec | ||
Version: 1.1 | ||
""" | ||
import os | ||
|
||
from shamir_decrypt.input_validator import input_validator | ||
from shamir_handlers.crypt_decrypt import decrypt | ||
from shamir_handlers.polynomial import from_keys | ||
from shamir_handlers.file_handler import save_file | ||
from shamir_handlers.file_handler import read_encrypted_file | ||
|
||
|
||
def initiate_decrypt_process(file_name: str, key_file_name: str): | ||
""" | ||
Método para inicializar el proceso de desencriptación. | ||
Toma los parámetros de la terminal e inicia las | ||
etapas correspondientes del proceso. | ||
Parámetros | ||
---------- | ||
file_name - Nombre(Ruta) del archivo a desencriptar. | ||
key_file_name - Nombre/Ruta del archivo con las partes a descifrar la contraseña. | ||
""" | ||
file_to_decipher, file_with_cyphers = input_validator(file_name, key_file_name) | ||
password_bytes = from_keys(file_with_cyphers) | ||
iv, encrypted_file_data = read_encrypted_file(file_to_decipher) | ||
decrypt_bytes = decrypt(password_bytes, iv, encrypted_file_data) | ||
save_file(file_to_decipher[:-4]+".decrypt", decrypt_bytes) | ||
print(f"El archivo {file_to_decipher} fue desencriptado.\n") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
""" | ||
Validación del input ingresado para | ||
desencriptar un archivo ingresado, dadas | ||
t-partes (según el secreto compartido de Shamir). | ||
Autor: @wallsified | ||
Version: 1.0 | ||
""" | ||
|
||
from os import path | ||
import shamir_exceptions | ||
import linecache | ||
|
||
|
||
def file_has_more_than_two_lines(file_name: str) -> bool: | ||
""" | ||
Método auxiliar para revisar que un archivo tenga más | ||
de dos lineas de contenido. | ||
Parámetros | ||
---------- | ||
file_name - str: Nombre del Archivo. | ||
Regresa | ||
------- | ||
bool - True si el archivo contiene más de dos lineas de información. False en caso contrario. | ||
""" | ||
return linecache.getline(file_name, 3) is not None | ||
|
||
|
||
def validate_file_with_cyphers(file_name: str) -> bool: | ||
""" | ||
Método auxiliar para verificar que el archivo con las | ||
t-partes sea válido. Esto es, que no haya sido alterado | ||
posterior al proceso de encriptación. | ||
Parámetros | ||
---------- | ||
file_name - Ruta del archivo a validar. | ||
Regresa | ||
------- | ||
bool - True en caso de ser un archivo válido. False en caso contrario. | ||
""" | ||
enough_lines = file_has_more_than_two_lines(file_name) | ||
pair_number_of_lines = True | ||
only_numbers = True | ||
line_counter = 0 | ||
|
||
with open(file_name, "r") as checking: | ||
for line in checking: | ||
line = line.split() | ||
for value in line: | ||
try: | ||
int(value) | ||
except ValueError: | ||
only_numbers = False | ||
break | ||
line_counter += 1 | ||
if line_counter % 2 != 0: | ||
pair_number_of_lines = False | ||
|
||
# Todos deben ser True para ser un archivo válido. | ||
return enough_lines == pair_number_of_lines == only_numbers | ||
|
||
|
||
def input_validator(file_with_cyphers: str, file_to_decipher: str) -> (str, str): | ||
""" | ||
Método validador del input ingresado para desencriptar un archivo. | ||
Parámetros | ||
---------- | ||
file_with_cyphers: str - Ruta del Archivo con las t-partes a evaluar. | ||
file_to_decipher: str - Ruta del Archivo a descifrar. | ||
Regresa | ||
------- | ||
file_with_cyphers: str - Ruta del Archivo con las t-partes a evaluar. | ||
file_to_decipher: str - Ruta del Archivo a descifrar. | ||
""" | ||
|
||
try: | ||
if path.exists(file_with_cyphers) is False or path.exists(file_to_decipher) is False: | ||
raise shamir_exceptions.FileDoesntExistError() | ||
elif validate_file_with_cyphers(file_with_cyphers) is False: | ||
raise shamir_exceptions.NotEnoughInformationError(file_with_cyphers) | ||
except ValueError as error: | ||
print(f"{error}\n") | ||
|
||
print("\nArgumentos Ingresados Válidados. Iniciando Proceso de Desencriptación\n") | ||
|
||
return file_with_cyphers, file_to_decipher |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
from . import encrypt_process | ||
from . import input_validator |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
""" | ||
Método para inicializar el proceso de encriptación | ||
Author: @wallsified, @TheSinotec | ||
Version: 1.1 | ||
""" | ||
|
||
from shamir_encrypt import input_validator | ||
from shamir_handlers.crypt_decrypt import encrypt | ||
from shamir_handlers.polynomial import gen_keys | ||
from shamir_handlers.file_handler import read_file, save_file | ||
import os | ||
|
||
|
||
def initiate_encrypt_process(filename: str, output_name: str, divisions: int, minimum: int): | ||
""" | ||
Método para inicializar el proceso de encriptación. | ||
Toma los parámetros de la terminal e inicia las | ||
etapas correspondientes del proceso. | ||
Parámetros | ||
---------- | ||
filename - str. Nombre(Ruta) del archivo a encriptar. | ||
output_name - str. Nombre de salida del programa. | ||
divisions - int. Cantidad de divisiones para la contraseña. | ||
minimum - int. Cantidad minima de divisiones para recuperar la contraseña. | ||
""" | ||
input_path, file_name, divisions, min_parts, password = input_validator.validate_input(filename, output_name, divisions, minimum) | ||
key = int.from_bytes(password, byteorder='little') | ||
gen_keys(divisions, min_parts, file_name, key) | ||
data_to_encrypt = read_file(input_path) | ||
iv, data_encrypted = encrypt(password, data_to_encrypt) | ||
encrypted_file_data = [iv] + data_encrypted | ||
save_file(input_path+".aes", encrypted_file_data) | ||
|
||
print(f"El archivo {input_path} fue encriptado.\n") |
Oops, something went wrong.