做一个常见加密库的python调用

本文介绍了如何使用Python实现常见的加密算法,包括AES-CBC、DES、RSA,以及整合了JavaScript库来增强加密能力。提供了MD5、SHA1和HMAC散列算法,以及对称与非对称加密的实例代码。
摘要由CSDN通过智能技术生成

对常见的加密方法用python进行了实现,方便调用
散列算法
MD5
SHA1
HMAC
对称加密
AES-CBC(包含js实现)
AES-ECB(包含js实现)
DES
非对称加密
RSA

欢迎大佬指正和优化

# coding: utf-8
"""
做一个加密库调用工具
python自己的加密库调用
协调js加密库
@author: xiao mu
@date: 2022-04-04

具体实现,对常用加密算法的调用进行封装成方便调用的形式
base64
对称加密
AES-CBC
AES-ECB
DES
3DES
非对称加密
RSA
ECC
散列算法
MD5
SHA1
HMAC

比如AES,封装起来,在要使用的时候直接传参调用就行
有时候python的不足以完全能够还原,需要加入JS加密算法
每一种加密各自写一个python实现和js实现
"""
import base64
import binascii
import hashlib
import execjs
# from Crypto import PublicKey
from Crypto import Random
from Crypto.Cipher import AES, DES, PKCS1_v1_5
from Crypto.PublicKey import RSA
from Crypto.Util.Padding import pad, unpad
from rsa import PublicKey, transform, core


class Encrypt(object):

    def __init__(self):
        pass

    def str_to_base64(self, content, encoding):
        """
        字符串转base64
        :param content:
        :param encoding:
        :return:
        """
        return str(base64.b64encode(content.encode(encoding)), encoding=encoding)

    def base64_to_str(self, content, encoding):
        """
        base64转字符串
        :param content:
        :param encoding:
        :return:
        """
        return str(base64.b64decode(bytes(content, encoding=encoding)), encoding=encoding)

    def base64_to_hex(self, content):
        """
        base64转hex
        :param content:
        :return:
        """
        return base64.b64decode(content).hex()

    def hex_to_base64(self, content):
        """
        hex转base64
        :param content:
        :return:
        """
        return base64.b64encode(content)

    def md5(self, content, encoding):
        """
        对传入的内容按照指定编码进行md5加密
        :param content:
        :param encoding:
        :return:
        """
        return hashlib.md5(content.encode(encoding=encoding)).hexdigest()

    def sha1(self, content, encoding):
        """
        对传入的内容按照指定编码进行sha1加密
        :param content:
        :param encoding:
        :return:
        """
        return hashlib.sha1(content.encode(encoding=encoding)).hexdigest()

    def _pkcs7padding(self, content, encoding):
        bs = 16
        length = len(content)
        bytes_length = len(content.encode(encoding))
        padding_size = length if (bytes_length == length) else bytes_length
        padding = bs - padding_size % bs
        padding_text = chr(padding) * padding
        self.coding = chr(padding)
        return content + padding_text

    def aes_cbc_encrypt_py(self, content, key, iv, encoding):
        """
        使用python库实现aes-cbc模式加密
        :param iv:
        :param content:
        :param key:
        :param encoding:
        :return:
        """
        key = key.encode(encoding)
        iv = iv.encode(encoding)
        aes = AES.new(key=key, mode=AES.MODE_CBC, iv=iv)
        content_padding = self._pkcs7padding(content=content, encoding=encoding)
        encrypt_bytes = aes.encrypt(content_padding.encode(encoding))
        result = str(self.hex_to_base64(encrypt_bytes), encoding=encoding)
        result = self.base64_to_hex(result).upper()
        return result

    def aes_cbc_decrypt_py(self, content, key, iv, encoding):
        """
        使用python库实现aes-cbc模式解密
        :param content:
        :param key:
        :param iv:
        :param encoding:
        :return:
        """
        key = key.encode(encoding)
        iv = iv.encode(encoding)
        aes = AES.new(key=key, mode=AES.MODE_CBC, iv=iv)
        content = binascii.a2b_hex(content)
        if len(content) % 16 != 0:
            content = pad(content, 16)
        decrypt_bytes = aes.decrypt(content)
        result = decrypt_bytes.decode(encoding, 'ignore')
        return result[:-ord(result[-1])]

    def aes_ecb_encrypt_py(self, content, key, encoding):
        """
        AES-ECB模式加密py版
        :param content:
        :param key:
        :param iv:
        :param encoding:
        :return:
        """
        key = key.encode(encoding)
        aes = AES.new(key=key, mode=AES.MODE_ECB)
        content_padding = self._pkcs7padding(content=content, encoding=encoding)
        encrypt_bytes = aes.encrypt(content_padding.encode(encoding))
        result = str(self.hex_to_base64(encrypt_bytes), encoding=encoding)
        result = self.base64_to_hex(result).upper()
        return result

    def aes_ecb_decrypt_py(self, content, key, encoding):
        """
        使用python库实现aes-ecb模式解密
        :param content:
        :param key:
        :param iv:
        :param encoding:
        :return:
        """
        key = key.encode(encoding)
        aes = AES.new(key=key, mode=AES.MODE_ECB)
        content = binascii.a2b_hex(content)
        if len(content) % 16 != 0:
            content = pad(content, 16)
        decrypt_bytes = aes.decrypt(content)
        result = decrypt_bytes.decode(encoding, 'ignore')
        return result[:-ord(result[-1])]

    def aes_cbc_encrypt_js(self, content, key, iv):
        """
        使用js实现aes-cbc模式加密
        :param content:
        :param key:
        :param iv:
        :return:
        """
        jscode = f"""
            var aes = require("crypto-js");
            var key = aes.enc.Utf8.parse("{key}");
            var iv = aes.enc.Utf8.parse("{iv}");
                function encrypt(content) [[
                    var content = aes.enc.Utf8.parse(content)
                        , result = aes.AES.encrypt(content, key, [[
                        iv: iv,
                        mode: aes.mode.CBC,
                        padding: aes.pad.Pkcs7
                    ]])
                    return result.ciphertext.toString().toUpperCase()
                ]]
            """
        jscode = jscode.replace('[[', '{').replace(']]', '}')
        ctx = execjs.compile(jscode, cwd=r'C:\Users\SI YI\AppData\Roaming\npm\node_modules')
        result = ctx.call("encrypt", content)
        return result

    def aes_cbc_decrypt_js(self, content, key, iv):
        """
        使用js实现aes-cbc模式加密
        :param content:
        :param key:
        :param iv:
        :return:
        """
        jscode = f"""
            var aes = require("crypto-js");
            var key = aes.enc.Utf8.parse("{key}");
            var iv = aes.enc.Utf8.parse("{iv}");
                function encrypt(content) [[
                    var content = aes.enc.Hex.parse(content),
                        content = aes.enc.Base64.stringify(content)
                        , result = aes.AES.decrypt(content, key, [[
                        iv: iv,
                        mode: aes.mode.CBC,
                        padding: aes.pad.Pkcs7
                    ]])
                    return result.toString(aes.enc.Utf8)
                ]]
            """
        jscode = jscode.replace('[[', '{').replace(']]', '}')
        ctx = execjs.compile(jscode, cwd=r'C:\Users\SI YI\AppData\Roaming\npm\node_modules')
        result = ctx.call("encrypt", content)
        return result

    def aes_ecb_encrypt_js(self, content, key):
        """
        使用js实现aes-ecb模式加密
        :param content:
        :param key:
        :return:
        """
        jscode = f"""
            var aes = require("crypto-js");
            var key = aes.enc.Utf8.parse("{key}");
                function encrypt(content) [[
                    var content = aes.enc.Utf8.parse(content)
                        , result = aes.AES.encrypt(content, key, [[
                        mode: aes.mode.ECB,
                        padding: aes.pad.Pkcs7
                    ]])
                    return result.ciphertext.toString().toUpperCase()
                ]]
            """
        jscode = jscode.replace('[[', '{').replace(']]', '}')
        ctx = execjs.compile(jscode, cwd=r'C:\Users\SI YI\AppData\Roaming\npm\node_modules')
        result = ctx.call("encrypt", content)
        return result

    def aes_ecb_decrypt_js(self, content, key):
        """
        使用js实现aes-ecb模式解密
        :param content:
        :param key:
        :return:
        """
        jscode = f"""
            var aes = require("crypto-js");
            var key = aes.enc.Utf8.parse("{key}");
                function encrypt(content) [[
                    var content = aes.enc.Hex.parse(content),
                        content = aes.enc.Base64.stringify(content)
                        , result = aes.AES.decrypt(content, key, [[
                        mode: aes.mode.ECB,
                        padding: aes.pad.Pkcs7
                    ]])
                    return result.toString(aes.enc.Utf8)
                ]]
            """
        jscode = jscode.replace('[[', '{').replace(']]', '}')
        ctx = execjs.compile(jscode, cwd=r'C:\Users\SI YI\AppData\Roaming\npm\node_modules')
        result = ctx.call("encrypt", content)
        return result

    def des_ecb_encrypt_py(self, content, key, encoding):
        """
        DES-ECB模式加密py版
        :param content:
        :param key:
        :param iv:
        :param encoding:
        :return:
        """
        key = key.encode(encoding)
        des = DES.new(key=key, mode=DES.MODE_ECB)
        content_padding = self._pkcs7padding(content=content, encoding=encoding)
        encrypt_bytes = des.encrypt(content_padding.encode(encoding))
        result = str(self.hex_to_base64(encrypt_bytes), encoding=encoding)
        result = self.base64_to_hex(result).upper()
        return result

    def des_ecb_decrypt_py(self, content, key, encoding):
        """
        使用python库实现des-ecb模式解密
        :param content:
        :param key:
        :param iv:
        :param encoding:
        :return:
        """
        key = key.encode(encoding)
        des = DES.new(key=key, mode=DES.MODE_ECB)
        content = binascii.a2b_hex(content)
        if len(content) % 16 != 0:
            content = pad(content, 16)
        decrypt_bytes = des.decrypt(content)
        result = decrypt_bytes.decode(encoding, 'ignore')
        return result[:-ord(result[-1])]

    def des_cbc_encrypt_py(self, content, key, iv, encoding):
        """
        使用python库实现des-cbc模式加密
        :param iv:
        :param content:
        :param key:
        :param encoding:
        :return:
        """
        key = key.encode(encoding)
        iv = iv.encode(encoding)
        des = DES.new(key=key, mode=DES.MODE_CBC, iv=iv)
        content_padding = self._pkcs7padding(content=content, encoding=encoding)
        encrypt_bytes = des.encrypt(content_padding.encode(encoding))
        result = str(self.hex_to_base64(encrypt_bytes), encoding=encoding)
        result = self.base64_to_hex(result).upper()
        return result

    def des_cbc_decrypt_py(self, content, key, iv, encoding):
        """
        使用python库实现des-cbc模式解密
        :param content:
        :param key:
        :param iv:
        :param encoding:
        :return:
        """
        key = key.encode(encoding)
        iv = iv.encode(encoding)
        des = DES.new(key=key, mode=DES.MODE_CBC, iv=iv)
        content = binascii.a2b_hex(content)
        if len(content) % 16 != 0:
            content = pad(content, 16)
        decrypt_bytes = des.decrypt(content)
        result = decrypt_bytes.decode(encoding, 'ignore')
        return result[:-ord(result[-1])]

    def rsa_encrypt_py(self, content, publickey, encoding):
        """
        rsa加密
        :param content:
        :param publickey:
        :param encoding:
        :return:
        """
        rsa = PKCS1_v1_5.new(RSA.importKey(publickey))
        encrypt_bytes = rsa.encrypt(content.encode(encoding=encoding))
        result = str(self.hex_to_base64(encrypt_bytes), encoding=encoding)
        # result = self.base64_to_hex(result).upper()
        return result

    def rsa_decrypt_py(self, content, publickey, encoding):
        """
        rsa解密
        :param content:
        :param publickey:
        :param encoding:
        :return:
        """
        # rsa_public_key = PublicKey.load_pkcs1_openssl_der(base64.b64decode(publickey))
        rsa = PKCS1_v1_5.new(RSA.importKey(publickey))
        decrypt_bytes = rsa.decrypt(base64.b64decode(content), Random.new().read)
        result = str(decrypt_bytes, encoding=encoding)
        # result = self.base64_to_hex(result).upper()
        return result
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梅干菜扣肉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值