数字化时代下,数据安全对各大公司及个人的重要性不言而喻。作为Python语言使用者, 如何进行数据的加密和解密呢?本文带领大家来了解一下。

目录

  • sha256算法
  • 标准库知识
  • 加密与解密数据
  • 主程序

sha256算法

sha256算法是目前应用非常广泛的数据加密算法, 可以简单的理解为:通过一个函数,把任意长度的数据转换为一个长度固定的数据串。

性质
不可逆性:sha256加密是一个单向密码体制,即从明文到密文的不可逆映射,只有加密过程没有解密过程。(本文会使用其他方法使数据可以解密。)

压缩性:任意长度的数据,算出的sha256值长度都是固定的。

抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的sha256值都有很大区别。

抗碰撞性:已知原数据和其sha256值,想找到一个具有相同sha256值的数据(即伪造数据)是非常困难的。

标准库知识

*已经熟悉这些模块的, 请忽略。
hashlib模块

  • hashlib.sha256(byte)
    返回一个sha256加密对象obj, 用于后续操作。注意参数必须是bytes类型。

    • obj.hexdigest()
      获取sha256加密对象的十六进制sha256值, 返回一个字符串。
    • obj.digest()
      获取sha256加密对象的二进制sha256值, 返回一个bytes类型数据。

zlib模块

  • zlib.compress(data, [level])
    压缩一个二进制数据, 返回值为压缩后的数据。
    data: 待压缩的数据, bytes类型。
    level: 压缩级别, 可选参数, 可以是zlib.Z_BEST_COMPRESSION, Z_DEFAULT_COMPRESSION, 或Z_NO_COMPRESSION
  • zlib.decompress(data)
    解压数据, 与zlib.compress相反。注意如果data数据有损坏, 那么zlib会报错。

加密与解密数据

加密部分首先计算密码的sha256值, 再将数据用zlib压缩,
然后将压缩数据密码变换得到的sha256进行异或运算, 得到结果。

由于密码经过了变换处理, 在不知道密码的情况下, 找到密码变换得到的sha256是非常困难的。另外, 使用zlib压缩也是为了防止找到密码变换得到的sha256, 避免数据被直接破解。

def encrypt(data,password,compress_level=-1):data = zlib.compress(data,compress_level) # 先使用zlib压缩sha256=hashlib.sha256(password.encode("utf-8")).hexdigest() # 获取密码的sha256head = sha256.encode() + len(data).to_bytes(8,"big") # 文件头mask = hashlib.sha256((password*2).encode("utf-8")).hexdigest() # 使用密码的变体(重复2次)的sha256作为掩码mask_num = int.from_bytes(mask.encode(),"little")encrypted=b''for i in range(0,len(data),64): # sha256结果为64字节长num = int.from_bytes(data[i:i+64],"little") # 截取data的一部分num_enc = num ^ mask_num # 将data的一部分与掩码进行异或运算encrypted += num_enc.to_bytes(64,"little")return head + encrypted[:len(data)]

解密部分首先将密码的sha256值与已加密数据头部的sha256值进行比对, 如果不匹配, 就提示错误。
再重新把加密数据密码变换得到的sha256进行异或运算, 还原得到压缩数据。再解压, 得到结果。

def decrypt(encrypted,password):sha256 = encrypted[:64]if hashlib.sha256(password.encode("utf-8")).hexdigest().encode()\!= sha256: # 检验密码是否正确raise TypeError("Invalid password")mask = hashlib.sha256((password*2).encode("utf-8")).hexdigest() # 掩码mask_num = int.from_bytes(mask.encode(),"little")length = int.from_bytes(encrypted[64:64+8],"big") # (压缩的)数据长度data = b''for i in range(64+8,len(encrypted),64):num_enc = int.from_bytes(encrypted[i:i+64],"little")num = num_enc ^ mask_num # 与掩码进行异或运算data += num.to_bytes(64,"little")return zlib.decompress(data[:length]) # 返回原长度的数据def test(): # 用于程序测试seq=b"Hello world!";password="123"#若不等于则引发AssertionErrorassert decrypt(encrypt(seq,password),password)==seq

主程序

主程序部分用于处理文件的加密、解密, 以及程序参数sys.argv

FILETYPE=".encrypt"def __ask_replace(filename):if not os.path.isfile(filename):return Trueresult=input("文件 %s已存在,要替换它吗? "%filename)return result.lower().startswith('y')
def main():if len(sys.argv)==1:print("命令行: encryption.py 文件名1 [文件名2] [...]\n未提供文件。")returnfor arg in sys.argv[1:]:print("处理文件 "+arg)with open(arg,'rb') as fin:if arg.lower().endswith(FILETYPE):#解密newfile = arg[:-len(FILETYPE)]if not __ask_replace(newfile):continuepassword = input("输入密码: ")data = decrypt(fin.read(),password)else: #加密newfile = arg + FILETYPEif not __ask_replace(newfile):continuepassword = input("输入密码: ")data = encrypt(fin.read(),password)with open(newfile,"wb") as fout:fout.write(data)if __name__=="__main__":main()

还有更好的数据加密、解密方法吗? 欢迎读者在评论区留言。

Python sha256+zlib库 实现文件加密算法相关推荐

  1. python修改文件linux编码格式,使用python的chardet库获得文件编码并修改编码

    使用python的chardet库获得文件编码并修改编码 windows和linux采用了不同的编码,这让很多人伤透了脑经,这里我采用了Python的chardet库获得代码的编码,然后修改编码 首先 ...

  2. 查看python中安装库的文件位置的方法

    安装库位置和显示方式简单总结: 一.位置的不同1.自带库在环境的 lib\\os.py2.自己安装库在 lib\\site-packages\\numpy\\__init__.py 二.显示方式不同1 ...

  3. python获取文件编码格式除了chardet还有别的方式吗_使用python的chardet库获得文件编码并修改编码...

    首先需要安装chardet库,有很多方式,我才用的是比较笨的方式:sudo pip install chardet #!/usr/bin/env python # coding: UTF-8 impo ...

  4. python中zlib库用法详解(压缩与解压缩)

    zlib主要用于压缩与解压缩 字符串:使用zlib.compress可以压缩字符串.使用zlib.decompress可以解压字符串. 数据流:压缩:compressobj,解压:decompress ...

  5. Python使用requests库post文件multipart编码格式

    步骤 构造要发送的文件数据元组,可一次发送多个文件 调用requests.post发出文件 url = 'https://xxxx.org/' multiple_files = [('images', ...

  6. zlib库对文件进行压缩和解压操作

    参考 https://www.zlib.net/ http://www.cs.unc.edu/Research/compgeom/gzstream/ 转载于:https://www.cnblogs.c ...

  7. python使用csv库写入文件

    dic=[{'rownum': 1, 'storeName': '育慧里', 'addressDetail': '小营东路3号北京凯基伦购物中心一层西侧', 'pro': '24小时,Wi-Fi,店内 ...

  8. 心得 ~ 使用 zlib库 解压缩 zip文件

    最近在完成一个项目,需要用到C++语言读取一个zip文件内指定文件的内容.在网上查阅了不少资料,针对过程中遇到的问题,自己也研究了一下,现将方法心得记录下来. 关于解压文件的方法,根据网上的资料,大概 ...

  9. python自带库zlib_python中的zlib解压

    根据RFC 1950,"OK"0x789C和"bad"0x78DA之间的区别在FLEVEL位字段中:FLEVEL (Compression level) The ...

最新文章

  1. Python改变生活 | OCR识别的花样使用
  2. ospaf-开源项目成熟度分析工具
  3. js:自动亮起100盏灯
  4. kafka reassign 限速_RabbitMQ 七战 Kafka,差异立现!
  5. python删除指定天数前的文件_python 删除指定时间间隔之前的文件实例
  6. mysql级联复制转换成一主两从_一主两从转级联复制
  7. C++中关于隐藏的理解
  8. 一步一步SharePoint 2007之十五:实现Form认证(5)——更改认证的Provider
  9. 【排序算法时间复杂度分析】递推式
  10. MyEclipse修改项目名称
  11. iOS 最新AppStore申请加急审核 以及 apple联系方式大全
  12. fedora35下配置grub2主题
  13. 微信小程序---倒计时
  14. 掏库存分享——抖音平台上可以用来当背景音乐的歌曲
  15. 炼油厂将abc三种原油 matlab求解,某工厂制造三种产品A、B和C需要两种资源(劳动力和原材料),目标是要确定总利润最大的最优生产计划。列出的线性...
  16. 11.3 树的遍历:LDR,LRD,VLR 相关代码
  17. 路由器和调制解调器的区别_如何重新启动路由器和调制解调器
  18. 基于STM32单片机的天然气甲烷硫化氢气体检测仪原理图PCB
  19. 计算机组成原理英语翻译,计算机课程英文翻译
  20. 火绒规则 禁止所有软件的安装_【技术宅】火绒安全软件防流氓规则编写及使用小白教程(附成品)...

热门文章

  1. bytebuf池_netty中的ByteBuf
  2. AI 合成数字化身?从根本上改变视频创作的过程! #Synthesia
  3. OpenCV图像处理视频教程——入门篇(二)
  4. 人工智能未来10年神经网络的发展趋势
  5. 大数据未来七大发展趋势
  6. 哲理故事与管理之道(1)-沟通从倾听开始
  7. 金秋吃货专属福利 一招轻松get
  8. linux下条码枪扫中文,斑马扫描枪扫描中文条码
  9. 学习笔记(10)伪类伪元素
  10. 14.逻辑漏洞(行话---------裹羊毛)