Python3 与 Java 进行 Rsa非对称加密详解------原创

第一次玩跨平台加密,做个笔记以防以后忘记。如果可以帮助到更多人,那是我的意愿。祝所有程序猿安康。资深2年程序猿。

言归正传

查阅资料,Rsa有很多种版本。crytpo是个很已经停止更新的版本了(上次发布: 2014年2月22日)

python官方 PyPI链接https://pypi.org/project/rsa/3.1.4/

但令人开心的是有个新的 加密库与crytpo的使用方法大致相同。

本次主要详细记录使用3天的经验只谈,本猿几乎踩到了全部的坑。可以在笔记中找到解决方案。

我可能有点啰嗦了哈。但是本猿是想将所有的经验"全部分享"开所以请谅解。

来了 他真的来了:

M2Crypto库中有很多中方法可以在使用 pycharm时找到:读取公/私钥也有不同所以遇到读取密钥的问题可以尝试换一个读取方法。填充方式也是有3中分别是(pkcs1_PADDING,pkcs1_oape_PADDING,ssLv23_PADDING)

在加载密钥时一定要注意 密钥文件的格式

读取公钥要使用 "-----BEGIN PUBLIC KEY-----\n" + public + "\n-----END PUBLIC KEY-----" 也可以直接写入文件内。

读取私钥也是类似"-----BEGIN PRIVATE KEY-----\n" + private + "\n-----END PRIVATE KEY-----"

小二我要点菜,给我来一道 rsa代码。

初始化导入 公钥私钥

考虑到加密的数据比较 len()比较长 所以需要分段加密。 如果保证加密对象绝对在 要求范围内可以选择不进行分段加密。

!!!!!!!!!!注意: 进行分段加密一定要与对接方 协同好 不然永远解不开

解密也是一样,一定要沟通好。

 

本猿遇到过很多种报错:再次分享一下  本猿大脑内存有限,只能想起这么多了。还有很多报错是很常见的 一定要检查代码

报错说明:
                报错:读取私钥时报错信息是  not statr xxxx
                读取私钥要将密钥用 "-----BEGIN PRIVATE KEY-----\n" + private + "\n-----END PRIVATE KEY-----"包裹。

                报错:读取公钥时报错信息是 not statr xxxx
                读取公钥要将密钥用 "-----BEGIN PUBLIC KEY-----\n" + public + "\n-----END PUBLIC KEY-----"包裹。

                报错:Block type is not 01
                要注意是否是 在base64.b64encode() 在传输的过程中 改变了 base格式字符串 如 + 变成 " " 一个空格

                报错: M2Crypto.RSA.RSAError: pkcs decoding error
                注意查看你读取的 密钥对是否正确

                报错: 密码长度不正确
                这是解密失败的原因检查沟通加密的方式.

 

上源码!!!!  等等。。啰嗦一句 : 希望可以帮助到 更多人。本猿是个热爱代码 热爱工作的人。 入门菜猿一只。勿喷勿喷。

 

class M2Crypt_Rutil():
    def __init__(self,public=None,private=None):
        if public is None or private is None :
            raise '请输入初始化私钥或公钥'

        if type(public) != str or type(private) !=str :
            raise '请正确输入地址信息'

        #读取公钥
        with open(public, 'r') as f:
            self.pubkey = f.read()
        #读取私钥
        with open(private, 'r') as f:
            self.prikey = f.read()

    # 公钥加密
    def M2C_public_encrypt(self,decrypt_file):
        decrypt_file = decrypt_file.encode('utf-8')
        pub_bio = BIO.MemoryBuffer(self.pubkey.encode('utf-8'))  # 公钥字符串
        pub_rsa = RSA.load_pub_key_bio(pub_bio)  # 加载公钥
        length = len(decrypt_file)
        default_length = 117
        res = []
        for i in range(0, length, default_length):
            res.append(pub_rsa.public_encrypt(decrypt_file[i:i + default_length], RSA.pkcs1_padding)) # 分段加密
        byte_data = b''.join(res)
        # secret = pub_rsa.public_encrypt(decrypt_file, RSA.pkcs1_padding)  # 公钥加密
        sign = base64.b64encode(byte_data)  # 密文base64编码
        return sign

    #私钥加密
    def M2C_private_encrypt(self,decrypt_file):
        decrypt_file = decrypt_file.encode('utf-8')
        pub_bio = BIO.MemoryBuffer(self.prikey.encode('utf-8'))  # 私钥字符串
        pub_rsa = RSA.load_pub_key_bio(pub_bio)  # 加载私钥
        length = len(decrypt_file)
        default_length = 117
        res = []
        for i in range(0, length, default_length):
            res.append(pub_rsa.private_encrypt(decrypt_file[i:i + default_length], RSA.pkcs1_padding)) # 分段加密
        byte_data = b''.join(res)
        # secret = pub_rsa.public_encrypt(decrypt_file, RSA.pkcs1_padding)  # 公钥加密
        sign = base64.b64encode(byte_data)  # 密文base64编码
        return sign

    # 公钥解密
    def M2C_public_decrypt(self,decrypt_file):
        b64_sign = decrypt_file  # base64密文
        cipher = base64.b64decode(b64_sign)  # base64解码
        pri_bio = BIO.MemoryBuffer(self.pubkey.encode('utf-8'))  # 加载私钥
        pri_rsa = RSA.load_pub_key_bio(pri_bio)
        plain = pri_rsa.public_decrypt(cipher,RSA.pkcs1_padding)  # 解密
        return plain.decode('utf-8')

    #私钥解密
    def M2C_private_decrypt(self,decrypt_file):
        b64_sign = decrypt_file  # base64密文
        cipher = base64.b64decode(b64_sign)  # base64解码
        pri_bio = BIO.MemoryBuffer(self.prikey.encode('utf-8'))  # 加载私钥
        pri_rsa = RSA.load_key_bio(pri_bio)
        plain = pri_rsa.private_decrypt(cipher, RSA.pkcs1_padding)  # 解密
        return plain.decode('utf-8')
 

参考链接:https://segmentfault.com/a/1190000016851912

参考链接:https://github.com/xitu/gold-miner/blob/master/TODO/python-3-an-intro-to-encryption.md

参考链接:https://www.cnblogs.com/Colin-Cai/p/8013009.html

参考链接:https://blog.csdn.net/qq_38839677/article/details/80837589

参考链接:https://stuvel.eu/rsa

参考链接:https://www.jb51.net/article/86022.htm

参考链接:https://nangonghuang.github.io/2018/07/24/python%E4%B8%AD%E7%9A%84RSA%E7%9B%B8%E5%85%B3%E7%94%A8%E6%B3%95/

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值