Repository navigation
Expand file tree
/
Copy pathdesencriptar.py
More file actions
157 lines (128 loc) · 5.03 KB
/
Copy pathdesencriptar.py
File metadata and controls
157 lines (128 loc) · 5.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
import os
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.backends import default_backend
import sys
from tkinter import messagebox
"""---------------------------- METODOS -----------------------------------"""
def borrar_directorio(file_path):
archivoTxt = "./archivo.txt"
# Abre el archivo en modo lectura
with open(archivoTxt, "r") as archivo:
lineas = archivo.readlines()
# Sobreescribimos el archivo sin el 'file_path'
with open(archivoTxt, "w") as archivo:
for linea in lineas:
if linea.strip() != file_path:
archivo.write(linea + "\n")
# Metodo para encriptar
def decrypt_file(file_path, key, iv):
with open(file_path, "rb") as encrypted_file:
ciphertext = encrypted_file.read()
# Elige el mismo modo que se utilizó para encriptar (en este caso, CFB)
cipher = Cipher(algorithms.AES(key), modes.CFB(iv))
decryptor = cipher.decryptor()
plaintext = decryptor.update(ciphertext) + decryptor.finalize()
# Quitamos .enc
nombre_archivo, extension = os.path.splitext(file_path)
# Sobrescribe el archivo encriptado con el contenido desencriptado
with open(nombre_archivo, "wb") as file:
file.write(plaintext)
os.remove(file_path)
# Metodo para listar una ruta
def listar_archivos_con_ruta_completa(directorio):
if os.path.exists(directorio) and os.path.isdir(directorio):
archivos = []
for raiz, directorios, archivos_en_raiz in os.walk(directorio):
for archivo in archivos_en_raiz:
ruta_completa = os.path.join(raiz, archivo)
# Agregar a la lista solo si el archivo termina en ".enc"
if archivo.endswith(".enc") and os.path.isfile(ruta_completa):
archivos.append(ruta_completa)
return archivos
else:
return []
def verificar_firma(archivo_path, firma_path, public_key_hex):
# Convertir la clave pública de hexadecimal a bytes
public_key_bytes = bytes.fromhex(public_key_hex)
# Cargar la clave pública desde los bytes
public_key = serialization.load_pem_public_key(
public_key_bytes, backend=default_backend()
)
# Leer el contenido del archivo
with open(archivo_path, "rb") as archivo:
contenido = archivo.read()
# Leer la firma desde el archivo
with open(firma_path, "rb") as firma_archivo:
firma = firma_archivo.read()
# Verificar la firma
try:
public_key.verify(
firma,
contenido,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256(),
)
print("La firma es válida. El archivo no ha sido modificado.")
except Exception as e:
print("Error al verificar la firma")
sys.exit()
"""------------------------------------------ MAIN -----------------------------------"""
claves = os.path.join(os.path.expanduser("~"), "Desktop/claves.txt")
file_clavePublica = os.path.join(os.path.expanduser("~"), "Desktop/clavePublica.txt")
# Verificar la clave pública
with open(file_clavePublica, 'r') as archivo:
next(archivo)
public_key = archivo.read().strip()
verificar_firma(claves, claves + ".sig", public_key)
# Solicita la contraseña para desencriptar la clave privada RSA
password = sys.argv[1].encode("utf-8")
print(password)
# Extraemos las claves encriptadas de cada línea
with open(claves, "r") as file:
lines = file.readlines()
encrypted_key = lines[0].split(": ")[1].strip()
encrypted_iv = lines[1].split(": ")[1].strip()
encrypted_private_key = lines[2].split(": ")[1].strip()
# Desencripta la clave privada RSA
try:
private_key = serialization.load_pem_private_key(
bytes.fromhex(encrypted_private_key), password=password
)
except:
raise Exception("Contraseña incorrecta")
# Desencripta la clave AES y el IV usando la clave privada RSA
key = private_key.decrypt(
bytes.fromhex(encrypted_key),
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None,
),
)
iv = private_key.decrypt(
bytes.fromhex(encrypted_iv),
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None,
),
)
# Obtiene la ruta al directorio de prueba
directorio = "prueba"
archivos_en_directorio = listar_archivos_con_ruta_completa(directorio)
if archivos_en_directorio:
print(f"Archivos en el directorio '{directorio}': ")
for archivo in archivos_en_directorio:
decrypt_file(archivo, key, iv)
print("Desencriptando un archivo")
print(archivo)
else:
print(
f"No se encontraron archivos en el directorio '{directorio}' o el directorio no existe."
)
messagebox.showinfo("Contraseña correcta!!", "Archivos desencriptados")