|
|
import os
|
|
|
|
|
|
from Crypto.Cipher import DES
|
|
|
import rsa
|
|
|
import hashlib
|
|
|
|
|
|
|
|
|
# 生成公私钥对
|
|
|
from rsa import common, transform, core
|
|
|
|
|
|
|
|
|
def generate_keypair(user_name):
|
|
|
(pubkey, prikey) = rsa.newkeys(1024)
|
|
|
# 存储公钥
|
|
|
with open(user_name + "_pub.pem", "wb") as fp:
|
|
|
fp.write(pubkey.save_pkcs1())
|
|
|
# 存储私钥
|
|
|
with open(user_name + "_pri.pem", "wb") as fp:
|
|
|
fp.write(prikey.save_pkcs1())
|
|
|
|
|
|
|
|
|
# 使用rsa加密
|
|
|
def rsa_encrypt(msg, user_name):
|
|
|
# 读取公钥
|
|
|
with open(user_name + "_pub.pem", "rb") as fp:
|
|
|
pubkey = rsa.PublicKey.load_pkcs1(fp.read())
|
|
|
# 使用该用户公钥加密
|
|
|
return rsa.encrypt(msg, pubkey)
|
|
|
|
|
|
|
|
|
# 使用rsa解密
|
|
|
def rsa_decrypt(crypto, user_name):
|
|
|
# 读取私钥
|
|
|
with open(user_name + "_pri.pem", "rb") as fp:
|
|
|
prikey = rsa.PrivateKey.load_pkcs1(fp.read())
|
|
|
# 解密
|
|
|
return rsa.decrypt(crypto, prikey)
|
|
|
|
|
|
|
|
|
# 使用rsa签名
|
|
|
def rsa_sign(msg: bytes, user_name: str):
|
|
|
# 读取私钥
|
|
|
with open(user_name + "_pri.pem", "rb") as fp:
|
|
|
prikey = rsa.PrivateKey.load_pkcs1(fp.read())
|
|
|
# 签名
|
|
|
return rsa.sign_hash(msg, prikey, "MD5")
|
|
|
|
|
|
|
|
|
# 通过签名计算哈希
|
|
|
def rsa_verify(sign: bytes, user_name: str):
|
|
|
# 读取公钥
|
|
|
with open(user_name + "_pub.pem", "rb") as fp:
|
|
|
pubkey = rsa.PublicKey.load_pkcs1(fp.read())
|
|
|
key_length = common.byte_size(pubkey.n)
|
|
|
encrypted = transform.bytes2int(sign)
|
|
|
decrypted = core.decrypt_int(encrypted, pubkey.e, pubkey.n)
|
|
|
return transform.int2bytes(decrypted, key_length)[-32:]
|
|
|
|
|
|
|
|
|
# 计算散列值
|
|
|
def cal_md5(data: bytes) -> str:
|
|
|
h = hashlib.md5()
|
|
|
h.update(data)
|
|
|
return h.hexdigest()
|
|
|
|
|
|
|
|
|
# 生成DES密钥
|
|
|
def generate_des_key() -> bytes:
|
|
|
return os.urandom(8)
|
|
|
|
|
|
|
|
|
# 使用DES加密
|
|
|
def des_encrypt(des_key: bytes, data: bytes):
|
|
|
# 生成DES对象,使用ECB加密模式
|
|
|
des = DES.new(des_key, DES.MODE_ECB)
|
|
|
padded_text = pad(data)
|
|
|
return des.encrypt(padded_text)
|
|
|
|
|
|
|
|
|
# 使用DES解密
|
|
|
def des_decrypt(des_key: bytes, data: bytes):
|
|
|
# 生成DES对象,使用ECB加密模式
|
|
|
des = DES.new(des_key, DES.MODE_ECB)
|
|
|
return des.decrypt(data)
|
|
|
|
|
|
|
|
|
# 如果需要加密的内容不是16的倍数,则需要补足
|
|
|
def pad(text: bytes):
|
|
|
while len(text) % 8 != 0:
|
|
|
text += b" "
|
|
|
return text
|