admin管理员组文章数量:1639675
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 <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!')
#----------------------
上面的代码,利用乱序的数字来对文件进行加密,保存这些乱序的数字的文件就是加密/解密的密钥。
用同一个密钥文件对目标文件进行一次xor操作就是加密,对加密过的文件再进行一次xor操作,就是解密。
其实秘钥文件可以是任意的文件。加密之后,如果没有秘钥文件,就算知道加密算法,也是无法解密的。
---------------------------------------
欢迎关注我们的微信
转载于:https://my.oschina/aomojan/blog/2120427
版权声明:本文标题:python实现简单的文件加密与解密 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1729294260a1194529.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论