Skip to content

Commit

Permalink
feat: Programa Completo
Browse files Browse the repository at this point in the history
  • Loading branch information
wallsified committed Aug 15, 2024
1 parent f48272a commit d0aec9e
Show file tree
Hide file tree
Showing 28 changed files with 921 additions and 2 deletions.
13 changes: 13 additions & 0 deletions Pipfile
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"
95 changes: 95 additions & 0 deletions Pipfile.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

85 changes: 83 additions & 2 deletions README.md
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
```
9 changes: 9 additions & 0 deletions Resources/hello.txt
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.
1 change: 1 addition & 0 deletions Resources/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pycripto == 2.6.1
2 changes: 2 additions & 0 deletions shamir_decrypt/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from . import decrypt_process
from . import input_validator
33 changes: 33 additions & 0 deletions shamir_decrypt/decrypt_process.py
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")
94 changes: 94 additions & 0 deletions shamir_decrypt/input_validator.py
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
2 changes: 2 additions & 0 deletions shamir_encrypt/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from . import encrypt_process
from . import input_validator
37 changes: 37 additions & 0 deletions shamir_encrypt/encrypt_process.py
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")
Loading

0 comments on commit d0aec9e

Please sign in to comment.