2019独角兽企业重金招聘Python工程师标准>>>
对于任意的一个文件,本质上来讲都是二进制的。
-
对于任意一个二进制数a,对其用另外任意一个与a的位数相同的二进制数m进行“异或”操作得到结果e,即e=a xor m;
-
如果再讲上面得到的e用m进行异或操作,得到e2,即e2=e xor m。
-
对比之后,会发现,a和e2是相同的。
利用上面这个简单的原理,就可以实现对文件的加密和解密。代码如下:
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
"""
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
#----------------------
上面的代码,利用乱序的数字来对文件进行加密,保存这些乱序的数字的文件就是加密/解密的密钥。
用同一个密钥文件对目标文件进行一次xor操作就是加密,对加密过的文件再进行一次xor操作,就是解密。
其实秘钥文件可以是任意的文件。加密之后,如果没有秘钥文件,就算知道加密算法,也是无法解密的。
---------------------------------------
欢迎关注我们的微信