created tool to encrypt/decrypt files using aes128 with compression
[python-delta-tar] / file_crypt.py
1 #!/usr/bin/env python3
2
3 """ Encrypt a single file
4
5 low-cost quick-devel badly-documented
6
7 .. codeauthor:: Intra2net <info@intra2net.com>
8 """
9
10 import sys
11 from deltatar import tarfile
12 from traceback import print_exc
13
14
15 def main(do_encrypt, in_file, out_file, password, comptype='gz', enctype='aes',
16          key_length=128, bufsize=tarfile.RECORDSIZE, encoding='UTF-8'):
17     """ Main function, called when running file as script
18
19     see module doc for more info
20     """
21
22     write_handle = read_handle = None
23     return_code = 4
24
25     try:
26         # open file to read
27         if do_encrypt:
28             read_handle = open(in_file, 'rt')
29         else:
30             read_handle = tarfile._Stream(name=in_file, mode='r',
31                                           comptype=comptype, bufsize=bufsize,
32                                           fileobj=None, enctype=enctype,
33                                           key_length=key_length,
34                                           password=password)
35         return_code = 3
36
37         # open file to write
38         if do_encrypt:
39             write_handle = tarfile._Stream(name=out_file, mode='w',
40                                            comptype=comptype, bufsize=bufsize,
41                                            fileobj=None, enctype=enctype,
42                                            key_length=key_length,
43                                            password=password)
44         else:
45             write_handle = open(out_file, 'wt')
46         return_code = 1
47
48         # convert
49         while True:
50             buf = read_handle.read(bufsize)
51             print('.', end='')
52             if do_encrypt:
53                 write_handle.write(buf.encode(encoding, errors='strict'))
54             else:
55                 write_handle.write(buf.decode(encoding, errors='replace'))
56             if len(buf) < bufsize:
57                 if do_encrypt:
58                     print('successfully encrypted {} into {}'
59                           .format(in_file, out_file))
60                 else:
61                     print('successfully decrypted {} into {}'
62                           .format(in_file, out_file))
63                 break   # reached EOF
64
65         return_code = 0
66
67     except Exception:
68         print('error encrypting file')
69         print_exc()
70
71     finally:
72         # close everything
73         if write_handle:
74             try:
75                 write_handle.close()
76             except Exception:
77                 return_code += 8
78                 print('error closing out file')
79                 print_exc()
80
81         if read_handle:
82             try:
83                 read_handle.close()
84             except Exception:
85                 return_code += 16
86                 print('error closing in file')
87                 print_exc()
88
89     # done
90     return return_code
91
92
93 if __name__ == '__main__':
94     if len(sys.argv) < 4:
95         print('file_crypt.py {enc|dec} [-c] INFILE OUTFILE PASSWORD')
96         sys.exit(2)
97     elif sys.argv[1] == '-h':
98         print('encrypt_file.py {enc|dec} [-c] INFILE OUTFILE PASSWORD')
99         sys.exit(0)
100
101     comptype = 'tar'  # auto-detect, not sure whether this would work
102     idx = 1
103     if sys.argv[idx] == '-c':
104         print('assuming gzip compression')
105         comptype = 'gz'
106         idx += 1
107
108     do_encrypt = None
109     if sys.argv[idx] == 'enc':
110         do_encrypt = True
111     elif sys.argv[idx] == 'dec':
112         do_encrypt = False
113     else:
114         print('encrypt_file.py {enc|dec} [-c] INFILE OUTFILE PASSWORD')
115         sys.exit(2)
116
117     if len(sys.argv) != idx+4:
118         print('encrypt_file.py {enc|dec} [-c] INFILE OUTFILE PASSWORD')
119         sys.exit(2)
120
121     sys.exit(main(do_encrypt, sys.argv[idx+1], sys.argv[idx+2],
122                   sys.argv[idx+3], comptype))