Python进阶 数据加解密

数据安全是永远必须考虑的重点,而数据加解密就是数据安全始终绕不过去的安全港湾!


谁能解开我的密码?

本文讲述:

利用非对称密钥RSA和对称密钥AES算法对传输数据进行加密

实现原理:

  • 发送方本地保存有RSA公钥,发送数据前,利用AES算法对传输数据明文进行加密,利用RSA算法对AES的密钥进行加密
  • 将密钥的密文和数据的密文打包到一块进行传输
  • 接收方本地保存有RSA密钥,接收数据后,对传输密文进行拆分,利用RSA算法对AES密钥进行解密,然后利用AES算法还原数据明文

相关知识:

常用编码方法对比

  • arscii: 可见字符与不可见字符,同二进制字节的映射关系

  • unicode: 增加了对中文等语言的支持

  • utf-8: unicode的最常用的实现方式,变长编码,使用1~4个字节表示一个符号,对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8编码和ASCII码是相同的

  • python的encoding函数默认编码是utf-8,常用于转换python的字符串对象和字节流对象

  • gbk: 国标,中文编码是双字节来表示的,英文编码是用ascii来表示,即单字节

  • base64: 用64个可打印字符来表示二进制数据

  • 一般用于在HTTP协议下传输数据,因为HTTP协议是文本传输协议,需要将二进制数据转化为字符数据,但直接转换是不行的,因为网络只能传输可打印字符,base64应运而生

  • 编码与解码的处理对象是byte,故对原数据要先编码,使原本的str类型变成byte,解码后直接输出来的是byte对象,故要解码成str对象

  • 转化办法:将原始数据每三个字节为一组(不足的补=),共24个bit,将其拆分为4组,每组6个bit,每组前面补\x00,将其变为4组8bit

  • 现在各协议和系统对二进制数据的支持都叫好,但某些特殊场景,如电子邮件的附件,网页图片传输,SMTP,还需要用到base64

转化办法图示

常见加密算法:

  • AES: 对称加密算法,适合用于加密大量信息,比如明文数据
  • RSA:非对称加密算法,适合用于加密少量信息,比如AES密钥
  • 二者操作的对象都是二进制数据

类文件对象StringIO和BytesIO

  • 相当于内存中的文件,可以像磁盘文件那样打开和读取,用于内存到内存的传输
  • StringIO只能存储字符串,遇到从网络下载的图片视频等Bytes类型的内容就不行了,需要用到专门存储Bytes类型的BytesIO对象

目之所及,皆为珍惜

下面是本文核心部分,直接上代码

from Cryptodome.Cipher import AES, PKCS1_OAEP
from Cryptodome.PublicKey import RSA
from Cryptodome.Random import get_random_bytes
from io import BytesIO

import base64
import zlib

# 生成RSA公钥和密钥
def generate_key():
    new_key = RSA.generate_key(2048)
    private_key = new_key.exportKey()
    public_key = new_key.public_key().exportKey()

    with open('key.private', 'wb') as f:
        f.write(private_key)

    with open('key.public', 'wb') as f:
        f.write(public_key)

def get_rsa_cipher_by_key(keytype):
    with open(f'key.{keytype}') as f:
        key = f.read()
    rsakey = RSA.importKey(key)
    return (PKCS1_OAEP.new(rsakey), rsakey.size_in_bytes())
# 加密:利用AES加密数据,同时用RSA对AES密钥进行加密,将加密后的部分合并,base64编码后传输
def encrypt(plaintext):
    compressed_text = zlib.compress(plaintext)
    session_key = get_random_bytes(16)

    cipher_aes = AES.new(session_key, AES.MODE_EAX)
    ciphertext, tag = cipher_aes.encrypt_and_digest(compressed_text)
    cipher_rsa, _ = get_rsa_cipher_by_key('public')

    encrypted_session_key = cipher_rsa.encrypt(session_key)
    msg_payload = encrypted_session_key + cipher_aes.nonce + tag + ciphertext
    encrypted = base64.encodebytes(msg_payload)
    return encrypted

# 解密:base64解码密文,用bytesIO对象拆分出密钥和数据部分,读取本地的RSA密钥,用RSA解密出AES的密钥,再用AES解密出明文数据
def decrypt(encrypted):
    encrypted_bytes = BytesIO(base64.decodebytes(encrypted))
    cipher_rsa, keysize_in_bytes = get_rsa_cipher_by_key('private')

    encrypted_session_key = encrypted_bytes.read(keysize_in_bytes)
    nonce = encrypted_bytes.read(16)
    tag = encrypted_bytes.read(16)
    ciphertext = encrypted_bytes.read()

    session_key = cipher_rsa.decrypt(encrypted_session_key)
    cipher_aes = AES.new(session_key, AES.MODE_EAX, nonce)
    decrypted = cipher_aes.decrypt_and_verify(ciphertext, tag)

    plaintext = zlib.decompress(decrypted)
    return plaintext
# 下面测试加解密效果
if __name__ == "__main__":
    generate_key()
    plaintext = b"This is a secrete message, right?"
    print(decrypt(encrypt(plaintext)))

是你想要的吗?

最后,通过加密解密,会打印出还原后原文数据,祝你成功!

以上就是“Python进阶 数据加解密”的全部内容,希望对你有所帮助。

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

二、Python必备开发工具

img

三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

五、Python练习题

检查学习结果。

img

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

img

最后祝大家天天进步!!

上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值