import time, os, binascii 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 read(fn): file = open(fn, 'rb') t = file.read().decode('utf8') file.close() return t def write(fn, t): file = open(fn, 'wb') file.write(t.encode('utf8')) file.close() def lenb(i): length = 0 while i > 0: i = i >> 8 length += 1 return length 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') def xorfile(datfn, keyfn, outfn): if os.path.getsize(keyfn) < os.path.getsize(datfn): print('Key file is of insufficent size at', os.path.getsize(keyfn), 'bytes') return dat = open(datfn, 'rb') key = open(keyfn, 'rb') out = open(outfn, '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() def genkey(keyfn, length): writeb(keyfn, os.urandom(length)) def printfile(datfn): for line in view.hex_viewer(datfn): print(line) CHUNK_SIZE = 16 while True and __name__ == '__main__': mode = input('''Please choose an option: X: Encrypt/Decrypt file (xor) I: File info G: Generate key S: Show file Option> ''').upper() print('\n') if mode == 'X': print('Xor file\n') datfn = input('Enter data filename: ') keyfn = input('Enter key filename: ') outfn = input('Output filename: ') if os.path.getsize(keyfn) < os.path.getsize(datfn): print('Key file is of insufficent size at', os.path.getsize(keyfn), 'bytes') else: print('Xor file...') start = time.time() xorfile(datfn, keyfn, outfn) duration = round(time.time()-start, 4) print(f'File xor ({duration} sec)') if mode == 'I': print('File information') fn = input('Enter filename: ') print('File length is', os.path.getsize(fn), 'bytes') if mode == 'G': print('Generate key\n') keyfn = input('Enter key filename: ') length = int(input('Enter key length: ')) print('Generating key...') start = time.time() genkey(keyfn, length) duration = round(time.time()-start, 4) print(f'Key generated ({duration} sec)') if mode == 'S': print('Show file') datfn = input('Enter data filename: ') print('\n') printfile(datfn) print('\n')