【Python3】RSA公钥解密

本文详细讲解了如何使用Python实现RSA算法,包括公钥加密私钥解密过程,并特别针对超长数据进行了128位分段处理。核心代码展示了如何生成模数因子、构造公钥并进行高效解密验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


使用python进行公钥加密私钥解密,网上方法很多,这里就不再介绍了。 因公司项目测试需要,要使用rsa公钥加密后的数据请求服务器,服务器使用私钥解密,并将响应使用私钥加密后返回,再使用公钥进行解密,对响应结果进行校验。**


以下为核心代码

根据这位大佬的方法增加了128位的分段,以便用于超长数据的解密
python 实现私钥加密公钥解密

import rsa
import base64

 
class DecryptByPublicKey:
    """
        先产生模数因子
        然后生成rsa公钥
        再使用rsa公钥去解密传入的加密str
    """
    def __init__(self, encrypt_text, pub_key):
        missing_padding = 4 - len(encrypt_text) % 4
        if missing_padding:
            encrypt_text += '=' * missing_padding
        self._encrypt_text = encrypt_text.replace(" ", "+")
        self._pub_string_key = pub_key
        # 使用公钥字符串求出模数和因子
        self._modulus = None   # 模数
        self._exponent = None  # 因子
        # 使用PublicKey(模数,因子)算出公钥
        self._pub_rsa_key = None
 
    def _gen_modulus_exponent(self, s):
        # 对字符串解码, 解码成功返回 模数和指数
        b_str = base64.b64decode(s)
        if len(b_str) < 162:
            return False
        hex_str = b_str.hex()
        # 找到模数和指数的开头结束位置
        m_start = 29 * 2
        e_start = 159 * 2
        m_len = 128 * 2
        e_len = 3 * 2
        self._modulus = int(hex_str[m_start:m_start + m_len], 16)
        self._exponent = int(hex_str[e_start:e_start + e_len], 16)
 
    def _gen_rsa_pubkey(self):
        # 将pub key string 转换为 pub rsa key
        try:
            rsa_pubkey = rsa.PublicKey(self._modulus, self._exponent)
            # 赋值到_pub_rsa_key
            self._pub_rsa_key = rsa_pubkey.save_pkcs1()
        except Exception as e:
            raise e
 
    def decode(self):
        """
        decrypt msg by public key
        """

        public_key = rsa.PublicKey.load_pkcs1(self._pub_rsa_key)
        b64decoded_encrypt_text = base64.b64decode(self._encrypt_text)
        length = len(b64decoded_encrypt_text)
        length_max = 128
        decryptDataText = []
        data=b''
        if length >= 128 :
            for i in range(0, length, length_max):
                encrypted = rsa.transform.bytes2int(b64decoded_encrypt_text[i:i + length_max])
                decrypted = rsa.core.decrypt_int(encrypted, public_key.e, public_key.n)
                decrypted_bytes = rsa.transform.int2bytes(decrypted)
                data+=decrypted_bytes[decrypted_bytes.find(b'\x00')+1:]

            try:
                decryptDataText.append(data.decode())
            except Exception as e:
                raise e

        else :
                encrypted = rsa.transform.bytes2int(b64decoded_encrypt_text)
                decrypted = rsa.core.decrypt_int(encrypted, public_key.e, public_key.n)
                decrypted_bytes = rsa.transform.int2bytes(decrypted)

                try:
                    decryptDataText.append(decrypted_bytes[decrypted_bytes.find(b'\x00')+1:].decode())
                except Exception as e:
                    raise e

        if decryptDataText :      
            return "".join(decryptDataText)
        else :
            return 'null'
        

    def decrypt(self):
        """
        先产生模数因子
        然后生成rsa公钥
        再使用rsa公钥去解密
        """
        self._gen_modulus_exponent(self._pub_string_key)
        self._gen_rsa_pubkey()
        ret = self.decode()
        return ret
 
 
if __name__ == "__main__":
    pub_key = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQChGYdKQ7b9Gjp6HZI3u7LjAKeAdoMVOh7ZroHaICi1l2dhMGiOwlZv8SFr6IUPJJIGnkA2cfbv3jECwJmfu1sBNxuoKp32sLmmbDiea7mgBbWJSB1NeDVg5j1479MKJGXNsYDFrgfdIaN3tFOvCTKXM1xkwvEiL8GtMF7UxO+xOQIDAQAB'
    encrypt_text = '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'  # encrypt_text 是被私钥加密后的密文
    result = DecryptByPublicKey(encrypt_text,pub_key).decrypt()
    print(result)
<think>好的,用户遇到了Git合并时本地更改会被覆盖的问题,需要解决方案。根据之前的引用资料,解决方法主要有commit、stash和revert三种。首先,我得确认用户的具体情况,比如他们的本地更改是否已经完成,是否需要保留,或者是否可以丢弃。用户可能不太清楚这三种方法的适用场景,需要详细解释每个选项的步骤和优缺点。比如,commit适用于需要保留更改的情况,stash适合临时保存以便后续恢复,而revert则是直接撤销更改,适用于不需要保留的情况。需要结构清晰,分点说明,每个方法都给出操作步骤和适用场景,帮助用户理解哪种情况最适合他们。还要注意使用中文,避免技术术语过于复杂,让用户容易理解。同时,生成相关问题,可能涉及如何恢复stash的内容,或者如何避免频繁冲突等,扩展用户的知识点。另外,要确保LaTeX格式正确,但在这个问题中可能用不上数学公式,所以主要关注代码块和引用标识。检查引用是否正确,比如引用[^1]和[^2]的来源是否相关,用户提供的引用内容是否准确对应解决方案。 最后,确保回答真实可靠,操作步骤准确无误,避免误导用户。可能还需要提醒用户根据具体情况选择方法,比如如果有未完成的实验性代码,stash可能是更好的选择,而如果是确定要保留的修改,则应该commit。</think>要解决Git合并时本地更改被覆盖的问题,可根据不同场景选择以下三种方法: ### 一、提交本地更改(commit) **适用场景**:当本地更改已测试通过且需要保留到版本历史中。 **操作步骤**: 1. 将改动添加到暂存区: ```bash git add . # 添加所有文件 # 或指定文件 git add file1.txt file2.py ``` 2. 提交更改并添加描述: ```bash git commit -m "完成用户登录模块优化" ``` 3. 执行合并操作: ```bash git merge origin/main ``` **优点**:保留完整的开发记录,便于后续追溯[^1]。 ### 二、暂存更改(stash) **适用场景**:需要临时保存未完成的修改(如调试代码),优先处理合并操作。 **操作步骤**: 1. 保存当前工作状态: ```bash git stash # 可选添加备注 git stash save "用户登录模块调试代码" ``` 2. 查看暂存记录列表: ```bash git stash list ``` 3. 合并远程分支: ```bash git merge origin/main ``` 4. 恢复暂存内容: ```bash git stash pop # 恢复并删除最近一次暂存 # 或指定特定暂存 git stash apply stash@{1} ``` **优点**:保持工作目录整洁,特别适合处理紧急合并任务[^2]。 ### 三、撤销本地更改(revert) **适用场景**:本地修改可丢弃(如实验性代码或错误修改)。 **操作步骤**: 1. 撤销所有未提交的修改: ```bash git checkout -- . # 全部文件 # 或指定文件 git checkout -- file1.txt ``` 2. 执行合并操作: ```bash git merge origin/main ``` **风险提示**:此操作不可逆,需确认文件无需保留。 --- ### 对比决策表 | 方法 | 保留记录 | 可恢复性 | 适用阶段 | |---------|----------|----------|------------------| | commit | ✅ | ✅ | 功能开发完成时 | | stash | ❌ | ✅ | 开发中途临时切换 | | revert | ❌ | ❌ | 放弃无效修改 | ### 扩展应用场景 - 当存在多个暂存时,可用`git stash list`查看记录,通过`git stash apply stash@{n}`精准恢复 - 合并后出现冲突时,可使用`git mergetool`可视化工具解决冲突 - 长期分支开发推荐使用`git rebase`保持提交历史线性
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值