利用Python如何实现文件加密功能

  介绍

这篇文章运用简单易懂的例子给大家介绍利用Python如何实现文件加密功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

生活中,有时候我们需要对一些重要的文件进行加密,Python提供了诸如hashlib, base64等便于使用的加密库。

但对于日常学习而言,我们可以借助异或操作,实现一个简单的文件加密程序,从而强化自身的编程能力。

<>强基础知识

在Python中异或操作符为:<代码> ^>

让我们想看看一位二进制数满足的性质:

    <李>一位二进制数与自身的异或值为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如何实现文件加密功能