-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
179 lines (133 loc) · 4.93 KB
/
main.py
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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
import sys
import os
from cryptography.fernet import Fernet
def generate_key(raw_key=None):
"""Genera una clave Fernet."""
return Fernet.generate_key(raw_key)
def encrypt_file(path, key, verbose=False):
"""Cifra un archivo utilizando una clave Fernet.
Args:
path (str): Ruta del archivo a cifrar.
key (bytes): Clave Fernet utilizada para cifrar el archivo.
verbose (bool, optional): Si es True, imprime un mensaje de depuración en la salida estándar.
Por defecto es False.
"""
if verbose:
print('Encrypting: ', path)
fernet = Fernet(key)
with open(path, 'rb') as file:
original = file.read()
encrypted = fernet.encrypt(original)
with open(path, 'wb') as encrypted_file:
encrypted_file.write(encrypted)
def decrypt_file(path, key, verbose=True):
"""Descifra un archivo utilizando una clave Fernet.
Args:
path (str): Ruta del archivo a descifrar.
key (bytes): Clave Fernet utilizada para descifrar el archivo.
verbose (bool, optional): Si es True, imprime un mensaje de depuración en la salida estándar.
Por defecto es True.
"""
if verbose:
print('Decrypting: ', path)
fernet = Fernet(key)
with open(path, 'rb') as enc_file:
encrypted = enc_file.read()
decrypted = fernet.decrypt(encrypted)
with open(path, 'wb') as dec_file:
dec_file.write(decrypted)
def encrypt_dir(dirpath, key, verbose=False):
"""Cifra todos los archivos dentro de un directorio utilizando una clave Fernet.
Args:
dirpath (str): Ruta del directorio a cifrar.
key (bytes): Clave Fernet utilizada para cifrar los archivos.
verbose (bool, optional): Si es True, imprime un mensaje de depuración en la salida estándar.
Por defecto es False.
Returns:
dict: Diccionario que contiene las rutas de los archivos cifrados y los archivos ignorados.
"""
encrypted = []
skipped = []
for filename in os.listdir(dirpath):
path = os.path.join(dirpath, filename)
if os.path.isdir(path):
encrypt_dir(path, key, verbose)
elif os.path.isfile(path):
encrypt_file(path, key, verbose)
encrypted.append(path)
else:
if verbose:
print('Skipped: ', path)
skipped.append(path)
return {
'encrypted': encrypted,
'skipped': skipped
}
def decrypt_dir(dirpath, key, verbose=False):
"""Decifra todos los archivos dentro de un directorio utilizando una clave Fernet.
Args:
dirpath (str): Ruta del directorio a cifrar.
key (bytes): Clave Fernet utilizada para cifrar los archivos.
verbose (bool, optional): Si es True, imprime un mensaje de depuración en la salida estándar.
Por defecto es False.
Returns:
dict: Diccionario que contiene las rutas de los archivos decifrados y los archivos ignorados.
"""
decrypted = []
skipped = []
for filename in os.listdir(dirpath):
path = os.path.join(dirpath, filename)
if os.path.isdir(path):
decrypt_dir(path, key, verbose)
elif os.path.isfile(path):
decrypt_file(path, key, verbose)
decrypted.append(path)
else:
if verbose:
print('Skipped: ', path)
skipped.append(path)
return {
'decrypted': decrypted,
'skipped': skipped
}
def main(*args, **kwargs):
if not args or '--help' in args[0]:
print('[mode] [key] [path]')
print('mode is "encrypt" or "decrypt"')
print('Encrypt a file: encrypt MySecretKey1 directory/myfile.csv')
print('Encrypt a directory: encrypt MySecretKey1 directory')
print('Encrypt a directory with auto-generated key: encrypt --generate_key directory')
print('Decrypt a file: decrypt MySecretKey1 directory/myfile.csv')
return
try:
key = generate_key(args[0][2]) if not '--no-generate-key' in args[0] else args[0][2]
except IndexError:
print('Error: Please provide a key')
return
verbose = '--verbose' in args[0]
mode = args[0][1] # encrypt or decrypt
if mode not in ['encrypt', 'decrypt']:
print('Error: Invalid mode')
return
funcs = {
'encrypt': [encrypt_dir, encrypt_file],
'decrypt': [decrypt_dir, decrypt_file]
}
try:
fileOrDir = args[0][3]
except IndexError:
print('Error: Please provide a path')
return
path = os.path.abspath(fileOrDir)
if not os.path.exists(path):
print('Error: Path does not exist')
return
if os.path.isdir(path):
out = funcs[mode][0](path, key, verbose)
elif os.path.isfile(path):
funcs[mode][1](path, key, verbose)
else:
print('Error: Path is not a file or directory')
return
if __name__ == '__main__':
main(sys.argv)