5.RSA和AES加密(python)

一、安装RSA模块

复制代码
# Python3 专用pip(常见)
pip3 install rsa
python 复制代码
# 导入rsa模块
import rsa

# 生成一对RSA密钥(验证功能可用)
public_key, private_key = rsa.newkeys(512)
print("RSA模块安装成功!")

二、RSA加解密过程

1、非对称密钥

(public-keycryptography),又称为公开密钥加密,服务端会生成一对密钥,一个私钥保存在服务端,仅自己知道,另一个是公钥,公钥可以自由发布供任何人使用。客户端的明文通过公钥加密后的密文需要用私钥解密。非对称密钥在加密和解密的过程的使用的密钥是不同的密钥,加密和解密是不对称的,所以称之为非对称加密。与对称密钥加密相比,非对称加密无需在客户端和服务端之间共享密钥,只要私钥不发给任何用户,即使公钥在网上被截获,也无法被解密,仅有被窃取的公钥是没有任何用处的。常见的非对称加密有RSA,非对称加解密的过程:

  • 服务端生成配对的公钥和私钥
  • 私钥保存在服务端,公钥发送给客户端
  • 客户端使用公钥加密明文传输给服务端
  • 服务端使用私钥解密密文得到明文

2、python代码实现

python 复制代码
# 导入rsa模块
import rsa
# 从Python内置的binascii模块导入两个核心转换函数
# binascii模块:专注于二进制数据与ASCII编码的十六进制字符串之间的相互转换
# b2a_hex:全称 bytes-to-ascii hex,将二进制字节数据(bytes)转为ASCII格式的十六进制字节串
# a2b_hex:全称 ascii hex-to-bytes,将ASCII格式的十六进制字符串/字节串转回原始二进制数据
# 补充:b2a_hex等价于hexlify,a2b_hex等价于unhexlify,是成对的反向操作
from binascii import b2a_hex,a2b_hex

# 第一步:生成RSA公钥和私钥
public_key, private_key = rsa.newkeys(256)
# print(public_key)
# print(private_key)

# 第二步:公钥加密
encrypt = rsa.encrypt('Hello,网络安全'.encode(), public_key)
print(encrypt)
decode = b2a_hex(encrypt).decode()
print(decode) # 转换成十六进制的字符串

# 第三步:私钥解密
decrypt = rsa.decrypt(a2b_hex(decode), private_key)
print(decrypt.decode())

三、HTTPS通信过程

主要涉及加密算法:SHA,RSA,AES,利用SHA验证证书指纹,利用RSA加密随机值密钥,利用AES进行内容的对称加密解密。

四、对称加密和AES

1、AES简介

对称密钥(Symmetric-keyalgorithm)又称为共享密钥加密,对称密钥在加密和解密的过程中使用的密钥是相同的,常见的对称加密算法有DES、3DES、AES、RC5、RC6。对称密钥的优点是计算速度快,但是他也有缺点,密钥需要在通讯的两端共享,让彼此知道密钥是什么对方才能正确解密,如果所有客户端都共享同一个密钥,那么这个密钥就像万能钥匙一样,可以凭借一个密钥破解所有人的密文了,如果每个客户端与服务端单独维护一个密钥,那么服务端需要管理的密钥将是成千上万,这会给服务端带来噩梦。

高级加密标准(AES,AdvancedEncryptionStandard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。AES属于对称加密的代表,应用范围较广,其基本流程如下:

2、python代码实现

复制代码
安装第三方库:
pip install pycryptodome
python 复制代码
from Crypto.Cipher import AES
from binascii import a2b_hex,b2a_hex

# 加密过程
source = 'Hello-网络安全'

# 如果source分组后剩余长度不足16位的倍数就用空格补足16位
if len(source.encode('utf-8')) % 16:
    add = 16 - (len(source.encode('utf-8')) % 16)
else:
    add = 0
source = source + ('\0' * add)
print(source)

# 定义密钥和偏移量,必须是16个字节、24字节或32字节
key = 'Hello-world12345'.encode()
mode = AES.MODE_CBC # 有五种加密方式
# 定义偏移量,字节类型
iv = b'1234567890ABCDEF'
cryptos = AES.new(key, mode, iv)

cipher = cryptos.encrypt(source.encode())
print(cipher)
print(b2a_hex(cipher).decode())


print("="*20)
# 解密过程
source = '2ed8efac7922c824c1921ec18937abc5e033feedd2010ac6f72ae44632147b36'
# 定义密钥和偏移量,必须是16个字节、24字节或32字节
key = 'Hello-world12345'.encode()
mode = AES.MODE_CBC # 有五种加密方式
# 定义偏移量,字节类型
iv = b'1234567890ABCDEF'
cryptos = AES.new(key, mode, iv)

dest = cryptos.decrypt(a2b_hex(source))
print(dest.decode().strip('\0'))

加密过程:

解密过程:

相关推荐
阿捞219 小时前
python-langchain框架(3-20-智能问答ZeroShot_ReAct Agent 从零搭建)
python·react.js·langchain
数据知道19 小时前
claw-code 源码分析:从 REPL 到服务端——CLI / HTTP(SSE) / LSP 多入口如何共享同一颗 runtime 心?
python·网络协议·http·ai·里氏替换原则·claude code
酿情师19 小时前
2026软件系统安全赛初赛RSA(赛后复盘)
android·网络·安全·密码学·rsa
不解不惑19 小时前
gemma4 实现ASR语音识别
人工智能·python·语音识别
来自远方的老作者19 小时前
第8章 流程控制-8.2 选择结构
开发语言·python·选择结构
kaico201820 小时前
python常用标准库
开发语言·python
路溪非溪20 小时前
Linux中Netlink简介和使用总结
linux·网络·arm开发·驱动开发
TTGGGFF20 小时前
SnapTranslate 2.0:轻量级全场景划词翻译——添加生词本以及生词本复习AI助手功能!
python·划词翻译·git开源
杜子不疼.20 小时前
Python + Selenium + AI 智能爬虫:自动识别反爬与数据提取
人工智能·python·selenium
大新软件技术部20 小时前
Linux 服务器下dotnetcore 程序监控
linux·运维·服务器