首页 > 其他分享 >RSA分片加密和解密

RSA分片加密和解密

时间:2024-04-06 19:23:28浏览次数:23  
标签:encrypt string self 解密 len RSA 分片 msg 加密

# 第一步:生成秘钥
import rsa
import base64


# 使用rsa非对称加密过程解析
class MyRsa:
    """
    1、接收者(A)生成512位公私钥对
    # a. lemon_pub为PublicKey对象, lemon_priv为PrivateKey对象
    # b. 512为秘钥的位数, 可以自定义指定, 例如: 128、256、512、1024、2048等
    # 2、发送者(B)使用接收者(A)的公钥去加密消息
    # rsa只能处理字节类型, 故字符串类型需要转化为字节类型
    """

    def __init__(self):
        self.pubkey, self.privkey = rsa.newkeys(512)

    # 加密
    def encode_string(self, string):
        string = string.encode("utf8")
        encrypt_string = rsa.encrypt(message=string, pub_key=self.pubkey)
        encrypt_string = base64.b64encode(encrypt_string)
        encrypt_string = encrypt_string.decode()
        print("加密后的串:", type(encrypt_string), encrypt_string)
        return encrypt_string

    # 解密
    def decode_string(self, encrypt_string):
        encrypt_string = encrypt_string.encode()
        encrypt_string = base64.b64decode(encrypt_string)
        encrypt_string = rsa.decrypt(crypto=encrypt_string, priv_key=self.privkey)
        encrypt_string = encrypt_string.decode(encoding="utf8")
        print("解密后:", encrypt_string)


if __name__ == '__main__':
    cl = MyRsa()
    encrypt_string = cl.encode_string(string="123456")
    cl.decode_string(encrypt_string)

# 第二步:分段式加密和解密
import rsa
import base64
# 使用rsa非对称加密过程解析
class MyRsa:
    """
    # 加密分片长度
    max_encode_len = 证书key位数/8 - 11
    # 解密分片长度
    max_decode_len = base64.b64decode(msg="无需分段加密后密文")
    # 加密的plaintext = max_len 最大长度是 证书key位数/8-11
    例如1024 bit的证书,被加密的串最长 1024/8 - 11 = 117,加密得到
    的密文长度,却恰恰是秘钥的长度
    """
    def __init__(self):
        privkey = """
        -----BEGIN RSA PRIVATE KEY-----
        MIIBPQIBAAJBAJT9epiz8kfHC/qXKlg1kcNpMPYX5E+hBM/ZMMgJ0+eaVPWuJS/9
        WPpXxqIyqSip6HIgHXadY0N/u+RC+TguHuECAwEAAQJAWzZbqcTwnNTVFpMZD2us
        U0/A88hos/9F7OFwpeat7dyuv0YxfYNUP0LBC8YMNczHw5xDwBosFCu/TgswcZoF
        4QIjALfY1OzF+MaRitfNJBxOXOwhFT7ZMnHfSxjqZFLcfLegQ80CHwDPdpF8VRRe
        z7TliSVkbuVOgJAyNNAR9RRM4m6/22UCIwChOy0I9VoGsu9D8KmhlWvSvfTG6G5g
        BUbz8+PF844A8DFlAh4zoxdjEuoXDyu/VftwnAmHGIjLdkmzroR2/oUCS+ECIwCc
        BwHTjVKowO7QcIvQ0xzmB+RziqYrumaVwy0NQGn/N92g
        -----END RSA PRIVATE KEY-----
        """
        pubkey = """
        -----BEGIN RSA PUBLIC KEY-----
   MEgCQQCU/XqYs/JHxwv6lypYNZHDaTD2F+RPoQTP2TDICdPnmlT1riUv/Vj6V8ai
        MqkoqehyIB12nWNDf7vkQvk4Lh7hAgMBAAE=
        -----END RSA PUBLIC KEY-----
        """
        # 加载秘钥对象
        self.pubkey = rsa.PublicKey.load_pkcs1(pubkey)
        self.privkey = rsa.PrivateKey.load_pkcs1(privkey)
        # 预加密计算模长
        self.max_encode_len, self.max_decode_len = self.choice_channel()
    # 预加密,获取模长
    def choice_channel(self):
        msg = "test".encode()
        models_dict = {'64': 512, '128': 1024, '512': 2048}
        # 加密,获取bytes类型的秘钥长度
        encrypt_msg = rsa.encrypt(message=msg, pub_key=self.pubkey)
        max_decode_len = len(encrypt_msg)
        print("解密模长:", max_decode_len)
        key_size = models_dict['{}'.format(max_decode_len)]
        max_encode_len = int(key_size / 8 - 11)
        print("加密模长:", max_encode_len)
        return max_encode_len, max_decode_len
    # 加密
    def encode_string(self, string):
        msg = string.encode()
        encrypt_msg = rsa.encrypt(message=msg, pub_key=self.pubkey)
        encrypt_msg = base64.b64encode(encrypt_msg)
        encrypt_msg = encrypt_msg.decode()
        print("加密后的串:", type(encrypt_msg), encrypt_msg)
        return encrypt_msg
    # 解密
    def decode_string(self, encrypt_msg):
        # 加密的逆向过程,先对字符串进行encode(),在进行base64.b64decode(encrypt_msg),在通过rsa模块
        encrypt_msg = base64.b64decode(encrypt_msg)
        decrypt_str = rsa.decrypt(crypto=encrypt_msg, priv_key=self.privkey)
        new_encrypt_str = decrypt_str.decode()
        print("解密结果:", new_encrypt_str)
        return new_encrypt_str
    # 分段加密
    def section_encode(self, msg):
        if len(msg) <= self.max_encode_len:
            print("不需要进行分段加密")
            encode_string = self.encode_string(string=msg)
            print("加密结果:", encode_string)
            return encode_string
        else:
            print("需要分段加密:")
            encode_text = []
            for i in range(0, len(msg), self.max_encode_len):
                # 需要加密的字符串进行切片
                section_text = msg[i:(i + self.max_encode_len)]
                section_text = section_text.encode()
                # 分段加密
                encode_str = rsa.encrypt(message=section_text, pub_key=self.pubkey)
                encode_text.append(encode_str)
            # 拼接加密后的bytes数据,二进制拼接起来,进行编码
            encode_bytes = b''.join(encode_text)
            encode_string = base64.b64encode(s=encode_bytes)
            encode_string = encode_string.decode()
            print("分段加密结果:", encode_string)
            return encode_string
    # 分段解密
    def section_decode(self, msg):
        decode_str = msg.encode()
        decode_str = base64.b64decode(decode_str)
        if len(decode_str) <= self.max_decode_len:
            print("不需要进行分段解密")
            decode_string = self.decode_string(encrypt_msg=msg)
            print("解密结果:", decode_string)
            return decode_string
        else:
            print("需要分段加密")
            decode_text = []
            for i in range(0, len(decode_str), self.max_decode_len):
                section_text = decode_str[i:(i + self.max_decode_len)]
                decrypt_str = rsa.decrypt(crypto=section_text, priv_key=self.privkey)
                decode_text.append(decrypt_str)
            decode_byte = b''.join(decode_text)
            decode_string = decode_byte.decode()
            print("解密结果:", decode_string)
            return decode_string
if __name__ == '__main__':
    cl = MyRsa()
    test_str = "dsdcacaadcadcadcacadcacadcacdadcacdadcacdcdcadcacadcadcacdcadcadcacadcdcdcjwfnfniwnifhybwiyvbiwviuwnviwnviwnivnwabicacbaacacacaacaacacacacaca"
    res = cl.section_encode(msg=test_str)
    cl.section_decode(msg=res)

 

标签:encrypt,string,self,解密,len,RSA,分片,msg,加密
From: https://www.cnblogs.com/python-test001/p/18117785

相关文章

  • RSA实际应用场景
    importrsa#生成密钥pubkey,privkey=rsa.newkeys(512)#保存密钥print("==============保存密钥===============")withopen('public.pem','w+')asf:f.write(pubkey.save_pkcs1().decode())withopen('private.pem','w+&......
  • RSA非对称加密和开放鉴权
    #导入base64模块来进行base64编码importbase64importrsaimporttimeclassHandleSign:#定义服务器公钥,往往可以存放在公钥文件中,通过抓包获取server_pub="""-----BEGINPUBLICKEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQENQujkLfZfc5Tu9Z......
  • 解密PGSQL数据库引擎:探索数据世界的秘密(二)
    本系列文章简介:        在当今数字化时代,数据已经成为了最宝贵的资源之一。企业、政府和个人都在积极探索和利用数据来推动创新、改善决策和提升效率。而作为数据存储和管理的核心技术之一,数据库引擎扮演着至关重要的角色。        在众多数据库引擎中,PGSQL(......
  • 2022CSP-J组真题 2.解密
    线上OJ:https://www.luogu.com.cn/problem/P8814核心思想:对本题先进行数学公式推导已知ed=(......
  • 华为ENSP SSH使用RSA密钥交换进行远程登录实验
    实验拓扑:实验流程:1、AR1模拟客户端,AR2模拟远程登录服务器1、AR2开启SSH服务,配置AAA本地用户2、交换AR1和AR2的host主机密钥3、实现AR1远程登录AR2实验配置:先配置AR1和AR2的IP地址[AR1]intGigabitEthernet0/0/0[AR1-GigabitEthernet0/0/0]ipadd192.168.1.124[A......
  • 解密iPhone GPU:了解其内部工作原理
    摘要了解你的显卡对于在电脑上玩现代图形要求高的游戏非常重要。本文介绍了如何轻松查看你的显卡型号以及为什么显卡在玩电脑游戏时如此关键。引言随着电脑游戏的发展,现代游戏对硬件性能的要求越来越高。十年前发布的显卡已经无法满足当前游戏的需求。因此,了解你的显卡......
  • 你在项目中做过哪些安全防范措施?,解密前端开发常见误区
    XSS攻击按照之前说的思路,先讲概念,说用途什么是XSS攻击XSS即CrossSiteScripting(跨站脚本攻击),指的是攻击者想尽一切办法将一些可执行的代码注入到网页中,利用这些恶意脚本,攻击者可获取用户的敏感信息如Cookie、SessionID等,进而危害数据安全。为了不和层叠样式表CSS......
  • 深度解密京东中台底层支撑框架
    导读:近几年,除AIGC外,软件领域相关比较大的变化,就是各相关业务领域开始如火如荼地建设中台和去中台化了。本文不探讨中台对公司组织架构涉及的变化和影响,只是从中台化演进的思路,及使用的底层支撑技术框架进行分析探讨,重点对中台及前台协作涉及到的扩展点及热部署包的底层技术细节......
  • 解密数仓的SQL ON ANYWHERE技术
    本文分享自华为云社区《GaussDBDWS的SQLONANYWHERE技术解密》,作者:tooooooooooomy。1.前言适用版本:【8.1.1(及以上)】查询分析是大数据要解决的核心问题之一,虽然大数据相关的处理引擎组件种类繁多,并提供了丰富的接口供用户使用,但相对传统数据库用户来说,SQL语言依然是使用最......
  • 解密通义灵码:软件研发工具的“大脑”
    QCon全球软件开发大会是由极客邦科技旗下InfoQ中国主办的综合性技术盛会,每年在伦敦、北京、纽约、圣保罗、上海、旧金山召开。当前,大模型技术正引领软件开发范式的革新,重塑生产关系。在此激变之中,QCon以“全面进化”作为2024年度主题,旨在携手创新技术引领者,面向5年以上工......