参考博客地址:

https://blog.csdn.net/qq_33414271/article/details/78424951

https://www.cnblogs.com/piperck/p/7257043.html

最近由于工作的需要,需要写mock,写mock就需要接触到加密解密签名验签的问题,下面是一些总结(只针对加密解密):

加密解密概念

关于加解密和加签验签的概念参考上面的第二个博主内容,解释的很到位,这里直接摘取过来了:

加密和加签完全不是同样一件事情。

加密使用的是公钥对数据进行加密,而且当你使用一把1024bit的rsa公钥的时候,你一次只能加密最多117byte的数据,

如果数据量超过这个数,可能会涉及到对数据进行分段加密的问题。而且现在rsa 1024bit长度的钥匙已经被证明了不够安全,

应该尽量使用2048bit长度的钥匙。2048bit长度的钥匙一次可以加密245byte长度的数据。这个计算方法是 2048bit/8 =

256byte - 11byte = 245byte长数据。就是钥匙长度减去11byte得到的自己最大能一次加密多长的数据。如果超过了就会报错,

所以很多平台要求对数据用公钥进行加密,就可能涉及到分段加密的问题。同时要注意的是,解密的时候不存在这11byte的

减少。就是说一把1024bit的钥匙可以解密128byte长的数据而2048bit的可以解密256byte的数据。

而加签是使用自己的私钥对需要加签的字符串进行签名。而对方需要拿着你给的公钥来验证这个数据是不是由你发出的,

需要使用公钥对数据进行验签。如果成功验签才能说明你是你。

代码实现

这里公钥私钥是找开发要的,不是自己生成的,因为是做mock,需要和开发的公钥私钥一致。

实现加密代码:

from Crypto.Cipher importPKCS1_v1_5 as Cipher_pkcs1_v1_5from Crypto.PublicKey importRSAimportbase64'''单次加密串的长度最大为(key_size/8 - 11)

加密的 plaintext 最大长度是 证书key位数/8 - 11, 例如1024 bit的证书,被加密的串最长 1024/8 - 11=117,

解决办法是 分块 加密,然后分块解密就行了,

因为 证书key固定的情况下,加密出来的串长度是固定的。'''

defrsa_long_encrypt(pub_key_str, msg):

msg= msg.encode('utf-8')

length=len(msg)

default_length= 117

#公钥加密

pubobj =Cipher_pkcs1_v1_5.new(RSA.importKey(pub_key_str))#长度不用分段

if length

offset =0

res=[]while length - offset >0:if length - offset >default_length:

res.append(pubobj.encrypt(msg[offset:offset+default_length]))else:

res.append(pubobj.encrypt(msg[offset:]))

offset+=default_length

byte_data= b''.join(res)return base64.b64encode(byte_data)

这里有个问题,我怎么知道证书key的位数呢?开始的时候尝试过用print(len(key))来查看key的位数,但是输出的结果不对,

最后是通过监测Crypto模块中计算key位数的代码来查看的:

上面的modBits值就是key的位数。

根据需要,可以使用base64算法将二进制流转换成字符串。这里加密的时候还出现了一个问题,就是分段加密后最后拼接成一

个加密串的时候报错了:

错误大概的意思是不可以用byte类型进行拼接,其实''.join(res)是将列表中的各个字符串元素拼接成一个字符串,但是这里加密后

返回的结果类型是byte类型的,不是str,所以才报错了。解决方法也简单,就是做bytes拼接,在''.join(res)前加b就可以了,修改

后的为b''.join(res)。

实现解密代码:

defrsa_long_decrypt(priv_key_str, msg):

msg=base64.b64decode(msg)

length=len(msg)

default_length= 128

#私钥解密

priobj =Cipher_pkcs1_v1_5.new(RSA.importKey(priv_key_str))#长度不用分段

if length

offset =0

res=[]while length - offset >0:if length - offset >default_length:

res.append(priobj.decrypt(msg[offset:offset+default_length], b'xyz'))else:

res.append(priobj.decrypt(msg[offset:], b'xyz'))

offset+=default_lengthreturn b''.join(res)

这里需要注意的是decrypt方法,这个方法有两个参数,第一个参数是解密的内容,第二个参数是解密错误后返回的结果,这个结

果也需要转换成byte类型。

对加密解密代码进行测试:

msg = '{"ApplyId":"20180504002","ChannelId":"O00420000001","LoanId":"9996401-5077812265125477811","LoanAmount":"5000.00""LoanPeriod":6,"LoanCardNo":"6225768313133272","BankId":"BANKLIST/ZHAOHANG"}'with open('rsa-public.pem') as f:'''读取公钥并加密'''key=f.read()

result=rsa_long_encrypt(key, msg)print(result.decode('utf-8'))

with open('rsa-private.pem') as f:'''读取私钥并解密'''key1=f.read()

result1=rsa_long_decrypt(key1, data)print(result1.decode('utf-8'))

这里可能会出现读取密钥格式错误的问题,这时需要在密钥的前后加上以下内容,如果是自动生成的.pem文件不会有这个问题的。

公钥:

私钥:

以上

c语言 rsa算法 分段,python3 实现RSA算法分段加密解密相关推荐

  1. java和c 的rsa加密算法_RSA算法签名技术Java与C++统一(加密解密结果一样)

    RSA算法签名技术Java与C++统一 (加密解密结果一样) 源代码下载地址:http://www.doczj.com/doc/64f44a94a0116c175f0e484d.html/produc ...

  2. lua与php通用异或算法,php使用异或实现的加密解密实例

    若a=b ^ c;则b=a ^ c (^是异或的意思),php在处理异或的字符时先把字符转化为二进制的ascii值,对这些值进行异或,获取结果后在将ascii值转化为字符,原理说晚了直接贴实现的代码: ...

  3. C#加密解密(DES,AES,Base64,md5,SHA256,RSA,RC4)

    一:异或^简单加解密(数字类型) 1:原理: 异或用于比较两个二进制数的相应位,在执行按位"异或"运算时,如果两个二进制数的相应位都为1或者都为0,则返回0;如果两个二进制数的相应 ...

  4. C#的加密解密算法,包括Silverlight的MD5算法

    C#的加密解密算法,包括Silverlight的MD5算法 下面是一段加密解密工具类,其中的WinFormMD5Encrypt方法可以使得Winform和WebForm下的MD5加密结果一致,默认他们 ...

  5. 【C 语言】文件操作 ( 文件加密解密 | 使用第三方 DES 加密解密库 | 头文件导入 | 兼容 C++ 语言 | 加密解密函数说明 )

    文章目录 一.导入第三方库头文件 二.头文件说明 1.兼容 C++ 语言 2.头文件导入限制 3.加密解密函数说明 一.导入第三方库头文件 对文件进行加密 , 将文件中的数据分成若干块 , 一块一块的 ...

  6. BCrypt算法加密解密

    BCrypt的密码加密 介绍 BCrypt算法是目前使用比较广泛的加密解密算法,SpringSecurity中提供了BCryptPasswordEncoder类. 优点 自己写的加密算法或者MD5,同 ...

  7. Java简单实现DES加密解密算法

    Java简单实现DES加密解密算法 文章目录 Java简单实现DES加密解密算法 DES算法介绍 实现相关java类 代码实现 DES算法介绍 DEC加密算法属于对称加密,即利用指定的密钥,按照密码的 ...

  8. C# 3DES加密解密算法

    using System; using System.Collections.Generic; using System.Text; using System.Security.Cryptograph ...

  9. rsa加解密算法报告c语言,RSA加密解密算法c语言程序Word版

    <RSA加密解密算法c语言程序Word版>由会员分享,可在线阅读,更多相关<RSA加密解密算法c语言程序Word版(5页珍藏版)>请在人人文库网上搜索. 1.传播优秀Word版 ...

最新文章

  1. Apache漏洞修复
  2. R语言cox回归模型案例(绘制列线图、校正曲线):放疗是否会延长胰脏癌手术患者的生存时间
  3. SpringMVC 框架系列之初识与入门实例
  4. cad 快捷键命令大全
  5. centos,yum安装时报错could not retrieve mirrorlist,resolve.conf配置,dns配置错误
  6. JavaScript实现使用二元运算符将两个数字相加fullAdder算法(附完整源码)
  7. 上海博彦科技 千万别来_这个年产值2870亿元的科技园区,将率多家企业亮相本届服贸会...
  8. 基于xilinx vivado的XDMA IP的使用详解
  9. stm32使用DAP下载程序
  10. 学习Selenium 自动化从一张藏宝图开始
  11. php 获取图片、swf的尺寸大小
  12. 机器学习- 吴恩达Andrew Ng Week10 知识总结 Large scale machine learning
  13. hdu-5064(dp)
  14. Traffic Flow Prediction Using Graph Convolution Neural NetworksOC 翻译笔记
  15. 移动滑杆控制(UGUI实现)Unity3D
  16. 谈谈我对前端组件化中“组件”的理解,顺带写个Vue与React的demo
  17. Python 静态方法 类方法
  18. Windows PowerShell 实战指南-附录(复习实验)-实验回顾1
  19. 计算机视觉的相关会议,计算机视觉相关会议
  20. CORDIC算法的matlab和FPGA实现

热门文章

  1. 【无标题】7-Zip漏洞
  2. 走进Spring Cloud之二 eureka注册中心(Greenwich版本)
  3. 云服务案例分析 BB平台 Quiz6
  4. checkbox选中和不选中 jqu_jQuery解决checkbox未选中不提交值的问题
  5. 外媒:华为为融资修改内部员工认股规则
  6. mysql中查询的第一名_使用SQL查询每科第一名及最后一名(学科、姓名、分数)...
  7. 抖音运营的几点实战经验
  8. oracle11g数据库导入导出
  9. ctf解题--后台登录(web)
  10. JQuery 入门 - 附案例代码