3 对称加密和非对称加密
1. 对称加密
所谓对称加密就是加密和解密用的是同一个秘钥. 也称为共享密钥加密算法,是一种将明文加密成密文的加密算法。其特点是加密和解密使用相同的密钥,也就是说,密钥是公开的,双方通过协商得到同一个密钥,然后使用该密钥对明文进行加密和解密操作。
对称加密算法的优点是算法简单、加密解密速度快,适合对大量数据进行加密操作,而且加密强度较高,保密性较好。常用的对称加密算法有DES、3DES、AES、RC4等。
(1) AES
是目前最广泛应用的对称加密算法之一,其密钥长度可以是128位、192位或256位,比DES和3DES更安全可靠,而且加密解密速度较快,被广泛应用于各种领域的数据加密保护中。
加密: """ 长度 16: *AES-128* 24: *AES-192* 32: *AES-256* MODE 加密模式. 常见的ECB, CBC ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。 CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或或操作后再加密,这样做的目的是增强破解难度。 CFB/OFB:实际上是一种反馈模式,目的也是增强破解的难度。 FCB和CBC的加密结果是不一样的,两者的模式不同,而且CBC会在第一个密码块运算时加入一个初始化向量。 """ from Crypto.Cipher import AES aes = AES.new(b"alexissbalexissb", mode=AES.MODE_CBC, IV=b"0102030405060708") data = "我吃饭了" data_bs = data.encode("utf-8") # 需要加密的数据必须是16的倍数 # 填充规则: 缺少数据量的个数 * chr(缺少数据量个数) pad_len = 16 - len(data_bs) % 16 data_bs += (pad_len * chr(pad_len)).encode("utf-8") bs = aes.encrypt(data_bs) print(bs) 解密: from Crypto.Cipher import AES aes = AES.new(b"alexissbalexissb", mode=AES.MODE_CBC, IV=b"0102030405060708") # 密文 bs = b'\xf6z\x0f;G\xdcB,\xccl\xf9\x17qS\x93\x0e' result = aes.decrypt(bs) # 解密 print(result.decode("utf-8"))
(2) DES
是一种比较常见的对称加密算法,它采用64位密钥对数据进行加密,加密和解密使用相同的密钥。但是由于其密钥长度较短,易受到暴力破解等攻击方式的影响,现在已经不再安全。
3DES是在DES基础上发展而来的一种加密算法,使用三个不同的密钥对数据进行三次加密,提高了密码强度,但是加密解密速度较慢。
加密: from Crypto.Cipher import DES # key: 8个字节 des = DES.new(b"alexissb", mode=DES.MODE_CBC, IV=b"01020304") data = "我要吃饭".encode("utf-8") # # 需要加密的数据必须是16的倍数 # # 填充规则: 缺少数据量的个数 * chr(缺少数据量个数) pad_len = 8 - len(data) % 8 data += (pad_len * chr(pad_len)).encode("utf-8") bs = des.encrypt(data) print(bs) 解密: des = DES.new(key=b'alexissb', mode=DES.MODE_CBC, IV=b"01020304") data = b'6HX\xfa\xb2R\xa8\r\xa3\xed\xbd\x00\xdb}\xb0\xb9' result = des.decrypt(data) print(result.decode("utf-8"))
2. 非对称加密
非对称加密. 加密和解密的秘钥不是同一个秘钥. 这里需要两把钥匙. 一个公钥, 一个私钥. 公钥发送给客户端. 发送端用公钥对数据进行加密. 再发送给接收端, 接收端使用私钥来对数据解密. 由于私钥只存放在接受端这边. 所以即使数据被截获了. 也是无法进行解密的.
(1) RSA
创建公钥和私钥:
from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5 from Crypto import Random import base64 # 随机 gen_random = Random.new # 生成秘钥 rsakey = RSA.generate(1024) with open("rsa.public.pem", mode="wb") as f: f.write(rsakey.publickey().exportKey()) with open("rsa.private.pem", mode="wb") as f: f.write(rsakey.exportKey()) 加密: data = "我要吃饭了" with open("rsa.public.pem", mode="r") as f: pk = f.read() rsa_pk = RSA.importKey(pk) rsa = PKCS1_v1_5.new(rsa_pk) result = rsa.encrypt(data.encode("utf-8")) # 处理成b64方便传输 b64_result = base64.b64encode(result).decode("utf-8") print(b64_result) 解密: data = "e/spTGg3roda+iqLK4e2bckNMSgXSNosOVLtWN+ArgaIDgYONPIU9i0rIeTj0ywwXnTIPU734EIoKRFQsLmPpJK4Htte+QlcgRFbuj/hCW1uWiB3mCbyU3ZHKo/Y9UjYMuMfk+H6m8OWHtr+tWjiinMNURQpxbsTiT/1cfifWo4=" with open("rsa.private.pem", mode="r") as f: prikey = f.read() rsa_pk = RSA.importKey(prikey) rsa = PKCS1_v1_5.new(rsa_pk) result = rsa.decrypt(base64.b64decode(data), gen_random) print(result.decode("utf-8"))
本文来自博客园,作者:生而自由爱而无畏,转载请注明原文链接:https://www.cnblogs.com/zczhaod/p/17748204.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具