这篇文章运用简单易懂的例子给大家介绍利用Python如何实现文件加密功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
生活中,有时候我们需要对一些重要的文件进行加密,Python提供了诸如hashlib, base64等便于使用的加密库。
但对于日常学习而言,我们可以借助异或操作,实现一个简单的文件加密程序,从而强化自身的编程能力。
<>强基础知识强>
在Python中异或操作符为:<代码> ^> 代码,也可以记作XOR。按位异或的意思是:相同值异或为0,不同值异或为1。具体来讲,有四种可能:0 ^ 0=0,0 ^ 1=1,1 ^ 0=1,1 ^ 1=0。我们还可总结出规律(一个为0或1):0和异或为一本身;1和一个异或为一个反。
让我们想看看一位二进制数满足的性质:
- <李>一位二进制数与自身的异或值为0
李,>
^ b=0
- <李>异或操作满足交换律
李,>
^ b c ^=^ ^ (b c)=(a ^) ^ c
- <李> 0与的异或为一个
李,>
(a ^) ^ b=^ (^ b)=^ 0=
易知,对任意长二进制数都满足上述性质。
<强>原理强>
通过了解异或操作的性质,加密原理就非常清晰了。
<强>加密操作:强>
首先将文件转换成二进制数,再生成与该二进制数等长的随机密钥,将二进制数与密钥进行异或操作,得到加密后的二进制数。
<强>解密操作:
强>
将加密后的二进制程序与密钥进行异或操作,就得到原二进制数,最后将原二进制数恢复成文本文件。
<强>生成随机密钥:强>
秘密库是Python 3.6引入的伪随机数模块,适合生成随机密钥.token_bytes函数接受一个int参数,用于指定随机字节串的长度.int.from_bytes把字节串转换为int,也就是我们需要的二进制数。
从进口token_bytes秘密 def random_key(长度): 关键=token_bytes (nbytes=长度) key_int=int.from_bytes(键,& # 39;大# 39;) 返回key_int
<强>加密单元:强>
加密函数接受一个str对象,返回元组(int, int)。通过编码的方法,我们将字符串编码成字节串.int.from_bytes函数将字节串转换为int对象。最后对二进制对象和随机密钥进行异或操作,就得到了加密文本。
def加密(生): raw_bytes=raw.encode () raw_int=int.from_bytes (raw_bytes & # 39;大# 39;) key_int=random_key (len (raw_bytes)) 返回raw_int ^ key_int, key_int
<强>解密单元:强>
解密接受两个int对象,分别为加密文本和随机密钥。首先对两者进行异或操作,计算解密出来的int对象所占比特数.decrypted。bit_length函数得到的是二进制数的位数,除以8可以得到所占比特大小。为了防止,1 ~ 7位的二进制数整除8得到0,所以要加上7,然后再进行整除8的操作。使用int.to_bytes函数将解密之后的int的对象转换成字节对象。最后通过解码方法,将字节串转换成字符串。
def解密(加密,key_int): 加密解密=^ key_int 长度=(decrypted.bit_length () + 7)//8 decrypted_bytes=int.to_bytes(解密、长度、& # 39;大# 39;) 返回decrypted_bytes.decode ()
利用上述函数,我们可以很轻松对文本文件进行加密,解密操作。
在祝辞祝辞生=& # 39;画图省识春风面,环珮空归夜月魂& # 39; 在在在加密=加密(生) 在在在加密 (217447100157746604585… 9697901906831571319……) 在在在加密解密(*) & # 39;画图省识春风面,环珮空归夜月魂& # 39;
<强>加密文本文件强>
路径为待加密文件的地址,如果不指定密钥地址,则在该目录下新建目录和文件。
进口json 从pathlib导入路径 def encrypt_file(路径,key_path=None, *,编码=& # 39;utf - 8 # 39;): 路径=路径(路径) 慢性消耗?path.cwd ()/path.name.split(& # 39;强生# 39;)[0] path_encrypted=/path.name慢性消耗性疾病 如果key_path没有: key_path=慢性消耗?& # 39;关键# 39; 如果不是cwd.exists (): cwd.mkdir () path_encrypted.touch () key_path.touch () path.open (& # 39; rt # 39;,编码=编码)作为f1, \ path_encrypted.open (& # 39; wt # 39;,编码=编码),f2 \ key_path.open (& # 39; wt # 39;,编码=编码)f3: 加密,密钥=加密(f1.read ()) json。转储(加密,f2) json。转储(关键,f3)
<强>解密文件强>
def decrypt_file (path_encrypted key_path=None, *,编码=& # 39;utf - 8 # 39;): path_encrypted=路径(path_encrypted) 慢性消耗?path_encrypted.cwd () path_decrypted=慢性消耗?& # 39;解密# 39; 如果不是path_decrypted.exists (): path_decrypted.mkdir () path_decrypted/=path_encrypted.name path_decrypted.touch () 如果key_path没有: key_path=慢性消耗?& # 39;关键# 39; path_encrypted.open (& # 39; rt # 39;,编码=编码)作为f1, \ key_path.open (& # 39; rt # 39;,编码=编码),f2 \ path_decrypted.open (& # 39; wt # 39;,编码=编码)f3: 解密=解密(json.load (f1), json.load (f2)) f3.write(解密)利用Python如何实现文件加密功能