python使用rsa非对称加密

1、安装rsa

支持python 2.7 或者 python 3.5 以上版本

使用豆瓣pypi源来安装rsa

pip install -i https://pypi.douban.com/simple rsa

2、加密解密

2.1、生成公私钥对

import rsa

# 1、接收者(A)生成512位公私钥对
# a. lemon_pub为PublicKey对象, lemon_priv为PrivateKey对象
# b. 512为秘钥的位数, 可以自定义指定, 例如: 128、256、512、1024、2048等
lemon_pub, lemon_priv = rsa.newkeys(512)

此时的状态

2.2、发送者加密

# 2、发送者(B)使用接收者(A)的公钥去加密消息
# rsa只能处理字节类型, 故字符串类型需要转化为字节类型
love_talk = "Lemon little girl, I love you very much!".encode("utf-8")
cryto_info = rsa.encrypt(love_talk, lemon_pub)    # 使用接收者(A)的公钥加密

此时状态

2.3、接收者解密

# 3. 接收者(A)使用自己的私钥去解密消息
talk_real = rsa.decrypt(cryto_info, lemon_priv)
talk_real2 = talk_real.decode("utf-8")
print(talk_real2)

3、加密过程的封装

# 导入base64模块来进行base64编码
import base64
import rsa

class HandleSign:
    # 定义服务器公钥, 往往可以存放在公钥文件中
    server_pub = """
        -----BEGIN PUBLIC KEY-----
        MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQENQujkLfZfc5Tu9Z1LprzedE
        O3F7gs+7bzrgPsMl29LemonPYvIG8C604CprLittlenJpnhWu2lGirlWZyLq6sBr
        tuPorOc42+gInFfyhJAwdZB6Sqlove7bW+jNe5youDtU7very6Gx+muchGo8Dg+S
        kKlZFc8Br7SHtbL2tQIDAQAB
        -----END PUBLIC KEY-----
        """

    @classmethod
    def to_encrypt(cls, msg, pub_key=None):
        """
        非对称加密
        :param msg: 待加密字符串或者字节
        :param pub_key: 公钥
        :return: base64密文字符串
        """
        if isinstance(msg, str):            # 如果msg为字符串, 则转化为字节类型
            msg = msg.encode(‘utf-8‘)
        elif isinstance(msg, bytes):        # 如果msg为字节类型, 则无需处理
            pass
        else:                               # 否则抛出异常
            raise TypeError(‘msg必须为字符串或者字节类型!‘)

        if not pub_key:                     # 如果pub_key为空, 则使用全局公钥
            pub_key = cls.server_pub.encode("utf-8")
        elif isinstance(pub_key, str):      # 如果pub_key为字符串, 则转化为字节类型
            pub_key = pub_key.encode(‘utf-8‘)
        elif isinstance(pub_key, bytes):    # 如果msg为字节类型, 则无需处理
            pass
        else:                               # 否则抛出异常
            raise TypeError(‘pub_key必须为None、字符串或者字节类型!‘)

        public_key_obj = rsa.PublicKey.load_pkcs1_openssl_pem(pub_key)  # 创建 PublicKey 对象
        #2.创建 PublicKey 对象
        #public_key_obj = rsa.PublicKey.load_pkcs1(pub_key)

        cryto_msg = rsa.encrypt(msg, public_key_obj)  # 生成加密文本
        cipher_base64 = base64.b64encode(cryto_msg)   # 将加密文本转化为 base64 编码

        return cipher_base64.decode()   # 将字节类型的 base64 编码转化为字符串类型

if __name__ == ‘__main__‘:
    # 待加密字符串或者字节
    love_talk = "Lemon little girl, I love you very much!"

    #1.用自己生成的publickye测试下
    #lemon_pub,lemon_priv=rsa.newkeys(512)
    #lemon_pub2=lemon_pub.save_pkcs1()

    # 调用to_encrypt类方法来进行加密
    cryto_info = HandleSign.to_encrypt(love_talk)
    print(cryto_info)

原文地址:https://www.cnblogs.com/steven223-z/p/12101321.html

时间: 2024-10-11 02:22:48

python使用rsa非对称加密的相关文章

c#与JavaScript实现对用户名、密码进行RSA非对称加密

原文:c#与JavaScript实现对用户名.密码进行RSA非对称加密 博主最近手上这个项目呢(就是有上百个万恶的复杂excel需要解析的那个项目,参见博客:http://www.cnblogs.com/csqb-511612371/p/4885930.html),由于是一个内网项目,安全性要求很低,不需要做什么报文加密. 但是总觉得用户名密码都是明文传输,略微有点坑甲方... 想了想,那就做个RSA加密,把用户名.密码做密文传输吧...至于为什么是RSA,因为也想趁机学习一下,DES.MD5什

RSA非对称加密Java实现

原文 加密基础方法类 1 import java.security.MessageDigest; 2 import sun.misc.BASE64Decoder; 3 import sun.misc.BASE64Encoder; 4 public class SecurityBase { 5 public static final String KEY_SHA="SHA"; 6 public static final String KEY_MD5="MD5"; 7

RSA 非对称加密,私钥转码为pkcs8 错误总结

RSA 非对称加密,私钥转码为pkcs8 错误总结 最近在和某上市公司对接金融方面的业务时,关于RSA对接过程中遇到了一个坑,特来分享下解决方案. 该上市公司简称为A公司,我们简称为B公司.A-B两家公司通信采用HTTPS协议,加密方式选择RSA非对称加密+签名的方式,以保障数据通信安全,不被篡改. 虽然对于数据通信来说,安全是有了保障.但对于开发来说,却添了不少的麻烦.麻烦就在于加解密十分繁琐. A 公司提供了自己的公钥,以及我们公司(B)的私钥.我们需要将私钥转换成pkcs8 的格式.然后从

再谈加密-RSA非对称加密的理解和使用

html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption

(转)C#实现RSA非对称加密解密

转自:http://blog.csdn.net/u010678947/article/details/48652875 一.RSA简介 RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的.RSA取名来自开发他们三者的名字.RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准.RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式

RSA非对称加密,使用OpenSSL生成证书,iOS加密,java解密

最近换了一份工作,工作了大概一个多月了吧.差不多得有两个月没有更新博客了吧.在新公司自己写了一个iOS的比较通用的可以架构一个中型应用的不算是框架的一个结构,并已经投入使用.哈哈 说说文章标题的相关的内容吧 很多对安全要求比较高的应用都要使用加密,加密后与后端沟通数据,这样能防止被别人截获数据包,直接把借口的参数数据暴露.我上一家公司是做P2P互联网金融的,就使用了多种加密方式,有对称的也有非对称的.最近新公司的APP也有意向使用加密,思考了一下,最成熟的解决方案就是使用RSA非对称的加密了.就

RSA 非对称加密【转】

演示代码:https://pan.baidu.com/s/10rfSUUDEEHvCDEYH0oEVCw Base64工具类,可以让rsa编码的乱码变成一串字符序列 1 package com.utils; 2 3 import java.io.ByteArrayInputStream; 4 import java.io.ByteArrayOutputStream; 5 import java.io.File; 6 import java.io.FileInputStream; 7 import

关于rsa非对称加密、解密、签名、验签

测试数据: 1 var xmlprikey =""; 2 var xmlpubkey =""; 3 rsa = new RSACryption(); 4 //待处理字符串 5 var str="hello成功啊啊!¥%……&*([email protected]#$%^&*()@#$%^&*()_}::{>>?}{>?{?"; 6 var strlen= str.Length; 7 rsa.RSAKey(

加密webconfig中的连接字符串,利用RSA非对称加密,利用windows保存密钥容器

简单的解决方法: WebConfig 加解密,未能使用提供程序“RsaProtectedConfigurationProvider”进行解密.提供程序返回错误消息为: 打不开 RSA 密钥容器.问题:未添加用于访问 RSA 密钥容器命令:aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITY/NETWORK SERVICE"注意事项:XP下:aspnet_regiis -pa "NetF