基于python实现文件加密功能
这篇文章主要介绍了基于python实现文件加密功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
生活中,有时候我们需要对一些重要的文件进行加密,Python提供了诸如hashlib,base64等便于使用的加密库。
但对于日常学习而言,我们可以借助异或操作,实现一个简单的文件加密程序,从而强化自身的编程能力。
基础知识
在Python中异或操作符为:^,也可以记作XOR。按位异或的意思是:相同值异或为0,不同值异或为1。具体来讲,有四种可能:0^0=0,0^1=1,1^0=1,1^1=0。我们还可总结出规律(A为0或1):0和A异或为A本身;1和A异或为A反。
让我们想看看一位二进制数满足的性质:
一位二进制数与自身的异或值为0
b^b=0
异或操作满足交换律
a^b^c=a^(b^c)=(a^b)^c
0与a的异或为a
(a^b)^b=a^(b^b)=a^0=a
易知,对任意长二进制数都满足上述性质。
原理
通过了解异或操作的性质,加密原理就非常清晰了。
加密操作:
首先将文件转换成二进制数,再生成与该二进制数等长的随机密钥,将二进制数与密钥进行异或操作,得到加密后的二进制数。
解密操作:
将加密后的二进制程序与密钥进行异或操作,就得到原二进制数,最后将原二进制数恢复成文本文件。
生成随机密钥:
secrets库是Python3.6引入的伪随机数模块,适合生成随机密钥。token_bytes函数接受一个int参数,用于指定随机字节串的长度。int.from_bytes把字节串转换为int,也就是我们需要的二进制数。
fromsecretsimporttoken_bytes defrandom_key(length): key=token_bytes(nbytes=length) key_int=int.from_bytes(key,'big') returnkey_int
加密单元:
encrypt函数接受一个str对象,返回元组(int,int)。通过encode方法,我们将字符串编码成字节串。int.from_bytes函数将字节串转换为int对象。最后对二进制对象和随机密钥进行异或操作,就得到了加密文本。
defencrypt(raw): raw_bytes=raw.encode() raw_int=int.from_bytes(raw_bytes,'big') key_int=random_key(len(raw_bytes)) returnraw_int^key_int,key_int
解密单元:
decrypt接受两个int对象,分别为加密文本和随机密钥。首先对两者进行异或操作,计算解密出来的int对象所占比特数。decrypted.bit_length函数得到的是二进制数的位数,除以8可以得到所占比特大小。为了防止,1~7位的二进制数整除8得到0,所以要加上7,然后再进行整除8的操作。使用int.to_bytes函数将解密之后的int的对象转换成bytes对象。最后通过decode方法,将字节串转换成字符串。
defdecrypt(encrypted,key_int): decrypted=encrypted^key_int length=(decrypted.bit_length()+7)//8 decrypted_bytes=int.to_bytes(decrypted,length,'big') returndecrypted_bytes.decode()
利用上述函数,我们可以很轻松对文本文件进行加密、解密操作。
>>>raw='画图省识春风面,环珮空归夜月魂' >>>encrypted=encrypt(raw) >>>encrypted (217447100157746604585..., 9697901906831571319...) >>>decrypt(*encrypted) '画图省识春风面,环珮空归夜月魂'
加密文本文件
path为待加密文件的地址,如果不指定密钥地址,则在该目录下新建目录和文件。
importjson frompathlibimportPath defencrypt_file(path,key_path=None,*,encoding='utf-8'): path=Path(path) cwd=path.cwd()/path.name.split('.')[0] path_encrypted=cwd/path.name ifkey_pathisNone: key_path=cwd/'key' ifnotcwd.exists(): cwd.mkdir() path_encrypted.touch() key_path.touch() withpath.open('rt',encoding=encoding)asf1,\ path_encrypted.open('wt',encoding=encoding)asf2,\ key_path.open('wt',encoding=encoding)asf3: encrypted,key=encrypt(f1.read()) json.dump(encrypted,f2) json.dump(key,f3)
解密文件
#Python学习群592539176 defdecrypt_file(path_encrypted,key_path=None,*,encoding='utf-8'): path_encrypted=Path(path_encrypted) cwd=path_encrypted.cwd() path_decrypted=cwd/'decrypted' ifnotpath_decrypted.exists(): path_decrypted.mkdir() path_decrypted/=path_encrypted.name path_decrypted.touch() ifkey_pathisNone: key_path=cwd/'key' withpath_encrypted.open('rt',encoding=encoding)asf1,\ key_path.open('rt',encoding=encoding)asf2,\ path_decrypted.open('wt',encoding=encoding)asf3: decrypted=decrypt(json.load(f1),json.load(f2)) f3.write(decrypted)
执行完加密、解密文件操作,得到的解密文件与原文件相同,示意图如下:
以上就是Python加密文件的全部内容,还请大家多多转发支持。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。