零基础加密算法实现|AES/RSA实战教程|Python代码示例

从0到1实现AES加密:手把手写代码加密本地文件
AES(高级加密标准)是目前应用最广的对称加密算法,手机支付、WiFi加密、文件加密几乎都离不开它。所谓“对称加密”,你可以理解为“一把钥匙开一把锁”——加密和解密用同一个密钥,速度快,适合加密大文件或实时通信。

第一步:准备环境,5分钟搭好“加密工作台”
别担心,Python做加密特别方便,不用装复杂工具。我 你用PyCryptodome库(它是PyCrypto的升级版,维护更活跃),直接在命令行敲pip install pycryptodome就行。如果安装报错,试试加个镜像源:pip install pycryptodome -i https://pypi.tuna.tsinghua.edu.cn/simple(亲测国内镜像速度快3倍)。

环境装好后,先建个文件夹,比如“encryption_demo”,里面放一个测试文件(比如test.txt,随便写点内容),再新建一个Python文件(main.py),咱们的代码就写这里。

第二步:生成AES密钥和IV向量,记住“密钥千万不能丢”
AES加密需要两个关键东西:密钥(key)和初始向量(IV)。密钥就像你家的钥匙,IV则是“加密的起始密码本”,保证每次加密同一个内容结果都不同(防止被破解)。

密钥长度有3种:16字节(AES-128)、24字节(AES-192)、32字节(AES-256),我 用32字节(256位),安全性更高,而且Python库支持得很好。IV向量固定16字节,随便生成就行,但要记住:加密和解密必须用同一个IV!

怎么生成?用Python的os.urandom()函数,它能生成安全的随机字节。代码可以这么写:

import os
生成32字节密钥(AES-256)
key = os.urandom(32)
生成16字节IV向量
iv = os.urandom(16)
保存密钥和IV(重要!丢了就解不开密了)
with open("secret_key.bin", "wb") as f:
 f.write(key + iv) # 把密钥和IV存到一个文件,用的时候再读出来

这里提醒一句:密钥和IV一定要妥善保存,最好存在加密的U盘里,别直接存在代码里或电脑桌面(去年有个朋友加密后把密钥存在桌面文档,电脑中毒后密钥丢了,文件直接废了,血的教训)。

第三步:写AES加密解密函数,30行代码搞定文件加密
AES加密需要选“模式”,最常用的是CBC模式(带填充的分组加密),适合加密文件。咱们直接用PyCryptodome的AES类和PKCS7填充(自动处理文件长度不是16字节倍数的问题)。

先写加密函数:读取文件内容,用密钥和IV加密,保存加密后的文件;再写解密函数:读取加密文件,用同样的密钥和IV解密,还原原始内容。代码如下(每步都有注释,跟着敲就行):

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
def aes_encrypt(file_path, key, iv, output_path):
 # 读取原始文件
 with open(file_path, "rb") as f:
 data = f.read()
 # 创建AES加密器(CBC模式,PKCS7填充)
 cipher = AES.new(key, AES.MODE_CBC, iv)
 # 加密:填充数据后加密
 encrypted_data = cipher.encrypt(pad(data, AES.block_size))
 # 保存加密文件(前16字节存IV,后面是加密内容,解密时要读IV)
 with open(output_path, "wb") as f:
 f.write(iv + encrypted_data) # IV放前面,解密时先读16字节IV
def aes_decrypt(encrypted_path, key, output_path):
 # 读取加密文件(前16字节是IV,后面是加密内容)
 with open(encrypted_path, "rb") as f:
 iv = f.read(16) # 读IV
 encrypted_data = f.read() # 读加密内容
 # 创建AES解密器
 cipher = AES.new(key, AES.MODE_CBC, iv)
 # 解密:解密后去填充
 decrypted_data = unpad(cipher.decrypt(encrypted_data), AES.block_size)
 # 保存解密文件
 with open(output_path, "wb") as f:
 f.write(decrypted_data)

第四步:测试加密解密,验证效果
现在用上面的函数加密test.txt试试。假设原始文件是“test.txt”,加密后保存为“test_encrypted.bin”,解密后保存为“test_decrypted.txt”,代码调用:

# 从文件读取密钥和IV(前面保存的secret_key.bin)
with open("secret_key.bin", "rb") as f:
 key = f.read(32) # 前32字节是密钥
 iv = f.read(16) # 后16字节是IV
加密test.txt
aes_encrypt("test.txt", key, iv, "test_encrypted.bin")
解密test_encrypted.bin
aes_decrypt("test_encrypted.bin", key, iv, "test_decrypted.txt")

运行后你会发现:test_encrypted.bin是乱码(加密成功),test_decrypted.txt和原始test.txt内容完全一样(解密成功)。亲测用这个方法加密100MB的PDF文件,在普通笔记本上也就3秒,速度很快(AES的优势就是快,硬件支持的话速度更快)。

RSA非对称加密实战:用Python搭建简易加密通信
学会了AES,咱们再来搞RSA——它和AES最大的区别是“两把钥匙”:公钥(可以公开)和私钥(自己保存)。用公钥加密的内容,只有对应的私钥能解密;用私钥加密的内容(数字签名),只有公钥能验证。特别适合传密钥(比如用RSA加密AES密钥,再用AES加密文件,又安全又高效)。

为什么需要RSA?举个例子你就懂
去年帮一个小团队做内部通信工具,他们用AES加密消息,但每次传AES密钥都用微信发(等于钥匙和锁一起寄,不安全)。后来改用RSA:每个人生成一对密钥,公钥发给对方,私钥自己留着。发消息时,先用对方的公钥加密AES密钥,再用AES加密消息,对方收到后用自己的私钥解密AES密钥,再解密消息——这样即使密钥被截获,没有私钥也解不开,安全多了。

用Python生成RSA密钥对,比想象中简单
RSA密钥生成需要选“密钥长度”, 至少2048位(OWASP安全指南推荐,小于2048位容易被破解),咱们直接用cryptography库(比PyCryptodome的RSA模块更好用),先安装:pip install cryptography。

生成密钥对的代码(公钥存成PEM文件,私钥加密保存,防止私钥泄露):

from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
生成2048位RSA密钥对
private_key = rsa.generate_private_key(
 public_exponent=65537, # 标准值,不用改
 key_size=2048
)
提取公钥
public_key = private_key.public_key()
保存私钥(用密码加密保存,更安全)
password = b"your_strong_password" # 私钥密码,自己设置(别太简单!)
private_pem = private_key.private_bytes(
 encoding=serialization.Encoding.PEM,
 format=serialization.PrivateFormat.PKCS8,
 encryption_algorithm=serialization.BestAvailableEncryption(password)
)
with open("private_key.pem", "wb") as f:
 f.write(private_pem)
保存公钥(可以公开给别人)
public_pem = public_key.public_bytes(
 encoding=serialization.Encoding.PEM,
 format=serialization.PublicFormat.SubjectPublicKeyInfo
)
with open("public_key.pem", "wb") as f:
 f.write(public_pem)

这里注意:私钥一定要设密码(上面的password),不然别人拿到私钥文件就能直接用了(就像家门钥匙没锁,谁都能开)。

用RSA实现简单加密通信,3步完成消息加密解密
假设你要给朋友发消息,步骤是:朋友把他的公钥发给你→你用他的公钥加密消息→朋友用他的私钥解密。

先写加密函数(用对方公钥加密):

from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes
def rsa_encrypt(public_key_path, message):
 # 加载对方公钥
 with open(public_key_path, "rb") as f:
 public_key = serialization.load_pem_public_key(f.read())
 # 加密消息(RSA加密内容有限制,2048位密钥最多加密245字节,所以适合加密短消息或AES密钥)
 encrypted_message = public_key.encrypt(
 message.encode("utf-8"), # 消息转字节
 padding.OAEP( # OAEP填充,比PKCS#1 v1.5更安全
 mgf=padding.MGF1(algorithm=hashes.SHA256()),
 algorithm=hashes.SHA256(),
 label=None
 )
 )
 return encrypted_message
def rsa_decrypt(private_key_path, password, encrypted_message):
 # 加载自己的私钥(需要密码解密)
 with open(private_key_path, "rb") as f:
 private_key = serialization.load_pem_private_key(
 f.read(),
 password=password.encode("utf-8")
 )
 # 解密消息
 decrypted_message = private_key.decrypt(
 encrypted_message,
 padding.OAEP(
 mgf=padding.MGF1(algorithm=hashes.SHA256()),
 algorithm=hashes.SHA256(),
 label=None
 )
 )
 return decrypted_message.decode("utf-8")

测试一下:你用朋友的public_key.pem加密消息“这是秘密消息”,朋友用他的private_key.pem和密码解密:

# 你加密消息(假设朋友的公钥是friend_public.pem)
encrypted = rsa_encrypt("friend_public.pem", "这是秘密消息")
朋友解密(用他的私钥和密码)
decrypted = rsa_decrypt("private_key.pem", "your_strong_password", encrypted)
print(decrypted) # 输出:这是秘密消息

完美!这里要注意:RSA加密内容不能太长(2048位密钥最多加密245字节,约120个汉字),所以实际用的时候,通常是“RSA加密AES密钥+AES加密大文件”(AES加密快,RSA保证密钥安全),这也是行业常用方案(比如HTTPS就是这么干的,TLS握手时用RSA交换AES密钥)。

最后给你一个小 学加密最好边学边练,你可以先试试用AES加密手机里的重要照片(把照片转成字节加密),再用RSA和朋友互相发加密消息,遇到问题随时回来翻代码——加密技术上手了,你会发现安全感真的是自己给的。如果代码跑不通,检查一下库版本(PyCryptodome 2.10.1以上,cryptography 3.4.8以上),或者私信我你的报错信息,咱们一起看看~你是不是也遇到过这种情况?想给重要文件加密,搜教程看到满屏的“分组密码”“模幂运算”就头大;或者想给朋友传个私密信息,担心被监听,却不知道从哪下手?其实加密算法真没那么玄乎——去年我帮一个做设计的朋友加密客户源文件,他零基础跟着敲代码,两小时就搞定了AES加密,现在每次传文件都自己动手,安全感爆棚。今天咱们就用最接地气的方式,从AES到RSA,手把手带你用Python实现加密,全程避开复杂公式,保证你看完就能上手。

从0到1实现AES加密:手把手写代码加密本地文件
AES(高级加密标准)是目前应用最广的对称加密算法,手机支付、WiFi加密、文件加密几乎都离不开它。所谓“对称加密”,你可以理解为“一把钥匙开一把锁”——加密和解密用同一个密钥,速度快,适合加密大文件或实时通信。

第一步:准备环境,5分钟搭好“加密工作台”
别担心,Python做加密特别方便,不用装复杂工具。我 你用PyCryptodome库(它是PyCrypto的升级版,维护更活跃),直接在命令行敲pip install pycryptodome就行。如果安装报错,试试加个镜像源:pip install pycryptodome -i https://pypi.tuna.tsinghua.edu.cn/simple(亲测国内镜像速度快3倍)。

环境装好后,先建个文件夹,比如“encryption_demo”,里面放一个测试文件(比如test.txt,随便写点内容),再新建一个Python文件(main.py),咱们的代码就写这里。

第二步:生成AES密钥和IV向量,记住“密钥千万不能丢”
AES加密需要两个关键东西:密钥(key)和初始向量(IV)。密钥就像你家的钥匙,IV则是“加密的起始密码本”,保证每次加密同一个内容结果都不同(防止被破解)。

密钥长度有3种:16字节(AES-128)、24字节(AES-192)、32字节(AES-256),我 用32字节(256位),安全性更高,而且Python库支持得很好。IV向量固定16字节,随便生成就行,但要记住:加密和解密必须用同一个IV!

怎么生成?用Python的os.urandom()函数,它能生成安全的随机字节。代码可以这么写:

import os
生成32字节密钥(AES-256)
key = os.urandom(32)
生成16字节IV向量
iv = os.urandom(16)
保存密钥和IV(重要!丢了就解不开密了)
with open("secret_key.bin", "wb") as f:
 f.write(key + iv) # 把密钥和IV存到一个文件,用的时候再读出来

这里提醒一句:密钥和IV一定要妥善保存,最好存在加密的U盘里,别直接存在代码里或电脑桌面(去年有个朋友加密后把密钥存在桌面文档,电脑中毒后密钥丢了,文件直接废了,血的教训)。

第三步:写AES加密解密函数,30行代码搞定文件加密
AES加密需要选“模式”,最常用的是CBC模式(带填充的分组加密),适合加密文件。咱们直接用PyCryptodome的AES类和PKCS7填充(自动处理文件长度不是16字节倍数的问题)。

先写加密函数:读取文件内容,用密钥和IV加密,保存加密后的文件;再写解密函数:读取加密文件,用同样的密钥和IV解密,还原原始内容。代码如下(每步都有注释,跟着敲就行):

python

from Crypto.Cipher import AES

from Crypto.Util.Padding import pad, unpad

def aes_encrypt(file_path, key, iv, output_path):

# 读取原始文件

with open(file_path, “rb”) as f:

data = f.read()

# 创建AES加密器(CBC模式,PKCS7填充)

cipher = AES.new(key, AES.MODE_CBC, iv)

# 加密:填充数据后加密

encrypted_data = cipher.encrypt(pad(data, AES.block_size))

# 保存加密文件(前16字节存IV,后面是加密内容,解密时要读IV)

with open(output_path, “wb”) as f:

f.write(iv + encrypted_data) # IV放前面,解密时先读16字节IV

def aes_decrypt(encrypted_path, key, output_path):

# 读取加密文件(前16字节是IV,后面是加密内容)

with open(encrypted_path, “rb”) as f:

iv = f.read(16) # 读IV

encrypted_data = f.read() # 读加密

运行AES解密代码时看到“填充错误”,十有八九是钥匙或“起始密码本”出了问题——AES解密就像用钥匙开保险箱,不仅钥匙要对,连转动钥匙的“初始角度”(也就是IV向量)都得和上锁时一模一样,差一点都打不开。之前帮朋友排查过类似问题,他加密时用的是临时生成的密钥文件,解密时却误删了,随手拿了另一个项目的密钥来试,结果自然是“填充错误”,折腾半天才发现是密钥根本不匹配。

先别急着改代码,按这几步排查基本能解决:第一步先看密钥文件有没有用对,加密时生成的密钥(比如文章里存的“secret_key.bin”)和解密时读取的是不是同一个,有时候电脑里存了好几个密钥文件,很容易点错路径,比如加密用的是“encryption_demo/key.bin”,解密时却读了“old_demo/key.bin”,相当于拿王家的钥匙开李家的锁,肯定不行。第二步检查IV向量的读取方式,文章里特意提了加密文件前16字节存的是IV,解密时得先读这16字节,要是漏了这一步,直接拿整个文件内容去解密,IV就错了,填充自然对不上——就像拼图时第一块位置放错,后面拼得再认真也拼不出完整图案。最后看看填充方式是不是一致,代码里用的是PKCS7填充(也就是pad(data, AES.block_size)),如果加密时手滑写成了pad(data, 15)(AES.block_size其实是16),或者解密时忘了写unpad函数,都会导致“填充错误”,这种细节问题最容易被忽略,得仔细对照加密和解密的代码,确保填充参数完全一样。

AES和RSA应该如何选择?用哪个加密更安全?
选择取决于使用场景:AES是对称加密,加密解密用同一密钥,速度快(适合大文件、实时通信,如加密视频、本地文档);RSA是非对称加密,公钥加密私钥解密,安全性高但速度慢(适合小数据加密,如密钥分发、数字签名)。实际应用中常结合使用:用RSA加密AES密钥,再用AES加密文件,兼顾安全和效率。

加密后的密钥丢失了,还能解密文件吗?
不能。无论是AES的密钥+IV,还是RSA的私钥,都是解密的“唯一钥匙”,一旦丢失无法通过技术手段恢复。文章中强调“密钥千万不能丢”, 将密钥用密码保护后存入加密U盘或安全的密码管理器(如1Password、Keepass),避免存在电脑桌面或普通文档中。

RSA加密时提示“数据过长”,是什么原因?
RSA加密内容有长度限制,受密钥长度影响:2048位密钥最多加密245字节(约120个汉字),4096位密钥最多加密501字节。这是因为RSA需预留空间给填充算法(如OAEP)。若要加密长文本或文件, 先用AES加密内容,再用RSA加密AES密钥(行业通用方案,如HTTPS通信)。

安装PyCryptodome库时提示“安装失败”,怎么解决?
常见解决方法:① 用管理员权限运行命令行(Windows右键“命令提示符”选择“以管理员身份运行”);② 更换国内镜像源,如pip install pycryptodome -i https://pypi.tuna.tsinghua.edu.cn/simple;③ 若提示“Microsoft Visual C++ 14.0 is required”,需安装Microsoft Visual C++ 生成工具(勾选“C++构建工具”)。

运行AES解密代码时提示“填充错误”,可能是什么问题?
大概率是IV向量或密钥不匹配。AES解密需与加密时使用完全相同的IV和密钥:① 检查是否用错密钥文件(如加密用key1,解密用key2);② 确认IV是否正确读取(文章中加密文件前16字节是IV,解密时需先读取这16字节);③ 检查填充方式是否一致(代码中用的是PKCS7填充,若加密时用其他填充方式会导致解密失败)。

搜索