最近,接了一个关于数据加密的任务,感觉挺高大上的,就这样网上海搜了一通,各种加密算法就出来了,听过的,没听过得,一时间不知道该用哪一种算法了,有种挑花眼的感觉,最后看到有一个ASE的加密算法看见还不错,so咱们就先聊聊这方面的问题吧
1 | pip install pycrypto |
ASE
AES(The Advanced Encryption Standard)是美国国家标准与技术研究所用于加密电子数据的规范。它被预期能成为人们公认的加密包括金融、电信和政府数字信息的方法。AES是一个对称分组密码算法,旨在取代DES成为广泛使用的标准。
AES加解密的流程图如下:
python中使用pycrypto模块来完成数据的加密过程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #coding: utf8 import sys from Crypto.Cipher import AES from binascii import b2a_hex, a2b_hex class prpcrypt(): def __init__( self , key): self .key = key self .mode = AES.MODE_CBC #加密函数,如果text不是16的倍数【加密文本text必须为16的倍数!】,那就补足为16的倍数 def encrypt( self , text): cryptor = AES.new( self .key, self .mode, self .key) #这里密钥key 长度必须为16(AES-128)、24(AES-192)、或32(AES-256)Bytes 长度.目前AES-128足够用 length = 16 count = len (text) add = length - (count % length) text = text + ( '\0' * add) self .ciphertext = cryptor.encrypt(text) #因为AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题 #所以这里统一把加密后的字符串转化为16进制字符串 return b2a_hex( self .ciphertext) #解密后,去掉补足的空格用strip() 去掉 def decrypt( self , text): cryptor = AES.new( self .key, self .mode, self .key) plain_text = cryptor.decrypt(a2b_hex(text)) return plain_text.rstrip( '\0' ) if __name__ = = '__main__' : pc = prpcrypt( 'keyskeyskeyskeys' ) #初始化密钥 e = pc.encrypt( "00000" ) d = pc.decrypt(e) print e, d e = pc.encrypt( "00000000000000000000000000" ) d = pc.decrypt(e) print e, d |
Hashlib
其中 hashlib是涉及安全散列和消息摘要,提供多个不同的加密算法借口,如SHA1、SHA224、SHA256、SHA384、SHA512、MD5等接口,下面我们就以其中最常用的 MD5加密算法为例来分析一下加密过程。
1 2 3 4 5 6 | import hashlib hash = hashlib.md5() #创建hash对象,md5:(message-Digest Algorithm 5)消息摘要算法,得出一个128位的密文 hash .update(bytes( 'admin' , encoding = 'utf-8' )) #以字符串参数更新哈希对象 print ( hash .hexdigest()) #返回十六进制数字字符串 print ( hash .digest()) #返回二进制数字字符串 |
以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。
1 2 3 4 5 | import hashlib hash = hashlib.md5(bytes( '898oaFs09f' , encoding = "utf-8" )) hash .update(bytes( 'admin' , encoding = "utf-8" )) print ( hash .hexdigest()) |
base64
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,当然也可以用来加密一些信息。Base64编码,64指A-Z、a-z、0-9、+和/这64个字符,还有“=”号不属于编码字符,而是填充字符。这是最简单的方法了,但是不够保险,因为如果别人拿到你的密文,也可以自己解密来得到明文。
1 2 3 4 5 6 7 8 9 10 11 | import base64 s1 = base64.encodestring( 'hello world' ) s2 = base64.decodestring(s1) print s1 print s2 aGVsbG8gd29ybGQ = hello world |
crypt
crypt 模块(只用于 Unix/Linux,windows平台上没有此模块)实现了单向的 DES 加密, Unix/Linx系统使用这个加密算法来储存密码,这个模块真正也就只在检查这样的密码时有用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | >>> import crypt >>> import random >>> import string >>> chars = string.digits + string.letters >>> chars '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' >>> def getsalt(chars): ... return random.choice(chars) + random.choice(chars) ... >>> salt = getsalt(chars) >>> salt 'sb' >>> msg = crypt.crypt( 'hello,world!' ,salt) >>> msg 'sb0xvR6UbZsqw' |
后面我们将会持续更新一些其他的常用算法,以便以后大家方便学习
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现