python基础之编码和加密

一、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())
posted @ 2023-06-21 17:56  #缘起  阅读(32)  评论(0编辑  收藏  举报