对于任意的一个文件,本质上来说都是二进制的。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
欢迎关注咱们的微信