首页 > 编程语言 >python数据加密与解密方法

python数据加密与解密方法

时间:2023-07-23 13:33:40浏览次数:40  
标签:加密 python text base64 解密 print encode import

# -*- encoding: utf-8 -*-
"""
@File    : 加密与解密.py
@Time    : 2023-07-23 10:02
@Author  : simon
@Email   : [email protected]
@Software: PyCharm
"""

from hashlib import md5
import base64


# MD5加密
obj = md5()
str = "你是个小可爱"
obj.update(str.encode("utf-8"))
# obj.update("wusir".encode('utf-8'))  # 可以添加多个被加密的内容

bs = obj.hexdigest()
print("md5加密结果:{}".format(bs))

# base64加密
base_str = "我马上要进行base64加密了"
bs64 = base64.b64encode(str.encode("utf-8"))
print("bs64加密结果:{}".format(bs64))

# base64解密
s = "5L2g5piv5Liq5bCP5Y+v54ix"
bs64_jie = base64.b64decode(s.encode())
print("bs64解密结果:{}".format(bs64_jie.decode("utf-8")))

# MD5加密后再进行base64加密
obj = md5()
obj.update(str.encode("utf-8"))
bs = obj.hexdigest()
bs64 = base64.b64encode(bs.encode("utf-8"))
print("MD5加密后再进行base64加密结果:{}".format(bs64))

# url编码
import urllib.parse

# s = 'a'
s = ' 123'
ret = urllib.parse.quote(s)
print(ret)
s = urllib.parse.unquote(ret)
print(s)

params = {'name': '张三', 'age': 20, 'address': '北京市海淀区'}
query_string = urllib.parse.urlencode(params)
print(query_string)

query_string = 'name=%E5%BC%A0%E4%B8%89&age=20&address=%E5%8C%97%E4%BA%AC%E5%B8%82%E6%B5%B7%E6%B7%80%E5%8C%BA'
params = urllib.parse.parse_qs(query_string)
print(params, type(params))

# 对称加密(AES与DES) pip install pycryptodome / pip install Crypto
# #### AES之ECB模式
# ECB加密案例:
from Crypto.Cipher import AES
import base64

key = '1234567890123456'.encode()  # 秘钥
# 秘钥:必须是16位字节或者24位字节或者32位字节

text = 'alex is dsb!!!!!'
# text = 'alex is dsb'  # 需要加密的内容
# while len(text.encode('utf-8')) % 16 != 0:  # 如果text不足16位的倍数就用空格补足为16位
#     text += '\0'
text = text.encode()
print("完整text:", text)

aes = AES.new(key, AES.MODE_ECB)  # 创建一个aes对象

en_text = aes.encrypt(text)  # 加密明文
print("加密数据:::", en_text)

en_text = base64.b64encode(en_text).decode()  # 将返回的字节型数据转进行base64编码
print(en_text)  # rRPMWCaOBYahYnKUJzq65A==

# ECB解密:
from Crypto.Cipher import AES
import base64

key = '1234567890123456'.encode()  # 秘钥
# 秘钥:必须是16位字节或者24位字节或者32位字节(因为python3的字符串是unicode编码,需要 encode才可以转换成字节型数据)
model = AES.MODE_ECB  # 定义模式
aes = AES.new(key, model)  # 创建一个aes对象

text = '3NeIhJsnhzy3Ojoquz+9eg=='.encode()  # 需要解密的文本
ecrypted_base64 = base64.b64decode(text)  # base64解码成字节流
str = aes.decrypt(ecrypted_base64).decode()  # 解密

print(str)

#### AES之CBC模式

#CBC加密案例:
from Crypto.Cipher import AES
import base64

key = '1234567890123456'.encode()  # 秘钥
# 秘钥:必须是16位字节或者24位字节或者32位字节
text = 'alex is dsb!!!!!'
# text = 'alex is dsb'  # 需要加密的内容
# while len(text.encode('utf-8')) % 16 != 0:  # 如果text不足16位的倍数就用空格补足为16位
#     text += '\0'
text = text.encode()
print("完整text:", text)

iv = b'abcdabcdabcdabcd'   #偏移量--必须16字节

aes = AES.new(key, AES.MODE_CBC,iv)  # 创建一个aes对象

en_text = aes.encrypt(text)  # 加密明文
print("aes加密数据:::", en_text)

en_text = base64.b64encode(en_text).decode()  # 将返回的字节型数据转进行base64编码
print(en_text)  # rRPMWCaOBYahYnKUJzq65A==

#CBC解密:
from Crypto.Cipher import AES
import base64

key = '1234567890123456'.encode()  # 秘钥
# 秘钥:必须是16位字节或者24位字节或者32位字节(因为python3的字符串是unicode编码,需要 encode才可以转换成字节型数据)
model = AES.MODE_CBC  # 定义模式
iv = b'abcdabcdabcdabcd'
aes = AES.new(key, model, iv)  # 创建一个aes对象

text = 'J8bwyhYt1chAPAGu8N6kKA=='.encode()  # 需要解密的文本
ecrypted_base64 = base64.b64decode(text)  # base64解码成字节流
str = aes.decrypt(ecrypted_base64).decode()  # 解密

print("aes解密数据:::{}".format(str))

# 非对称加密(RSA)

# 1.创建公钥和私钥
from Crypto.PublicKey import RSA

# 生成秘钥
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())

# 加密
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64


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("RAS加密:" ,b64_result)

# 解密
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64

data = "BkiKG8jzVGzbWOl4m8NXJEYglgtxhOB05MGmap8JSP97GzoewPBmDTs7c5iACUof3k/uJf0H88GygajVgBvkcbckJp7oO+Qj6VSUQYTOHhKN/VG2a8v+WzL34EO/S7BYoj2oOxIDAr8wDLxYxjBeXq/Be6Q1yBbnZcKaMkifhP8="

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), None)
    print("rsa解密数据:::", result.decode("utf-8"))

标签:加密,python,text,base64,解密,print,encode,import
From: https://www.cnblogs.com/simon1993/p/17574914.html

相关文章

  • Python代码玩遍童年的小游戏
    ​贪吃蛇,吃豆人,迷宫,井字游戏......这些小单击游戏我相信大家小的时候肯定玩过,或许在某个时段还沉迷过.随着年龄的增长,这些小游戏离我们越来越远,但是我相信大家的童心还是一直在的今天就分享一个真正可以玩耍的GitHub项目---free-python-games安装与使用python大家都......
  • Python使用Flask开发Web服务 - 裴 - flask的路由route的知识点演示
     默认是支持GET:  修改后,只支持post: 也可以getpost都支持 ......
  • python: socket
     """网络发送信息"""importsocketimportthreadingdefhandlesend(tcpclient):"""发送:return:"""whileTrue:message=input()tcpclient.send(message.encode()......
  • python+playwright 学习-67 抓取 table 表格数据
    前言最近有小伙伴提到如何抓取table表格上的数据,table表格的数据很简单,就是行和列。可以按行抓取,也可以按列抓取。获取table某一列的数据抓取第3列(项目名称)所有数据定位方式$x('//table/tbody/tr/td[3]')于是可以看到当前页面的第3列数据被全部定位到接下来就可以......
  • python 输入n行字符串
    如何实现Python输入n行字符串流程概述下面是实现Python输入n行字符串的一般流程:步骤描述1获取用户输入的行数n2创建一个空列表lines来存储字符串3使用循环n次,每次获取用户输入的字符串,并将其添加到lines列表中4最终得到的lines列表包含了用户输入的n行字......
  • python 循环往两个占位符
    Python循环往两个占位符循环是编程中常用的一种控制结构,它允许我们重复执行一段代码,达到简化代码和提高效率的目的。Python是一种高级编程语言,提供了多种循环结构,其中包括通过占位符循环的方法。在本文中,我们将介绍如何使用Python中的循环来填充两个占位符。什么是占位符?在......
  • python 输出为npy文件
    如何将Python输出为npy文件作为一名经验丰富的开发者,我很高兴能够教会你如何将Python的输出保存为npy文件。在本文中,我将为你详细介绍整个流程,并提供每一步所需的代码以及注释其意义。1.导入所需的库在开始之前,我们需要导入numpy库,因为它提供了将数据保存为npy文件的功能。imp......
  • python 使用Queue需要引入哪个包
    Python中使用Queue需要引入哪个包在Python中,如果我们想要使用队列(Queue)数据结构,我们需要引入queue模块。queue模块提供了实现各种队列类型的类,包括FIFO(先进先出)队列、LIFO(后进先出)队列和优先级队列等。通过引入queue模块,我们可以很方便地在我们的代码中使用队列。引入队列模块首......
  • python 循环list
    Python循环列表解析在Python编程中,循环是一种重要的控制结构。循环使我们能够重复执行一段代码,以便在处理大量数据或需要重复操作时提高效率。Python提供了多种循环结构,其中最常用的是for和while循环。本文将重点介绍如何使用循环来处理列表数据。列表简介在了解如何循环列表之......
  • python 判断变量是否是bytes
    Python判断变量是否是bytes概述在Python中,判断变量是否是bytes类型可以通过一系列步骤来实现。本文将介绍这个过程,并提供相应的示例代码。步骤下面是判断变量是否是bytes类型的流程图:步骤描述步骤1检查变量是否是bytes类型步骤2如果是bytes类型,则变量是bytes......