-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
121 lines (100 loc) · 5.18 KB
/
Copy pathmain.py
File metadata and controls
121 lines (100 loc) · 5.18 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
#!/usr/bin/env python3
"""
secure-encrypto — Entry point
GUI mode : python main.py
CLI mode : python main.py encrypt <fichier> [-o sortie.senc] [--delete]
python main.py decrypt <fichier.senc> [-o dossier]
"""
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
def _run_cli(argv: list) -> int:
import argparse
import getpass
from secure_encrypto.core.engine import CryptoEngine, EncryptionError, DecryptionError
from secure_encrypto.core.secure_wipe import secure_delete
parser = argparse.ArgumentParser(
prog='secure-encrypto',
description='Chiffrement de fichiers AES-256-GCM + Argon2id',
)
sub = parser.add_subparsers(dest='cmd', metavar='<commande>')
# ── encrypt ──────────────────────────────────────────────────────────────
enc = sub.add_parser('encrypt', help='Chiffrer un fichier ou dossier')
enc.add_argument('input', help='Fichier ou dossier à chiffrer')
enc.add_argument('-o', '--output', default=None,
help='Fichier de sortie .senc (défaut : <input>.senc)')
enc.add_argument('-p', '--password', default=None,
help='Mot de passe (si absent, saisi de façon sécurisée)')
enc.add_argument('--delete', action='store_true',
help='Suppression sécurisée (3 passes) du fichier original après chiffrement')
# ── decrypt ──────────────────────────────────────────────────────────────
dec = sub.add_parser('decrypt', help='Déchiffrer un fichier .senc')
dec.add_argument('input', help='Fichier .senc à déchiffrer')
dec.add_argument('-o', '--output', default=None,
help='Dossier de sortie (défaut : même dossier que le .senc)')
dec.add_argument('-p', '--password', default=None,
help='Mot de passe (si absent, saisi de façon sécurisée)')
args = parser.parse_args(argv)
if args.cmd is None:
parser.print_help()
return 1
# ── resolve password ──────────────────────────────────────────────────────
try:
pwd = args.password or getpass.getpass('Mot de passe : ')
if args.cmd == 'encrypt':
pwd2 = getpass.getpass('Confirmer : ')
if pwd != pwd2:
print('Erreur : les mots de passe ne correspondent pas.', file=sys.stderr)
return 1
except KeyboardInterrupt:
print('\nAnnulé.', file=sys.stderr)
return 1
# ── encrypt ──────────────────────────────────────────────────────────────
if args.cmd == 'encrypt':
if not os.path.exists(args.input):
print(f'Erreur : chemin introuvable — {args.input}', file=sys.stderr)
return 1
base = os.path.basename(args.input.rstrip('/\\'))
out = args.output or os.path.join(os.path.dirname(os.path.abspath(args.input)), base + '.senc')
def progress(v):
bar = int(v * 30)
sys.stdout.write(f'\r[{"█" * bar}{"░" * (30 - bar)}] {int(v * 100):3d}%')
sys.stdout.flush()
try:
CryptoEngine.encrypt_file(args.input, out, pwd, progress)
print(f'\n✅ Chiffré → {out}')
if args.delete:
print(' Suppression sécurisée en cours…')
secure_delete(args.input)
print(' Fichier original supprimé (3 passes).')
return 0
except EncryptionError as e:
print(f'\n❌ {e}', file=sys.stderr)
return 1
# ── decrypt ──────────────────────────────────────────────────────────────
if args.cmd == 'decrypt':
if not os.path.isfile(args.input):
print(f'Erreur : fichier introuvable — {args.input}', file=sys.stderr)
return 1
outdir = args.output or os.path.dirname(os.path.abspath(args.input))
os.makedirs(outdir, exist_ok=True)
def progress(v):
bar = int(v * 30)
sys.stdout.write(f'\r[{"█" * bar}{"░" * (30 - bar)}] {int(v * 100):3d}%')
sys.stdout.flush()
try:
result = CryptoEngine.decrypt_file(args.input, outdir, pwd, progress)
print(f'\n✅ Déchiffré → {result}')
return 0
except DecryptionError as e:
print(f'\n❌ {e}', file=sys.stderr)
return 1
return 0
if __name__ == '__main__':
# If arguments are passed → CLI mode; otherwise → GUI mode
cli_args = sys.argv[1:]
if cli_args:
sys.exit(_run_cli(cli_args))
else:
from secure_encrypto.ui.app import run
run()