Python | Python 实现RSA加解密 验签 无 长度限制 加密解密, 分段加密
系列文章目录
Python | Flask 解决跨域问题
文章目录
- 系列文章目录
- 为什么要分段加密
- 代码示例
- 测试
- 测试结果
为什么要分段加密
加密的字段长短规则如下:
加密的 plaintext 最大长度是 证书key位数/8 - 11, 例如1024 bit的证书,被加密的串最长 1024/8 - 11=117,
那么对于 2048bit的证书,被加密的长度最长2048/8 - 11 =245,
解决办法是 分块 加密,然后分块解密就行了,
因为 证书key固定的情况下,加密出来的串长度是固定的。
也就是说,如果使用2048bit的证书,并且被加密的字符段是小于245个,那么被加密出来的字符长度是344个,以此类推,被加密的字符串可以是688个,1032个等。
代码示例
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
from Crypto.Signature import PKCS1_v1_5from Crypto.PublicKey import RSA
from Crypto.Hash import SHA256
import base64class RsaUtil:def __init__(self, pub_key, pri_key):self.pri_key_obj = Noneself.pub_key_obj = Noneself.verifier = Noneself.signer = Noneif pub_key:pub_key = RSA.importKey(base64.b64decode(pub_key))self.pub_key_obj = Cipher_pkcs1_v1_5.new(pub_key)self.verifier = PKCS1_v1_5.new(pub_key)if pri_key:pri_key = RSA.importKey(base64.b64decode(pri_key))self.pri_key_obj = Cipher_pkcs1_v1_5.new(pri_key)self.signer = PKCS1_v1_5.new(pri_key)def public_long_encrypt(self, data, charset='utf-8'):data = data.encode(charset)length = len(data)default_length = 117res = []for i in range(0, length, default_length):res.append(self.pub_key_obj.encrypt(data[i:i + default_length]))byte_data = b''.join(res)return base64.b64encode(byte_data)def private_long_decrypt(self, data, sentinel=b'decrypt error'):data = base64.b64decode(data)length = len(data)default_length = 128res = []for i in range(0, length, default_length):res.append(self.pri_key_obj.decrypt(data[i:i + default_length], sentinel))return str(b''.join(res), encoding = "utf-8")def sign(self, data, charset='utf-8'):h = SHA256.new(data.encode(charset))signature = self.signer.sign(h)return base64.b64encode(signature)def verify(self, data, sign, charset='utf-8'):h = SHA256.new(data.encode(charset))return self.verifier.verify(h, base64.b64decode(sign))
测试
from rsa_util import RsaUtildata = "{\"0\":\"0\",\"1\":\"1\",\"10\":\"10\",\"11\":\"11\",\"12\":\"12\",\"13\":\"13\",\"14\":\"14\",\"15\":\"15\",\"16\":\"16\",\"17\":\"17\",\"18\":\"18\",\"19\":\"19\",\"2\":\"2\",\"3\":\"3\",\"4\":\"4\",\"5\":\"5\",\"6\":\"6\",\"7\":\"7\",\"8\":\"8\",\"9\":\"9\"}"pub_key = '''
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCQFA4YVQZatJAyO7TsuzkWE8dz
17qi8GuOCnegKbKd6alLXkDzKhVG3kd3GijouHtlqsm2zFCK7K+I5MUu8Fuk23OE
wIVZn9StltjLzJ1hB1AZC1/NCoCFZG5T2+AaQolrw8LvPS5jH2TuYQf7oLDHR88B
KJgV/tZlr22Jicqm0wIDAQAB
'''
pri_key = '''
MIICWwIBAAKBgQCQFA4YVQZatJAyO7TsuzkWE8dz17qi8GuOCnegKbKd6alLXkDz
KhVG3kd3GijouHtlqsm2zFCK7K+I5MUu8Fuk23OEwIVZn9StltjLzJ1hB1AZC1/N
CoCFZG5T2+AaQolrw8LvPS5jH2TuYQf7oLDHR88BKJgV/tZlr22Jicqm0wIDAQAB
AoGAMP6A5IlVRdcNCef/2Fi6SuWi96OuleYHzR+GGnLTiJuCtFxy3b27yoOf7cJ5
ktnZLHNtcLn90aA2+OhCnXmiz+M9PNArzfvtDoAKMlM9UEpBjGW/QYPkcHgnKOs9
utAr4OnPB9PFdvCuwya4P8AL/7kpjSW+4zQpUT459BlJFxECQQDYUnQQgyR3CZiG
Pj9vPfmmFmogpZpJTG9zAuOjOCxa5BQvV4iKhk6pkQAaVsjc7WMobEIhLqXn/I8E
ldsqIPj1AkEAqoFZULpjke8CQm0rmr2UdbhU74KKYzeS2KKKc/2TdQUzTqvBdY2+
VCyc0Ok6BWctBHfsu4FR6YpDYsg3QwvjpwJAEHeuaDdjhkBPwSBp+dDw+UjJiXSx
2xSbg1jb9WfoUH7+XmA+f7UbteLY7ChhIBheLQyYuCfx70gVpxa1WW6rJQJAEahR
mpWi6CMLZduub1kAvew4B5HKSRohQAQdOIPjOHQwaw5Ie6cRNeBk4RG2K4cS12qf
/o8W74udDObVKkFZ8wJAPL8bRWv0IWTlvwM14mKxcVf1qCuhkT8GgrG/YP/8fcW8
SiT+DifcA7BVOgQjgbTchSfaA+YNe7A9qiVmA+G4GQ==
'''rsa_util = RsaUtil(pub_key, pri_key)
print(f'原文: {data}')encrypt = rsa_util.public_long_encrypt(data)
print(f'加密: {encrypt}')decrypt_str = rsa_util.private_long_decrypt(encrypt)
print(f'解密: {decrypt_str}')sign = rsa_util.sign(data)
print(f'sign: {sign}')verify = rsa_util.verify(decrypt_str, sign)
print(f'verify: {verify}')
测试结果
原文: {"0":"0","1":"1","10":"10","11":"11","12":"12","13":"13","14":"14","15":"15","16":"16","17":"17","18":"18","19":"19","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9"}
加密: b'BXzccjfWEyF061Beh+bhqi0P88jMeB3eI84/mKgNVrVQFIh6wa209xzQLRCfoVJPN16T1T8jtORisdLXFTmdgH2cXHiorIJfYo+y64aJ8jg1hGe2zmUfFws2WcKttTGluhI8x3xbO2wZi1aHS8k8uxUR0bAWu+LHWcBABqGD3DUQf0AJ/graML1G1hIVYVd0JG6+wZnnB5o6wLrViAh7T2TiVtRVzA4dZ+z73mibDzSohHXA5zDb1XAO0RgATBnpMda0krMgZPOVZHhBRlz6PvUcYcv1+kUTsE/bqTDXOPiQJ2H7bnvTAA2ApoM5CRYFAuhKs5FHSHXhOc6K1uOHpQ=='
解密: {"0":"0","1":"1","10":"10","11":"11","12":"12","13":"13","14":"14","15":"15","16":"16","17":"17","18":"18","19":"19","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9"}
sign: b'Ho2uhOjKx4GRXulOq/x/owEB01rzztc7WmxTDxjxUzDf7U1cNsp1R7+ahwQuUnGR+lL8RX8G9PxYW/aofc0ApFqIanzEhxbVMsVk87V4M+a/ZEXOJuAgw/0U8IauuMtHl+zaI0KY+TDgrx1rXq5razqU2sU0Ps+y+ILytEK723k='
verify: True
Python | Python 实现RSA加解密 验签 无 长度限制 加密解密, 分段加密相关推荐
- 叙述无保密机制的rsa签名过程_安全系列之——RSA的公钥私钥有多少人能分的清楚?RSA的签名验签与加密解密如何使用公私钥?...
在对接很多的互联网公司的开发平台时,这些互联网公司未来自身平台的安全,都会需要调用方签名确认调用方的身份是合法的,同时未来信息网络传输的安全可能还需要加密解密.比如对接支付宝.微信开放平台时,需要配置 ...
- ECDSA算法加解密验签
前段时间,因为公司业务需求研究了一下加密验签算法,找到了网上一位大佬的研究代码参考 Java中加密算法介绍及其实现 - 枫飘雪落 - 博客园 在大佬的研究中说明中找到了我需要的算法介绍,但是下载了大佬 ...
- SpringBoot 系列教程(八十五):Spring Boot使用MD5加盐验签Api接口之前后端分离架构设计
加密算法参考: 浅谈常见的七种加密算法及实现 加密算法参考: 加密算法(DES,AES,RSA,MD5,SHA1,Base64)比较和项目应用 目的: 通过对API接口请求报文签名,后端进行验签处理, ...
- 微信小程序-RSA签名、验签、加密、解密
title: [小程序]RSA签名 type: categories date: 2017-05-27 17:01:15 categories: 小程序 tags: [RSA, 签名] 一个适用于微信 ...
- 加密解密验签概念理解
2019独角兽企业重金招聘Python工程师标准>>> 基本概念: 加密:发送方利用接受方的公钥对要发送的明文进行加密. 解密:接收方利用自己的私钥进行解密. 公钥与私钥是配对的,用 ...
- C++ 使用OpenSSL 基于SHA1摘要的RSA签名及验签 与Java平台互通
文章目录 准备 C++ Java RSASignature.java RSAEncrypt.java Base64.java 准备 配置OpenSSL环境 配置VS2015环境 生成公私秘钥 然后你们 ...
- 工银e生活开发脱坑日志(1)RSA密钥签名验签windows环境下配置
**环境配置:**阿里云 windows 2012 R2,WAMPSERVER 3.0.17集成环境 **入坑问题:**RSA2密钥对的生产及验签,产生报错信息:Warning: openssl_ve ...
- PHP实现RSA签名和验签
<?php define('ICLOD_CERT_PATH',dirname(__FILE__).'/xx_pri.key' ); //私钥文件 define('ICLOD_CERT_PUBLI ...
- 密码技术应用--RSA文件签名验签
记录一下对一些稍大文件进行RSA签名验签的实现,这里只列出了核心代码,其他不涉及的代码或者有任何疑问可以查看我之前写的密码技术专题博客 /* 函数名: rsaSignrsa 签名算法实现对文件的签名 ...
最新文章
- actived生命周期_vue生命周期钩子函数actived没有执行
- PHP 简单的数字过滤函数
- Design Pattern - Facade(C#)
- 在虚拟主机中无法实现缩放等交互
- iOS UI基础-6.0 UIActionSheet的使用
- 一款纯css3实现的超炫动画背画特效
- HTML5 响应式网页设计之页面美化(三.弹性布局)
- java编写Linux文件共享,ubuntu下用samba实现windows与linux文件共享
- 2018上海大学生网络安全赛 misc 92 wp
- Excel数据分析—柱状图
- 2019春季总结报告
- 亚马逊AWS EC2服务器配置教程
- c语言的虚拟变量,含有分类变量(categorical variable)的逻辑回归(logistic regression)中虚拟变量(哑变量,dummy variable)的理解...
- linux 中文ssid 显示,【两招解决网络设置 支持中文SSID】
- 安装一个新的int 9中断例程【在DOS下,按Tab建后改变当前屏幕的显示颜色,其它键照常处理】...
- Google VR开发-Cardboard VR SDK反畸变实现
- php 变量 问号,php – Laravel查询返回问号而不是变量值
- 讨论读书与命运及人生的意义
- 基美新型小体积电感器磁芯
- 5.10 自定义颜色至色板和全局色的使用 [Illustrator CC教程]
热门文章
- 机器人技术第三次作业:用面向对象的思维设计相关类,从而实现直线与直线、直线与圆、直线与矩形的交点。
- HFish蜜罐的搭建
- boost 时间和日期
- Adobe Dimension Essential Training: The Basics Adobe Dimension 基础教程:基础知识 Lynda课程中文字幕
- k8s部署Traefik
- 计算机网络安全性分析建模研究,计算机网络信息安全风险层次分析模型研究
- 中国防火墙行业创新战略及十四五投资规划分析报告2022-2027年
- WPF 插件HelixToolkit库实现3D显示
- 全新恶搞放屁小程序源码
- SQL*PLUS的异常处理-SP2-0606