Python --使用rsa非对称加密, base64加密字符串

1, python2实现

1-1, 先rsa加密,再base64编码字符串

import rsa
import base64


def encrypt_str(origin_str_list=None, encrypt_lenth=1024):
    """
    加密函数
    :param origin_str_list: 需要加密的字符串列表
    :param encrypt_lenth:
    :return:
    """
    # 生成公私钥对
    pubkey, privkey = rsa.newkeys(encrypt_lenth)
    encrypt_str_list = []

    for origin_str in origin_str_list:
        # 先将字符串转换为字节形式,通过公钥进行加密
        encrypt_in_rsa_str = rsa.encrypt(origin_str.encode('utf-8'), pubkey)
        # 在将加密后的字符串通过base64编码
        encrypt_in_base64_str = base64.encodebytes(encrypt_in_rsa_str)
        encrypt_str_list.append(encrypt_in_base64_str)

    return encrypt_str_list, privkey


def decrypt_str(encrypt_str_list=None, privkey=None):
    """
    解密函数
    :param encrypt_str_list:加密的字符串列表
    :param privkey: 私钥
    :return:
    """
    decrypt_str_list = []
    for encrypt_str in encrypt_str_list:
        # 通过base64解码
        decrypt_in_base64_str = base64.decodebytes(encrypt_str)
        # 再通过rsa解密成字节形式,再通过utf8转换为字符串
        decrypt_in_rsa_str = rsa.decrypt(decrypt_in_base64_str, privkey).decode('utf-8')
        decrypt_str_list.append(decrypt_in_rsa_str)

    return decrypt_str_list


if __name__ == '__main__':
    encrypt_str_list, privkey = encrypt_str(origin_str_list=['hello', 'world'])
    for encrypt_str in encrypt_str_list:
        print('encrypt_str is:', encrypt_str)
    print(decrypt_str(encrypt_str_list=encrypt_str_list, privkey=privkey))

输出结果:

1-2, 秘钥对象转换为字符串对象

import rsa
import base64

pubkey, privkey = rsa.newkeys(1024)
#将公钥转换为字符串形式
pubkey_str = pubkey.save_pkcs1()
#将私钥转换为字符串形式
privkey_str = privkey.save_pkcs1()
# 将字符串形式的公钥转换成公钥原始对象
pubkey_1 = rsa.PublicKey.load_pkcs1(pubkey_str)
# 将字符串形式的私钥转换成私钥原始对象
privkey_1 = rsa.PrivateKey.load_pkcs1(privkey_str)

if __name__ == '__main__':
    print(pubkey_str)
    print(privkey_str)
    print('pubkey:', pubkey)
    print('pubkey_1:', pubkey_1)
    print('privkey:', privkey)
    print('privkey_1:', privkey_1)

输出结果如下:

2, python3实现

python3中没有rsa模块,需要通过命令pip install pycryptodome安装第三方模块

#! /usr/bin/env/python
# -*- coding:utf-8 -*-

import base64

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


def encrypt_str(origin_str_list, encrypt_lenth=1024):
    """
    加密函数
    :param origin_str_list: 需要加密的字符串列表
    :param encrypt_lenth:
    :return:
    """
    # 生成RsaKey对象
    random_generator = Random.new().read
    rsa = RSA.generate(encrypt_lenth, random_generator)
    # 通过RsaKey对象生成私钥,字节形式
    pubkey, privkey = rsa.publickey().exportKey(), rsa.exportKey()
    # 生成RSAKey类型的公钥和私钥
    pubkey, privkey = RSA.importKey(pubkey), RSA.importKey(privkey)
    # 生成cipher对象, 用于加解密操作
    cipher = PKCS1_v1_5.new(pubkey)

    # 存放加密字符串的列表
    encrypt_str_list = []

    for origin_str in origin_str_list:
        # 通过cipher.encrypt加密的数据,加密对象的数据类型需要为bytes类型
        encrypt_str_in_rsa = cipher.encrypt(bytes(origin_str.encode('utf-8')))
        # 在将加密后的字符串通过base64编码
        encrypt_str_in_base64 = base64.encodebytes(encrypt_str_in_rsa)

        # 加密后的字符串添加到encrypt_str_list中
        encrypt_str_list.append(encrypt_str_in_base64)

    return encrypt_str_list, privkey


def decrypt_str(encrypt_str_list, privkey):
    """
    解密函数
    :param encrypt_str_list:加密的字符串列表
    :param privkey: 私钥
    :return:
    """
    decrypt_str_list = []
    # 生成chiper对象, 用于加解密操作
    cipher = PKCS1_v1_5.new(privkey)

    for encrypt_str in encrypt_str_list:
        # 通过base64解码
        decrypt_str_in_base64 = base64.decodebytes(encrypt_str)
        # 通过rsa解密decrypt_str_in_base64
        decrypt_str_in_rsa = cipher.decrypt(decrypt_str_in_base64, 0).decode('utf-8')

        # 将解密后的数据添加到decrypt_str_list中
        decrypt_str_list.append(decrypt_str_in_rsa)

    return decrypt_str_list


if __name__ == '__main__':
    origin_str_list = ['hello', 'python']
    print('原始字符串:', origin_str_list)
    encrypt_str_list, privkey = encrypt_str(origin_str_list)
    print('加密后结果')
    for encrypt_str in encrypt_str_list:
        print('encrypt_str is:', encrypt_str)
    print('解密后结果:', decrypt_str(encrypt_str_list=encrypt_str_list, privkey=privkey))

——————————————————————————————————————————————————————————————————————
输出结果:
C:\Users\Administrator\AppData\Local\Programs\Python\Python311\python.exe D:/python_core_programming_learn/chapter_7_dict_set/notes.py
原始字符串: ['hello', 'python']
加密后结果
encrypt_str is: b'cwOr0KRFPf91C0ywgMfkYsfMKW/QSqJYnUjW1LWsrZEB4lhHVYpzxyQXZ/AqlZ/9jplndDG0BynD\nJUkZi1aDWU+RzCyBu7ueGYqQGfaSor2jdZClzP0KikS+1AcqWvm6Pz9bXYb6OHbTMhc/7IKJIHP6\nz5RrlTiffl/19S38J2A=\n'
encrypt_str is: b'iv3Pjo7F0BHBktJHfTz0Takmj+Aq3annboGf2K3DlXJoCqjDTQjzbbS9ZvaKINrCzqdmarPxZnM1\n+UMGvacBENbC87FDBlcWuK9RFgNvQfR/fUuC/kwW+ibrO4YmXx/2NamkrkOS2fHHW53GZ90hLLW8\n54bZvRAbVs06ze8XKX4=\n'
解密后结果: ['hello', 'python']

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值