對於任意的一個文件,本質上來說都是二進制的。python
對於任意一個二進制數a,對其用另外任意一個與a的位數相同的二進制數m進行「異或」操做獲得結果e,即e=a xor m;算法
若是再講上面獲得的e用m進行異或操做,獲得e2,即e2=e xor m。微信
對比以後,會發現,a和e2是相同的。app
利用上面這個簡單的原理,就能夠實現對文件的加密和解密。代碼以下:dom
import sys import random import os def gen_key(): c=list(range(256)) random.shuffle(c) return c def save_keyfile(k,f): fo=open(f,'wb') fo.write(bytes(k)) fo.close() def get_key(f): fi=open(f,'rb') k=fi.read() fi.close() return k def crypt_file(fi,fo,key_file): k=get_key(key_file) f=open(fi,'rb') fc=f.read() fe=open(fo,'wb') flen=len(fc) buff=[] for i in range(flen): c=i%len(k) fo=fc[i]^k[c] buff.append(fo) fe.write(bytes(buff)) f.close() fe.close() def crypt_dir(d,key_file): """ encrypt a directory assigned by <d> """ file_list=os.listdir(d) file_count=len(file_list) for i in range(file_count): f=os.path.join(d,file_list[i]) neof=f+'.crypt' crypt_file(f,neof,key_file) print('Progress:%d/%d' % (i+1,file_count)) print('Directory <%s> has been encrypted/decrypted.' % (d)) if __name__=='__main__': args=sys.argv arg_num=len(args) if arg_num==2: neokey=gen_key() save_keyfile(neokey,args[1]) print('Key file has been generated:%s' % (args[1])) exit(0) if arg_num==3: crypt_dir(args[1],args[2]) exit(0) if len(args)!=4: print('Usage:crypt.py <input file> <output file> <key file>') exit(-1) crypt_file(args[1],args[2],args[3]) print('Done!')
#----------------------加密
上面的代碼,利用亂序的數字來對文件進行加密,保存這些亂序的數字的文件就是加密/解密的密鑰。code
用同一個密鑰文件對目標文件進行一次xor操做就是加密,對加密過的文件再進行一次xor操做,就是解密。get
其實祕鑰文件能夠是任意的文件。加密以後,若是沒有祕鑰文件,就算知道加密算法,也是沒法解密的。input
---------------------------------------it
歡迎關注咱們的微信