python RSA 公钥解密方法

背景

常见的RSA加解密使用方式是:公钥加密,私钥解密。私钥签名,公钥验签。

但我在项目上却遇到了一个用python解决公钥解密的问题。查了好多资料最后完成了这需求,记录一下。

 

解决

 

1、代码示例

import base64
from rsa import core, PublicKey, transform



def public_key_decrypt(rsa_public_key_der_b64, qr_code_cipher_b64):
    qr_code_cipher = base64.b64decode(qr_code_cipher_b64)
    public_key = base64.b64decode(rsa_public_key_der_b64)

    try:
        rsa_public_key = PublicKey.load_pkcs1_openssl_der(public_key)
        cipher_text_bytes = transform.bytes2int(qr_code_cipher)
        decrypted_text = core.decrypt_int(cipher_text_bytes, rsa_public_key.e, rsa_public_key.n)
        final_text = transform.int2bytes(decrypted_text)
        final_qr_code = final_text[final_text.index(0) + 1:]
        return final_qr_code.decode()
    except Exception as ex:
        _logger.exception(ex)
        return None

2、代码解释

2.1、rsa包相关问题

(1)安装rsa包

        pip install rsa

(2)为什么不用crpyto包?

       我查了好多资料,也看了crypto代码,实在是不知道怎么用cytpto包进行公钥解密,只能进行公钥加密操作。所以最后改为使用rsa包。

       rsa包实现了RSA算法的核心,如果对RSA算法有一些了解的,使用起来和用openssl感觉差不多。

2.2、加载已知公钥

      rsa的PublicKey类中提供了两个无需实例化的方法来加载公钥,load_pkcs1_openssl_pem()和load_pkcs1_openssl_der()

      具体使用哪个方法主要是看你“手中的RSA公钥”是哪种格式的:

      load_pkcs1_openssl_pem是用来加载:符合PKCS#1.5 PEM-encoded 格式的公钥文件,具体可以搜一下PEM格式。

      load_pkcs1_openssl_der是用来加载:公钥原始二进制字节流

2.3、格式转换

由于RSA是基于“大整数运算”的,因此,需要将待处理的密文字节数组转为大整数,将处理好的大整数再转为字节数组。

rsa包中transform文件中提供了这两个方法:

     transform.bytes2int()
     transform.int2bytes()

2.4、删除填充

由于RSA算法是基于“大整数运算”,因此需要将待加密的明文数据转为符合要求的大整数,其实就是在待加密数据前以某种标准的格式填充,使得填充后的新数据和RSA的密钥模长相等。

我使用了这种方式去掉前部的填充内容:final_text[final_text.index(0) + 1:]

 

附件:

   对RSA算法原理感兴趣的可以参看以下这位大佬的博客日志:http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html

   关于RSA的填充问题,可以参考这位大佬的博客日志:https://blog.csdn.net/yangpl_tale/article/details/50856781

 

RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,用于在计算机通信中提供数据保密。Python中,你可以使用`cryptography`库来实现RSA公钥解密。以下是一个简单的步骤概述: 1. 安装`cryptography`库(如果未安装): ```bash pip install cryptography ``` 2. 导入必要的模块和功能: ```python from cryptography.hazmat.primitives.asymmetric import rsa, padding from cryptography.hazmat.backends import default_backend ``` 3. 生成RSA密钥对(包括公钥和私钥): ```python private_key = rsa.generate_private_key( public_exponent=65537, key_size=2048, backend=default_backend() ) public_key = private_key.public_key() ``` 4. 获取公钥(用于解密): ```python public_numbers = public_key.public_numbers() n = public_numbers.n e = public_numbers.e ``` 5. 接收加密后的消息(通常是以Base64或hex编码的形式): ```python encrypted_message = b"your_base64_or_hex_encoded_ciphertext" ``` 6. 解密消息: ```python def encrypt_rsa(message, public_key, e): ciphertext = pow(int.from_bytes(message, byteorder="big"), e, n).to_bytes((n.bit_length() + 7) // 8, byteorder="big") return ciphertext decrypted_message = public_key.decrypt(encrypted_message, padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None)) ``` 7. 最后,解密后的消息将是一个字节串,可以转换为字符串: ```python decrypted_message_str = decrypted_message.decode("utf-8") ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值