From 539e2d39e6a6ec18ea54571dcafb99a5c460303a Mon Sep 17 00:00:00 2001 From: Qowq4bf7s <1981920847@qq.com> Date: Wed, 24 Nov 2021 22:42:31 +0800 Subject: [PATCH] ADD file via upload --- EncryptUtil.py | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 EncryptUtil.py diff --git a/EncryptUtil.py b/EncryptUtil.py new file mode 100644 index 0000000..7a7dce1 --- /dev/null +++ b/EncryptUtil.py @@ -0,0 +1,91 @@ +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