openssl之RSA非对称加解密实现(python版)

1. 简介

OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。

1.1 对称加密

OpenSSL一共提供了8种对称加密算法,其中7种是分组加密算法,仅有的一种流加密算法是RC4。
这7种分组加密算法分别是:
AES、
DES、
Blowfish、
CAST、
IDEA、
RC2、
RC5,
它们都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。
其中,AES使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使用的则是64位。
事实上,DES算法里面不仅仅是常用的DES算法,还支持三个密钥和两个密钥3DES算法。

1.2 非对称加密

OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。
DH算法一般用于密钥交换。
DSA算法则一般只用于数字签名。
RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。

密钥

秘钥一般分为1对:公钥和私钥,
数据加解密: 私钥加密则公钥解密,一般会把公钥提供给客户方。
传输加解签:私钥加签,公钥解签。

2. RSA加解签、加解密(python版)

python依赖包: pip3 install rsa

import os
import base64
import rsa

class CryptoSign():
    """
    1. 用公钥加密、再用私钥解密
    2. 用私钥签名认证、再用公钥验证签名
    """
    def __init__(self, fpathpri, fpathpub):
        # 私钥
        with open(fpathpri, 'rb') as f:
            prikeydata = f.read()
        self.privatekey = rsa.PrivateKey.load_pkcs1(prikeydata)
        # 公钥
        with open(fpathpub, 'rb') as f:
            pubkeydata = f.read()
        self.publickey = rsa.PublicKey.load_pkcs1(pubkeydata)
    
    def get_sign_message(self, dict_map):
	    """
		Querystring 格式拼接
		"""
        d = sorted(dict_map.items(), key=lambda x: x[0])
        list_l = []
        for i in range(len(d)):
            k, v = d[i]
            if k in ["sign", "error_code", "error_msg"]:
                continue
            if v in [None, '']:
                continue
            if i == 0:
                s = str(k) + "=" + str(v)
                list_l.append(s)
            else:
                s = "&" + str(k) + "=" + str(v)
                list_l.append(s)
        content = ''.join([str(i) for i in list_l])
        return content.encode('utf-8')

    def sign(self, dict_map, hash_method='SHA-256'):
        """ SHAxwithRsa算法 加签"""
        message = self.get_sign_message(dict_map)
        signature = rsa.sign(message, self.privatekey, hash_method)
        sign = base64.b64encode(signature).decode('utf-8')
        return sign
    
    def sign_verify(self, dict_map, sign):
        """ 验证签名 """
        signature = base64.b64decode(sign)
        message = self.get_sign_message(dict_map)
        return rsa.verify(message, signature, self.publickey)
    
    def pub_encrypt(self, data):
        """
        私钥对数据加密
        data must be byte string or string
        return base64 string
        """
        if isinstance(data, str):
            data = data.encode('utf-8')
        enc = rsa.encrypt(data, self.publickey)
        ret = base64.b64encode(enc).decode(encoding='utf-8')
        return ret

    def pri_decrypt(self, data):
        """
        公钥对数据解密
        data must be base64 string
        return string
        """
        data = base64.b64decode(data)
        return rsa.decrypt(data, self.privatekey)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI学长

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

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

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

打赏作者

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

抵扣说明:

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

余额充值