加密

加密

1. 数字签名

import hashlib
import time

md5_obj = hashlib.md5()

sign_str = 'abc123'


# 获取时间戳 . 前面部分
now_time = time.time()
c_time = str(now_time).split('.')[0]

# 对字符串进行编码
sign_str_bytes = (c_time + sign_str).encode()

# 然后加密
md5_obj.update(sign_str_bytes)
s = md5_obj.hexdigest()
print(s)

2. 非对称加密

RSA算法简介

  • 公钥(任何人都能获取):加密
  • 私钥:解密
    RSA加密算法是一种非对称加密算法,加密的秘钥是由公钥和私钥两部分组成秘钥对,公钥用来加密消息,私钥用来对消息进行解密,公钥是公开的,私钥则是用户自己保留的,由于公钥是公开的,那么任何人只要获取到公钥,都可以使用公钥来加密发送伪造内容,出于安全性考虑,在发送消息之前我们可以使用RSA来签名,签名使用私钥来进行签名,使用公钥来进行验签,通过签名我们可以确保用户身份的唯一性,从而提高安全性。

加密 和 签名

生成密钥对

在这边为了方便演示,咱们先手动生成一个密钥对(项目中的秘钥对由开发来生成,会直接给到咱们),生成秘钥对的时候可以指定生成秘钥的长度,一般推荐使用1024bit,1024bit的rsa公钥,加密数据时,最多只能加密117byte的数据),数据量超过这个数

则需要对数据进行分段加密,但是目前1024长度的秘钥已经被证明了不够安全,尽量使用2048bit长度的秘钥。20486it长度的秘钥,最多245byte长度的数据

计算公式如下:

密钥长度 / 8 - 11 = 最大加密量(单位:byte)

代码实现

1. 生成 私钥、公钥

from Crypto import Random
from Crypto.PublicKey import RSA

# 生成伪随机数
r_gen = Random.new().read

# 生成私钥对象实例,可以指定长度
rsa = RSA.generate(1024, r_gen)

# 获取私钥
private_key = rsa.exportKey()   # pip install pycryptodome==3.4.3 ===> 后面版本改为:export_Key()
print(private_key)
with open('private.pem', 'wb') as f:    # 写入
    f.write(private_key)

# 获取公钥
public_pem = rsa.publickey().exportKey()
print(public_pem)
with open('public.pem', 'wb') as f:
    f.write(public_pem)

2. 加密

import base64
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5

# 需要加密的内容
msg = "吾乃爱新LQ"
# 1. 读取公钥文件
key = open('public.pem').read()
public_key = RSA.importKey(key)

# 2. 利用公钥进行加密【加密后,使用 base64 编码】
pk = PKCS1_v1_5.new(public_key)
e = pk.encrypt(msg.encode('utf-8'))
# 3. 加密后,进行 base64 编码
content = base64.b64encode(e)
print(content)

# 输出加密后的结果
with open('result.pem', 'wb') as f:
    f.write(content)

3. 利用私钥解密【先进行 base64 解码】

# 利用私钥解密
import base64
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5

# 得到编码后的内容
secret = open('result.pem').read()

# 怎么装的,就怎么解码
# 1. 先进行 base64 解码
m = base64.b64decode(secret)

# 2. 获取私钥
key = open('private.pem').read()
private_key = RSA.importKey(key)

# 3. 进行解密
pk = PKCS1_v1_5.new(private_key)
res = pk.decrypt(m, 'DecryptError')

# 获取hi来的是字节码信息,转换成字符串
print(res.decode('utf-8'))

posted @ 2024-01-25 16:03  爱新觉罗LQ  阅读(4)  评论(0编辑  收藏  举报