3 """ Encrypt/decrypt a single file
5 low-cost quick-devel badly-documented
7 .. codeauthor:: Intra2net <info@intra2net.com>
11 from deltatar import crypto
12 from deltatar import tarfile
13 from traceback import print_exc
16 CRYPTO_MODE_ENCRYPT = 0
17 CRYPTO_MODE_DECRYPT = 1
20 def initialize_encryption (mode, password=None, key=None, nacl=None):
21 if key is None and password is None:
22 raise Exception ("encryption requires either a key or a password")
23 if mode == CRYPTO_MODE_ENCRYPT:
24 return crypto.Encrypt (password=password,
27 version=crypto.PDTCRYPT_DEFAULT_VER,
28 paramversion=crypto.PDTCRYPT_DEFAULT_PVER)
29 if mode == CRYPTO_MODE_DECRYPT:
30 return crypto.Decrypt (password=password, key=key)
33 def main(do_encrypt, in_file, out_file, password, comptype='gz',
34 bufsize=tarfile.RECORDSIZE, encoding='UTF-8'):
35 """ Main function, called when running file as script
37 see module doc for more info
40 write_handle = read_handle = None
46 read_handle = open(in_file, 'rt')
48 decryptor = initialize_encryption (CRYPTO_MODE_DECRYPT,
50 read_handle = tarfile._Stream(name=in_file, mode="r",
51 comptype=comptype, bufsize=bufsize,
52 fileobj=None, encryption=decryptor)
57 encryptor = initialize_encryption (CRYPTO_MODE_ENCRYPT,
59 write_handle = tarfile._Stream(name=out_file, mode='w',
60 comptype=comptype, bufsize=bufsize,
61 fileobj=None, encryption=encryptor)
63 write_handle = open(out_file, 'wt')
68 buf = read_handle.read(bufsize)
71 write_handle.write(buf.encode(encoding, errors='strict'))
73 write_handle.write(buf.decode(encoding, errors='replace'))
74 if len(buf) < bufsize:
76 print('successfully encrypted {} into {}'
77 .format(in_file, out_file))
79 print('successfully decrypted {} into {}'
80 .format(in_file, out_file))
86 print('error encrypting file')
96 print('error closing out file')
104 print('error closing in file')
111 if __name__ == '__main__':
112 if len(sys.argv) < 4:
113 print('file_crypt.py [-c] {enc|dec} INFILE OUTFILE PASSWORD')
115 elif sys.argv[1] == '-h':
116 print('file_crypt.py [-c] {enc|dec} INFILE OUTFILE PASSWORD')
119 comptype = 'tar' # auto-detect, not sure whether this would work
121 if sys.argv[idx] == '-c':
122 print('assuming gzip compression')
127 if sys.argv[idx] == 'enc':
129 elif sys.argv[idx] == 'dec':
132 print('file_crypt.py [-c] {enc|dec} INFILE OUTFILE PASSWORD')
135 if len(sys.argv) != idx+4:
136 print('file_crypt.py [-c] {enc|dec} INFILE OUTFILE PASSWORD')
139 sys.exit(main(do_encrypt, sys.argv[idx+1], sys.argv[idx+2],
140 sys.argv[idx+3], comptype))