python-rsa-base64-加解密

因为前端的rsa是将base64封装到里面了, python的rsa加密不经过base64处理的话 是 字节串,字节串不利于传输所以需要转成base64.


加密流程 : RSA加密 > BASE64加密
解密流程 : BASE64解密 > RSA解密


有长度限制.


import base64

import rsa


def create_keys():  # 生成公钥和私钥
    Public_key, Private_key = rsa.newkeys(1024)
    pub = Public_key.save_pkcs1()
    with open('Public_key.pem', 'wb+')as f:  # 公
        f.write(pub)

    pri = Private_key.save_pkcs1()
    with open('Private_key.pem', 'wb+')as f:  # 私
        f.write(pri)


def encrypt(content):  # 用公钥加密
    with open('Public_key.pem', 'rb') as Public_key:
        p = Public_key.read()
    pubkey = rsa.PublicKey.load_pkcs1(p)
    original_text = str(content).encode('utf8')  # 加密前处理
    Encrypted_content = rsa.encrypt(original_text, pubkey)
    cipher_text = base64.b64encode(Encrypted_content).decode()  # base64 加密
    return cipher_text  # 加密后的密文


def decrypt(encryption_text):  # 用私钥解密
    with open('Private_key.pem', 'rb') as Private_key:
        p = Private_key.read()
    cipher_text = (base64.b64decode(encryption_text))  # base64 解密
    secret_key = rsa.PrivateKey.load_pkcs1(p)
    Decrypt_content = rsa.decrypt(cipher_text, secret_key).decode()  # 注意,这里如果结果是bytes类型,就需要进行decode()转化为str
    return Decrypt_content


if __name__ == '__main__':
    # create_keys()
    crypt_text = encrypt({"code": 1})
    print(crypt_text)
    print(decrypt(crypt_text))


无长度限制,分段式加解密.


1.0 这里是使用了 Crypto,Windows 上安装这个有时候会有问题.


import base64

from Crypto.Cipher import PKCS1_v1_5
from Crypto.PublicKey import RSA


def create_keys():  # 生成公钥和私钥
    Public_key, Private_key = rsa.newkeys(1024)
    pub = Public_key.save_pkcs1()
    with open('../static/pem/Public_key.pem', 'wb+')as f:  # 公
        f.write(pub)

    pri = Private_key.save_pkcs1()
    with open('../static/pem/Private_key.pem', 'wb+')as f:  # 私
        f.write(pri)


# 分段长加密
def c_jia_mi(msg: str):  # Crypto 加密
    # 获取公钥
    key = open('../static/pem/Public_key.pem').read()
    public_key = RSA.importKey(key)
    # 分段加密
    pk = PKCS1_v1_5.new(public_key)
    encrypt_text = []
    for i in range(0, len(msg), 100):
        cont = msg[i:i + 100]
        encrypt_text.append(pk.encrypt(cont.encode()))
    # 加密完进行拼接
    cipher_text = b''.join(encrypt_text)
    # base64进行编码
    result = base64.b64encode(cipher_text)
    return result.decode()


# 分段长解密
def c_jie_mi(msg: str):  # Crypto 解密
    # base64解码
    msg = base64.b64decode(msg)
    # 获取私钥
    private_key = open('../static/pem/Private_key.pem').read()
    rsa_key = RSA.importKey(private_key)
    cipher = PKCS1_v1_5.new(rsa_key)
    # 进行解密
    text = []
    for i in range(0, len(msg), 128):
        cont = msg[i:i + 128]
        text.append(cipher.decrypt(cont, 1))
    text = b''.join(text)
    return text.decode()

2.0 这里是使用了 rsa, Windows可以直接安装这个.( 我测试没啥问题,这是我根据Crypto改的.)


import base64

import rsa

# 分段长加密_RSA
def r_jia_mi_1(msg: str):  # RAS 加密
    # 获取公钥
    with open('../static/pem/Public_key.pem', 'rb') as Public_key:
        p = Public_key.read()
    pubkey = rsa.PublicKey.load_pkcs1(p)
    encrypt_text = []
    for i in range(0, len(msg), 100):
        cont = msg[i:i + 100]
        encrypt_text.append(rsa.encrypt(str(cont).encode('utf8'), pubkey))
    # 加密完进行拼接
    cipher_text = b''.join(encrypt_text)
    # base64进行编码
    result = base64.b64encode(cipher_text)
    return result.decode()


# 分段长解密
def r_jie_mi(msg: str):  # RSA 解密
    # base64解码
    msg = base64.b64decode(msg)
    # 获取私钥
    with open('../static/pem/Private_key.pem', 'rb') as Private_key:
        p = Private_key.read()
    secret_key = rsa.PrivateKey.load_pkcs1(p)
    # 进行解密
    text = []
    for i in range(0, len(msg), 128):
        cont = msg[i:i + 128]
        text.append(rsa.decrypt(cont, secret_key))
    text = b''.join(text)
    return text.decode()


版权声明:本文为Ly_Word原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。