Python技术迷

python面试题:如何实现AES加密解密?

讲点AES加密的事儿,别被“高级加密标准”这四个字唬住了。它虽然听起来像是什么特工片里的密码破译神器,但对我们写Python的程序员来说,用起来其实也没那么玄乎,难的是那些年踩过的坑。

我第一次真正在项目里用AES,是给一个小电商系统做支付接口的签名验证。客户那边要求数据传输要加密,而且不能用HTTP Basic认证这种“祖传方案”,所以我们不得不在每次调用API时都手动加密数据。讲真,搞完那一套之后我只想说,光知道怎么加密是不够的,不知道坑在哪儿,生产环境迟早得炸。

我们先从最基础的说起。AES是一种对称加密方式——所谓对称,就是加密解密用同一把钥匙。有人说这不安全,我不认同。问题不是对称不对称,而是你那把“钥匙”藏得牢不牢。别傻乎乎地把key写进前端代码,或者干脆放明文在Git仓库里……这种操作,迟早要被安全团队请去喝咖啡。

来看这段Python代码,典型的AES CBC模式加解密实现:

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64

key = b'0123456789abcdef'# 16字节密钥
iv = b'0123456789abcdef'# 16字节IV,别写死在生产环境啊

defaes_encrypt(key, iv, plain_text):
    cipher = AES.new(key, AES.MODE_CBC, iv)
    padded = pad(plain_text, AES.block_size)
    encrypted = cipher.encrypt(padded)
return base64.b64encode(encrypted).decode()

defaes_decrypt(key, iv, cipher_text_b64):
    encrypted = base64.b64decode(cipher_text_b64)
    cipher = AES.new(key, AES.MODE_CBC, iv)
    decrypted = unpad(cipher.decrypt(encrypted), AES.block_size)
return decrypted.decode()

你看这个例子,流程很标准:加密前要填充(pad),解密后要去填充(unpad),不然你加出来的数据要么长度不对,要么解出来乱码一地。

CBC模式还有个关键点就是IV(初始化向量)。这货很重要,没设置对,会直接影响加密安全性和解密正确性。很多人上来就写死一个IV,这是新手最容易犯的错——你只要用同一组key和IV加密相同的明文,出来的密文一模一样,这就暴露信息了。实际场景下,IV应该是随机生成的,然后和密文一起传输或存储,比如前16字节就是IV,后面是密文,这样还能兼容各种客户端。

然后就是填充问题。AES规定明文必须是16字节的倍数,如果你输入的不是,就得补全。常用的是PKCS7填充方案,Python 这块用 Crypto.Util.Padding 很方便,但记得用的是哪个,解密时别搞混了。

还有个小细节,Base64编码不是必须的,它只是为了方便传输。你直接把加密后的二进制数据传给前端或者写入数据库,很可能会出乱码甚至引发bug。我在一个老系统里就遇到过,前端拿到后端Base64前的密文硬生生当字符串处理,结果展示出来的是“乌龙面乱码”。

别看只是几行代码,坑还真不少。我那时候踩过一次比较经典的雷——密钥和IV都没问题,但一解密就报错。后来才发现,是填充方式不匹配,后端加密时用了ISO10126,前端解密用了PKCS7,尴尬得很。还有一次,加密前没统一字符编码,一个GBK一个UTF-8,加密内容一看就不是一回事。

至于ECB模式,讲真就别用了。虽然代码上更简单,但安全性几乎为零。它是逐块独立加密的,根本没有任何随机性,同样的输入总是输出同样的结果,在图像加密上尤其明显,能一眼看出原图轮廓。你要是拿这个搞什么身份验证之类的,基本等于裸奔。

当然,安全不是只靠加密算法的。你密钥要是放在硬编码里,那AES256也没用。建议配合环境变量、KMS、HSM这类手段来安全管理密钥。有条件的公司可以考虑配置独立的加解密服务,把这块逻辑抽出去,别每个模块都重复造轮子。

还有一个点必须说清楚,就是库的选择。很多老教程还在用PyCrypto,现在它已经彻底不维护了,应该用它的分支 PyCryptodome。用法基本一样,就是包名变了,记得卸掉旧的重新装:

pip uninstall Crypto
pip install pycryptodome

最后总结一句话:AES虽然是经典算法,但实际用起来远比看起来复杂。光会调用API没用,得理解每一个参数背后的原理,才能在复杂系统中用得稳当。

对了,你们的项目加密方案是怎么设计的?密钥怎么管理的?有没有踩过什么坑?我挺想听听别人的故事……

最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek

也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。

对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
🔥虎哥私藏精品 热门推荐🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。

资料包含了《IDEA视频教程》、《最全python面试题库》、《最全项目实战源码及视频》及《毕业设计系统源码》,总量高达650GB,全部免费领取。