首页 > 编程语言 >python各种加解密方法

python各种加解密方法

时间:2024-06-07 11:00:41浏览次数:16  
标签:加密 字节 python text base64 加解密 print encode 方法

# -*- encoding: utf-8 -*-

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
from Crypto.Util.Padding import pad,unpad
import base64

key = '1234567890123456'.encode() # 秘钥
# 秘钥:必须是16位字节或者24位字节或者32位字节
text = 'hello rain,you are very good'.encode()
# text = 'alex is dsb' # 需要加密的内容
# 第一种方法,补足16位
# while len(text.encode('utf-8')) % 16 != 0: # 如果text不足16位的倍数就用空格补足为16位
# text += '\0'

# 第二种方法,补足16位
text = pad(text, 16)
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 = 'C9mcRBT2K5Z60j55/oD+Qyn0k+4y2fjtG5un4YWFb/c='.encode() # 需要解密的文本
ecrypted_base64 = base64.b64decode(text) # base64解码成字节流

str = aes.decrypt(ecrypted_base64)
str = unpad(str, 16).decode() # 解密
# 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,方法
From: https://www.cnblogs.com/Lhptest/p/18236802

相关文章

  • xpath常用的定位规则方法解析
     XPath是一种在XML文档中查找信息的语言,它同样适用于HTML文档,因为HTML可以被看作是一种特殊的XML。在XPath中,你可以使用各种表达式来定位元素。以下是XPath中元素定位的一些常见规则和方法:1.基本路径/ 表示根元素。// 表示选择文档中的节点,而不考虑它们的位......
  • 8-4 【Python0036】中文级联菜单
    importtkinterastkfromtkinterimportttkfrompypinyinimportlazy_pinyin#省份、城市、地区数据data={"北京":{"北京市":["东城区","西城区","朝阳区"],},"上海":{"上海市......
  • 用 Python 撸一个 Web 服务器-第9章:项目总结
    项目总结本教程带大家一起实现了一个TodoList程序,包含基础的增删改查功能,和用户登录认证。这也是Web开发中最常见的需求。我画了一张思维导图,帮助你从宏观的角度来概览TodoList程序,加深你对Web开发的理解。TodoList项目整体思路参考MVC设计模式。有意设计utils......
  • 用 Python 撸一个 Web 服务器-第8章:用户管理
    用户登录原理用户登录与注册功能几乎已成为Web应用的标配。所以我们有必要给TodoList程序增加一个用户管理模块,以此来学习用户登录原理。HTTP协议是无状态的,这意味着每个完整的HTTP请求——响应过程都是相对独立的,Web服务器无法分辨前后两次连续请求是否为同一个用户......
  • 用 Python 撸一个 Web 服务器-第7章:重构——更好的组织代码
    通过前几章的学习,我们完成了TodoList程序的todo管理部分,实现了对todo的增、删、改、查基本操作,这也是几乎所有Web程序都具备的功能。我们当然可以按照目前的思路继续来实现用户管理部分,在models.py中编写用户相关的模型,在templates/目录下新建用户相关HTML,在contro......
  • 【已解决】Python报错Pytorch:ModuleNotFoundError: No module named ‘torch’
    本文摘要:本文已解决Pytorch:ModuleNotFoundError:Nomodulenamed‘torch’的相关报错问题,并总结提出了几种可用解决方案。同时结合人工智能GPT排除可能得隐患及错误。......
  • 【已解决】Python报错 ERROR: Could not find a version that satisfies the requirem
    本文摘要:本文已解决ERROR:Couldnotfindaversionthatsatisfiestherequirement的相关报错问题,并总结提出了几种可用解决方案。同时结合人工智能GPT排除可能得隐患及错误。......
  • Python进阶:解密collections库的高级功能
    Python内置库collections提供了一些强大的工具类,可以简化和优化我们的编程过程。本文将重点探索collections库中的几个类的使用。通过详细的代码示例和解释,展示如何利用Counter计数和统计元素,以及如何使用defaultdict创建有默认值的字典。一、常见类的介绍Pythoncollections......
  • 《手把手教你》系列练习篇之12-python+ selenium自动化测试(详细教程)
    1.简介前面文章我们了解了如何获取元素的text属性值,和判断元素是否显示在页面(is_displayed()方法),本文我们来学习下,判断一个控件是否被选中状态、获取页面元素的大小、组合键-全选文字、组合键-退格键删除文本和鼠标右键等练习的内容。2.验证控件是否被选中还是以百度......
  • 《手把手教你》系列练习篇之13-python+ selenium自动化测试 -压轴篇(详细教程)
    1.简介“压轴”原本是戏曲名词,指一场折子戏演出的倒数第二个剧目。在现代社会中有很多应用,比如“压轴戏”,但压轴也是人们知识的一个盲区。“压轴”本意是指倒数第二个节目,而不是人们常说的倒数第一个,倒数第一个节目称“压台”。想看“压台篇”,敬请关注宏哥等待压台篇发......