首页 > 编程语言 >python基础之编码和加密

python基础之编码和加密

时间:2023-06-21 18:00:13浏览次数:43  
标签:编码 加密 python base64 rsa encode print encrypt data

一、base64

import base64

# 编码
s1 = 'hello'
result = base64.b64encode(s1.encode())  # 只能对bytes类型编码,结果为bytes类型
print(result.decode())  # 解码为字符串

# 解码
res = "6IuR5rWpIGlzIGdvb2Q="
s2 = base64.b64decode(res.encode())  # 只能对bytes类型解码,结果为bytes类型
print(s2.decode())  # 解码为字符串


# 补全长度

s = "eW91eQ"  # base64编码结果长度必须是4的倍数,如果不够则需用等号补全长度
s += ("=" * (4 - len(s) % 4))  # 补全长度
print("填充后", s)
ret = base64.b64decode(s.encode()).decode()
print(ret)

二、MD5、SHA1

# 摘要算法:通过一个hash函数计算一个不定长的字串串得到一个定长的结果
from hashlib import md5, sha256, sha512

# 案例1
md5_obj = md5()
data = "123"
md5_obj.update(data.encode())  # 一定是字节数据
ret = md5_obj.hexdigest()
print(ret, type(ret))  # 32位 "202cb962ac59075b964b07152d234b70" <class 'str'>
print(md5_obj.digest()) # 16位字节类型,b' ,\xb9b\xacY\x07[\x96K\x07\x15-#Kp'


# 案例2: 多次更新数据,用于数据校验

md5_obj = md5()
md5_obj.update(b"hello")
md5_obj.update(b"world")
print(md5_obj.hexdigest())

# hello world: 5eb63bbbe01eeed093cb22bb8f5acdc3

三、AES加密

示例代码1:ECB加密

from Crypto.Cipher import AES
import base64

# (1)加密并base64编码
# key的长度是16
key = "alex is dsb12345".encode()
aes = AES.new(key, AES.MODE_ECB)
# data的长度是16的倍数
data = "hello yuan,you are very good".encode()
while len(data) % 16 != 0:
    data += b"\0"
print(data)
# 加密数据
encrypt_data = aes.encrypt(data)
print("encrypt_data:", encrypt_data)
# base64编码
final_data = base64.b64encode(encrypt_data).decode()
print(final_data)

# (2) base64解码并解密
# 解码
data = "MFADjBGq5sw6x0imp82GgT5+ITHj5ctMLv1h94+wIao="
encrypt_data = base64.b64decode(data.encode())
print(encrypt_data)
# 解密
key = "alex is dsb12341".encode()
aes = AES.new(key, AES.MODE_ECB)
plain_data = aes.decrypt(encrypt_data)
print(plain_data)

示例代码2:CBC加密

from Crypto.Cipher import AES
import base64

# (1)加密并base64编码
# key的长度是16
key = "alex is dsb12345".encode()
iv = b"0123456789123456"
aes = AES.new(key, AES.MODE_CBC, iv)
# data的长度是16的倍数
data = "hello rain,you are very good".encode()
while len(data) % 16 != 0:
    data += b"\0"
print(data)
# 加密数据
encrypt_data = aes.encrypt(data)
print("encrypt_data:", encrypt_data)
# base64编码
final_data = base64.b64encode(encrypt_data).decode()
print(final_data)

# (2) base64解码并解密
data = "7h5hPq7SVwuKItAw4vwuwcyUt2goWRonreuuBZl/BjI="
encrypt_data = base64.b64decode(data.encode())
print(encrypt_data)
# 解密
key = "alex is dsb12345".encode()
iv = b"0123456789123456"
aes = AES.new(key, AES.MODE_CBC, iv)
plain_data = aes.decrypt(encrypt_data)
print(plain_data)

四、RSA加密

from Crypto.PublicKey import RSA

# 生成秘钥
rsakey = RSA.generate(1024)
with open("rsa.public", mode="wb") as f:
    f.write(rsakey.publickey().exportKey())

with open("rsa.private", 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", 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)


s = "D0LpKl+i4IA/M5fFBO+b/J7JL7sklzcE41MX5kqJZpJh5VnGyzcGk0Eux/2KPKrAgbFtJmeuaHPNMPd6cHZkVjrP8MLtS604wt6GtOMUIcu3qK97/zSw0a3Yel5X1yW/KNIGowTKQVYUYgEPpLto1GMnn02KTgZH61pP1vvRCjw="

with open("rsa.private", mode="r") as f:
    pk = f.read()
    rsa_pk = RSA.importKey(pk)
    rsa = PKCS1_v1_5.new(rsa_pk)

    data = rsa.decrypt(base64.b64decode(s), None)
    print(data.decode())

标签:编码,加密,python,base64,rsa,encode,print,encrypt,data
From: https://www.cnblogs.com/yuan-qi/p/17496850.html

相关文章

  • 自动化平台总结(httprunner+djangorestframework+python3+Mysql+Vue)【基础构思】
    一、前言最近从零搭建了一个自动化测试平台,虽然不是第一次从零搭建,但是也从来没有进行过这类搭建的总结,还是记录一下,搭建过程中的一些问题和方法。方便以后总结和翻阅二、简介搭建的平台使用的是Python3.6,未来有空可能考虑加个java版本。前端用的Vue,主体是httprunner2.......
  • 【python基础】类-继承
    编写类时,并非总是要从空白开始。如果要编写的类时另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法原有的类称为父类,而新类被称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。继承语法格式:class子类......
  • CentOS7 源码编译安装 Python 3.8.10,开启 SSL 功能
    背景CentOS7自带的Python3,或者通过yum安装的Python3,可能会有无法使用ssl的问题:$python3Python3.8.10(default,Jun132023,14:51:15)[GCC11.2.120220127(RedHat11.2.1-9)]onlinuxType"help","copyright","credits"or"license&qu......
  • Python 安装依赖包,出现 ssl.SSLCertVerificationError 的问题,解决方法
    问题描述CentOS7环境,已安装Python3.8.10。最近项目开发,需要切换solidity版本,参考开发文档,需要执行如下命令pipinstallsolc-select==0.2.0#安装指定版本solcsolc-selectinstall<solc版本号>#切换solc版本solc-selectuse<solc版本号>先使用pipinstallsolc-......
  • python基础之并发
    一、多线程示例代码1:简单多线程importtimeimportthreadingdeffoo(t):print("foo开始")time.sleep(t)print("foo结束")start=time.time()t_list=[]foriinrange(100):t=threading.Thread(target=foo,args=(2,))#注意,如果只有一个参......
  • python在if判断语句中对于0和None的处理
    情景:我在访问一个字典的key,但是我不知道这个key有没有,或者有,我也不知道value取值多少,即dict1.get(key)有可能输出None,也有可能输出0如果我对这个key进行判断,例如:ifdict1.get(key)这种判断,可能对于None和0的条件都是一样的,因此,如果我只是想判断是否存在这个key,我需要ifdict1......
  • Linux下卸载python,并安装pyenv管理python版本
    一、卸载已安装的python版本查找已安装的Python3版本:运行以下命令以获取已安装的Python3版本列表:dpkg-l|greppython3找到列出所有以python3开头的已安装软件包。可能会有多个Python3相关的软件包,因此仔细检查输出的内容。2.卸载Python3软件包:从步骤1......
  • python字典访问不存在的key
    当你使用一个不存在的键(key)去访问一个Python字典(dict)时,会触发一个KeyError异常。这是Python提供的一种机制,用于指示你正在尝试访问一个字典中不存在的键。以下是一个简单的示例,演示了当使用一个不存在的键去访问字典时会发生的情况:my_dict={"apple":3,"banana":6,"orange......
  • Python中的pickle模块:对象序列化与反序列化
    在Python中,对象的序列化和反序列化是一项常见的任务。pickle模块提供了一种简单且强大的方法来实现对象的序列化和反序列化,使得开发者能够方便地将复杂的Python对象转化为字节流并在需要时重新还原。本文将详细介绍pickle模块的使用方法和原理,并探讨其在数据持久化和跨进程通信中......
  • 软件测试|超好用超简单的Python GUI库——tkinter(四)
    前言之前我们介绍了label控件,本篇文章我们将介绍button控件。Button控件是Tkinter中常用的窗口部件之一,同时也是实现程序与用户交互的主要控件。通过用户点击按钮的行为来执行回调函数,是Button控件的主要功用。首先自定义一个函数或者方法,然后将函数与按钮关联起来,最后,当用......