import time, os, argparse import hexView as view def readb(fn): file = open(fn, 'rb') b = file.read() file.close() return b def writeb(fn, b): file = open(fn, 'wb') file.write(b) file.close() def xorb(a, b): alen = len(a) blen = len(b) a = int.from_bytes(a, byteorder='big') b = int.from_bytes(b, byteorder='big') r = a ^ b if alen > blen: return r.to_bytes(alen, byteorder='big') else: return r.to_bytes(blen, byteorder='big') CHUNK_SIZE = 16 parser = argparse.ArgumentParser(description='Xor file encryption') parser.add_argument('command', type=str, choices=['x', 'i', 'g', 's'], help='x: Encrypt/Decrypt file (xor), i: File info, g: Generate key, s: Show file') parser.add_argument('f1', default='', nargs='?', type=str, help='x+i+s: data file, g: output file') parser.add_argument('f2', default='', nargs='?', type=str, help='x: key file, g: key length') parser.add_argument('f3', default='', nargs='?', type=str, help='x: output file') args = parser.parse_args() if args.command == 'x': if os.path.getsize(args.f2) < os.path.getsize(args.f1): print('Key file is of insufficent size at', os.path.getsize(keyfn), 'bytes') else: start = time.time() dat = open(args.f1, 'rb') key = open(args.f2, 'rb') out = open(args.f3, 'wb') while True: datbytes = dat.read(CHUNK_SIZE) keybytes = key.read(CHUNK_SIZE) if len(datbytes) == 0: break out.write(xorb(datbytes, keybytes)) dat.close() key.close() out.close() duration = round(time.time()-start, 4) print(f'File xor ({duration} sec)') if args.command == 'i': print('File length is', os.path.getsize(args.f1), 'bytes') if args.command == 'g': start = time.time() writeb(args.f1, os.urandom(int(args.f2))) duration = round(time.time()-start, 4) print(f'Key generated ({duration} sec)') if args.command == 's': for line in view.hex_viewer(readb(args.f1)): print(line)