python3 rsa加密长文本示例,可无限长,能直接对接java

39 篇文章 8 订阅
31 篇文章 2 订阅

1. rsaUtil.py 

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# File  : rsaUtil.py
# Author: DaShenHan&道长-----先苦后甜,任凭晚风拂柳颜------
# Date  : 2021-04-16
import json

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


class documentRsa():
    __public_key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCmuYcy3TlrCbh4n34VKFt0swBBXYy5sHMkKr91nYJjoG98kbPgR2n6iYWoU9mI/Zi0geVX2b3YV1Y9Aq/5l5DoJVyG52ZNmnKxtD8ZYJFnah3/Lr8YEGsvXxjv41mxgEQYuoa+OTcd1KOUmeP8R+ZheJj6KhFmhaU40ocjSVXDTQIDAQAB"
    __private_key = "MIICXQIBAAKBgQCmuYcy3TlrCbh4n34VKFt0swBBXYy5sHMkKr91nYJjoG98kbPgR2n6iYWoU9mI/Zi0geVX2b3YV1Y9Aq/5l5DoJVyG52ZNmnKxtD8ZYJFnah3/Lr8YEGsvXxjv41mxgEQYuoa+OTcd1KOUmeP8R+ZheJj6KhFmhaU40ocjSVXDTQIDAQABAoGAU8FiLOg7vwzsEhS1hzV19EM0PqIbXvFIdoPPGOveo+Pl/eNIRMQ7djP95BjzcEFNpGiY6TAmkfcWCKI/+xfsIBNoz2JU/JRQbtLGGLOHYgH2mDWLoKVDGAS8Cree1ogjYMP3SrnhqN61/OvFNBlCR72JieQJf6sgYaQUWtRtw1UCQQDWD3+5dBkaisQiCZC9I1jOM86qd0rRpZPa/OPjHRZuaFi1bsBDniPO2wEgLrHo4iZQDDvIx8X2JJR0KLjLBq/LAkEAx2PV+T9HWHukbF+C2y5gpeDrZbMo3A2rsN26j4f5f48XCwaxhc+SaINOGDUb2mwJdRl9FzKREwFNCTOOkwzGRwJAOzhweosfAtPPLSd+ToU/5VQ54bk9DsEDJbt/BG8grIzbtd4c/Nf8ShcWuaORfr9KIC0yQPrbzpwSIgy+CxUffwJBAKAt8xLmJAHQannpjO1Z56i69UDhWhzWGqzeo+Z0vRodsMxZ1zmBVMQDYDSQTcz95+cbz+NX6zYSYHnY4lv98jcCQQC7IhqbN+qLZwMPz26JN0F01HgbKYJ2LLmM6QXrUGRKUolEK5VF2QwC7t8dbPNSY7M8RpE4GQja6kUvY0qAbIGP"

    def __init__(self, rsa_publicKey, rsa_privateKey):
        """
        类初始化,传入config对象内配置的俩字段,内部储存的公钥私钥为不带开头的文本
        :param rsa_publicKey: config.rsa_publicKey
        :param rsa_privateKey: config.rsa_privateKey
        """
        self._public_key = rsa_publicKey
        self._private_key = rsa_privateKey

    def get_public_key(self):
        """
        公开获取拼接完整的公钥
        :return:
        """
        return "-----BEGIN PUBLIC KEY-----\n" + self._public_key + "\n-----END PUBLIC KEY-----"

    def get_private_key(self):
        """
        公开获取拼接完整的私钥
        :return:
        """
        return "-----BEGIN RSA PRIVATE KEY-----\n" + self._private_key + "\n-----END RSA PRIVATE KEY-----"

    @staticmethod
    def _rsa_decrypt(priv_key_str, msg):
        """
        静态方法,根据私钥解密字符串
        :param priv_key_str: 私钥完整
        :param msg: 公钥加密字符串
        :return:
        """
        msg = base64.b64decode(msg)
        length = len(msg)
        default_length = 128
        # 私钥解密
        priobj = Cipher_pkcs1_v1_5.new(RSA.importKey(priv_key_str))
        # 长度不用分段
        if length < default_length:
            return b''.join(priobj.decrypt(msg, b' '))
        # 需要分段
        offset = 0
        res = []
        while length - offset > 0:
            if length - offset > default_length:
                res.append(priobj.decrypt(msg[offset:offset + default_length], b' '))
            else:
                res.append(priobj.decrypt(msg[offset:], b' '))
            offset += default_length

        return b''.join(res)

    @staticmethod
    def _rsa_encrypt(pub_key_str, msg):
        """
        静态方法,根据公钥加密字符串
        :param pub_key_str: 公钥完整
        :param msg: 待加密json文本
        :return:
        """
        msg = msg.encode('utf-8')
        length = len(msg)
        default_length = 117
        # default_length = 100
        # 公钥加密
        pubobj = Cipher_pkcs1_v1_5.new(RSA.importKey(pub_key_str))
        # 长度不用分段
        if length < default_length:
            return base64.b64encode(pubobj.encrypt(msg))
        # 需要分段
        offset = 0
        res = []
        while length - offset > 0:
            if length - offset > default_length:
                res.append(pubobj.encrypt(msg[offset:offset + default_length]))
            else:
                res.append(pubobj.encrypt(msg[offset:]))
            offset += default_length
        byte_data = b''.join(res)

        return base64.b64encode(byte_data)

    def rsa_decrypt(self, msg):
        """
        解密文本到b’二进制值
        :param msg:
        :return:
        """
        return self._rsa_decrypt(self.get_private_key(), msg)

    def rsa_decrypt2str(self, msg):
        """
        获取解密文本
        :param msg: 加密后的文本
        :return:
        """
        return self.rsa_decrypt(msg).decode("utf-8")  # 解密成byte并转为utf-8字符串

    def rsa_decrypt2dict(self, msg):
        """
        获取解密json文本到dict
        :param msg: 加密后的文本
        :return:
        """
        return json.loads(self.rsa_decrypt2str(msg))  # 得到传输过来的数据的dict

    def rsa_encrypt(self, msg, pub_key=None):
        """
        加密一段字符串变成 b'二进制
        :param msg: 待加密文本
        :param pub_key: 公钥,不填默认获取初始化的
        :return:
        """
        pub_key = pub_key or self.get_public_key()
        return self._rsa_encrypt(pub_key, msg)

    def rsa_encrypt2str(self, msg):
        """
        加密文本到文本
        :param msg: 待加密文本
        :return:
        """
        return self.rsa_encrypt(msg).decode("utf-8")  # 加密成待传输的字符串

2.rsa_test.py,注意自己改import的 .utils.rsaUtil 为上面那个核心类文件放的位置

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# File  : rsa_test.py
# Author: DaShenHan&道长-----先苦后甜,任凭晚风拂柳颜------
# Date  : 2021-04-16

import sys, os
from urllib.parse import quote, unquote
# path = os.path.dirname(__file__) + os.sep + '../'
# sys.path.append(path)

from winbao.document_pro.utils.rsaUtil import documentRsa
import json
from time import time, strftime
from datetime import datetime, timedelta


# 测试rsa加解密
def test():
    __public_key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCmuYcy3TlrCbh4n34VKFt0swBBXYy5sHMkKr91nYJjoG98kbPgR2n6iYWoU9mI/Zi0geVX2b3YV1Y9Aq/5l5DoJVyG52ZNmnKxtD8ZYJFnah3/Lr8YEGsvXxjv41mxgEQYuoa+OTcd1KOUmeP8R+ZheJj6KhFmhaU40ocjSVXDTQIDAQAB"
    __private_key = "MIICXQIBAAKBgQCmuYcy3TlrCbh4n34VKFt0swBBXYy5sHMkKr91nYJjoG98kbPgR2n6iYWoU9mI/Zi0geVX2b3YV1Y9Aq/5l5DoJVyG52ZNmnKxtD8ZYJFnah3/Lr8YEGsvXxjv41mxgEQYuoa+OTcd1KOUmeP8R+ZheJj6KhFmhaU40ocjSVXDTQIDAQABAoGAU8FiLOg7vwzsEhS1hzV19EM0PqIbXvFIdoPPGOveo+Pl/eNIRMQ7djP95BjzcEFNpGiY6TAmkfcWCKI/+xfsIBNoz2JU/JRQbtLGGLOHYgH2mDWLoKVDGAS8Cree1ogjYMP3SrnhqN61/OvFNBlCR72JieQJf6sgYaQUWtRtw1UCQQDWD3+5dBkaisQiCZC9I1jOM86qd0rRpZPa/OPjHRZuaFi1bsBDniPO2wEgLrHo4iZQDDvIx8X2JJR0KLjLBq/LAkEAx2PV+T9HWHukbF+C2y5gpeDrZbMo3A2rsN26j4f5f48XCwaxhc+SaINOGDUb2mwJdRl9FzKREwFNCTOOkwzGRwJAOzhweosfAtPPLSd+ToU/5VQ54bk9DsEDJbt/BG8grIzbtd4c/Nf8ShcWuaORfr9KIC0yQPrbzpwSIgy+CxUffwJBAKAt8xLmJAHQannpjO1Z56i69UDhWhzWGqzeo+Z0vRodsMxZ1zmBVMQDYDSQTcz95+cbz+NX6zYSYHnY4lv98jcCQQC7IhqbN+qLZwMPz26JN0F01HgbKYJ2LLmM6QXrUGRKUolEK5VF2QwC7t8dbPNSY7M8RpE4GQja6kUvY0qAbIGP"

    rsa_obj = documentRsa(__public_key, __private_key)
    expiry = 2
    expiry_time_str = strftime("%Y%m%d %H:%M:%S", (datetime.now() + timedelta(hours=expiry + 8)).timetuple())
    print(expiry_time_str)
    print(quote(expiry_time_str))
    msg_dict = {
        'bucket': 'winbao',
        'object_name': '台账功能优化需求2020.12.18.docx',
        'expiry': expiry_time_str  # 20210416 13:39:22
    }
    mtime = datetime.strptime(expiry_time_str, '%Y%m%d %H:%M:%S')
    print('传过来的超时时间:', mtime)
    print('已超时:', datetime.now() + timedelta(hours=8) > mtime)
    print('计算的超时时间:', datetime.now() + timedelta(hours=expiry + 8))
    t1 = time()
    msg = json.dumps(msg_dict, ensure_ascii=False)
    data_encode_str = rsa_obj.rsa_encrypt2str(msg)
    t2 = time()
    print('加密后字符串:', data_encode_str)
    print('加密后字符串参数url编码:', quote(data_encode_str))
    print('加密耗时(s):', t2 - t1)
    print(len(data_encode_str))
    data_decode_str = rsa_obj.rsa_decrypt2str(data_encode_str)
    print(data_decode_str)


if __name__ == '__main__':
    test()

3. 运行结果:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值