python3 rsa加密_【Python】Python3 实现 JS 中 RSA 加密的 NoPadding 模式
前因后果之哗啦啦废话连篇:
这几天本人在 Python 做某网站登陆的时候,发现其登陆时用户名和密码被加密了
F12 仔细看了一下,发现是调用了一个 js 的 rsa 加密库,页面 dom 中有 rsa 公钥
于是乎,用了 3 分钟刷刷的潇洒的写了个 py 脚本,结果对比后傻眼了。。。
web 页面调用 js 库中的加密方式是 nopadding,也就是说,每次加密的结果都一样
而我的 py 脚本每次都不一样!!至于为什么会不一样,以及 padding 的作用请自行百度
于是乎,百度各种 python 库,也没有合适的解决方法
python 库 Crypto 倒是有一个网友给出了方法,但是安装这个库需要安装 Microsoft Visual C++ Build Tools
滚蛋,强行绑架的感觉,还是自己想办法搞定吧。
于是乎...
爆肝研究 RSA 大法
先分析了两个主要 js 文件,Bigint.js 、Barrett.js ,一脸懵逼,一头雾水,不知道再干嘛,仿佛在造一些轮子。。。暂且放过
主要知道了一个事情:
"填充后数据" = "00" + "数据块类型" + "填充字符串" + "00" + "原始数据"
然后又翻看了 python 的 rsa 库源码,其中有一个函数 _pad_for_encryption() ,很可疑,正是在做上述填充数据的事:
此函数位于 python 的 rsa 库 /pkcs1.py 文件中
def _pad_for_encryption(message, target_length):
r"""Pads the message for encryption, returning the padded message.
:return: 00 02 RANDOM_DATA 00 MESSAGE
>>> block = _pad_for_encryption(b'hello', 16)
>>> len(block)
16
>>> block[0:2]
b'\x00\x02'
>>> block[-6:]
b'\x00hello'
"""
max_msglength = target_length - 11
msglength = len(message)
if msglength > max_msglength:
raise OverflowError('%i bytes needed for message, but there is only'
' space for %i' % (msglength, max_msglength))
# Get random padding
padding = b''
padding_length = target_length - msglength - 3
# We remove 0-bytes, so we'll end up with less padding than we've asked for,
# so keep adding data until we're at the correct length.
while len(padding) < padding_length:
needed_bytes = padding_length - len(padding)
# Always read at least 8 bytes more than we need, and trim off the rest
# after removing the 0-bytes. This increases the chance of getting
# enough bytes, especially when needed_bytes is small
new_padding = os.urandom(needed_bytes + 5)
new_padding = new_padding.replace(b'\x00', b'')
padding = padding + new_padding[:needed_bytes]
assert len(padding) == padding_length
return b''.join([b'\x00\x02',
padding,
b'\x00',
message])
重点看 return 的数据,和上面所述的填充方法完全一致。
既然是 nopadding,那就把填充的值全部设置为\x00,填充方式也选\x00,把上述方法关键位置给改掉
完事,重新运行代码,加密后的数据确实不变了,每次都一样,但是和 web 页面中 js 库的还是不一样
突然想到,去看看这个 js 库的官方文档!!
里面开头就介绍了 padding 的填充方式:
* Plaintext In
* ------------
*
* d5 d4 d3 d2 d1 d0
*
*
* NoPadding
* ---------
*
* 00 00 00 00 00 00 00 00 00 /.../ 00 00 d0 d1 d2 d3 d4 d5
果然有猫腻,这里的实现,是把需要加密的字符串反转,然后其他位全部填充\x00
既然知道了具体的填充方法,那就再改动一下 python 的 rsa 库_pad_for_encryption()函数
果然
加密的结果和 web 中的 js 库加密的结果一样(使用相同的公钥)
最后撤销对 python 的 rsa 库文件修改,导入 rsa 库中的相关函数,封装成自己的函数,直接调用自己函数即可
当然,既然 nopadding 模式的搞定了,也可以搞定其他方式的填充了,但是本人暂时用不到,就没有再继续研究
有兴趣的可以自行研究
至此结束。。
后续
python3 rsa加密_【Python】Python3 实现 JS 中 RSA 加密的 NoPadding 模式相关推荐
- python3文件处理_简述 Python3 文件处理
1.文件处理 找到文件 --> 打开文件 --> 操作:读.写 --> 保存 --> 关闭 1.1.1 写文件 (只要牵扯到文件操作,都是字符串:写文件的时候需要把写的数字转换 ...
- python分配buffer_Node.js中的buffer如何和python中的buffer相对应
我的整个需求可以分解为下面几步: step1.Node.js发送Buffer类型数据: 因为Node.js中fs文件系统读取文件后的回掉中均返回的为Buffer类型的数据, 直接通过queryStri ...
- js中的4种函数调用模式:函数调用、方法调用、构造器调用、间接调用
全栈工程师开发手册 (作者:栾鹏) js系列教程4-函数.函数参数教程全解 js中的4种函数调用模式 javascript一共有4种调用模式:函数调用模式.方法调用模式.构造器调用模式和间接调用模式. ...
- 国密sm2 js加密后台解密,sm3 js、后台加密,sm4 后台加密
公司最近进行安全问题修改,所以要用国密系列的sm2,sm3,sm4,这些加密都用在登录模块,因此作为菜鸟的我,从网上找了一堆资料,整理修改后形成符合项目的加密,需要的可以自己去查看相关代码和jar包: ...
- vue样式 引入图片_详解Vue.js中引入图片路径的几种方式
vue --version 3.6.3 记录总结一下的Vue中引入图片路径的几种书写方式 vue中静态资源的引入机制 Vue.js关于静态资源的官方文档 静态资源可以通过两种方式进行处理: 在 Jav ...
- java 字符串 加密_如何用JAVA实现字符串简单加密解密?
展开全部 java加密字符串可以使用des加密算法62616964757a686964616fe4b893e5b19e31333363376462,实例如下: package test; import ...
- java中如何设置浏览器宽度_[Java教程]关于JS中获取浏览器高度和宽度值的多种方法(多浏览器)_星空网...
关于JS中获取浏览器高度和宽度值的多种方法(多浏览器) 2017-08-07 0 三种浏览器获取值方法 IE中: document.body.clientWidth ==> BODY对象宽度 d ...
- new 实例化对象是啥意思_二. 初步认识JS中的类和对象
1 构造函数的定义 在JS中, 没有类(class)的概念, 主要是通过构造函数来模拟的. 语法 function 构造函数名 () {// 函数体} 使用function关键字表示定义一个构造函数 ...
- js变量提升_学习笔记:JS中的作用域和预解析
知识总结:谢静贤.汤昊 在javascript中作用域是非常重要的,本文将会说明作用域以及我们在工作,以及面试中的一些面试题,如果有不足的地方希望大家可以评论指出来,自己一定会及时的改正错误,避免大家 ...
最新文章
- 怎样在表格中选出同一类_超超超超实用的年会策划执行表格模板合集!
- 使用slice和concat对数组的深拷贝和浅拷贝
- android .a .so区别,.so,.la和.a库文件有什么区别?
- 一次 .NET Core 中玩锁的经历:ManualResetEventSlim, Semaphore 与 SemaphoreSlim
- pxe linux自动安装系统,通过 PXE 自动安装操作系统(1):部署 PXE Server
- docker中部署Nginx
- oracle语句转成mysql语句_如何监控Mysql语句
- Author Topic Model[ATM理解及公式推导]
- 扩展或插件 (Extension or Plugin )
- VC++ 在两个程序中 传递字符串等常量值的方法:使用了 WM_COPYDATA 消息的
- 使用ImageView引起Missing contentDescription attribute on image的问题
- 【windows】win键失效
- 开心消消乐h5版游戏案例分享
- 换个安逸点儿的英文名,希望以后事业顺遂!
- 2021清北学堂储备营Day1
- 如何安装HDDM,无法使用HDDM
- rtd1296 mtd 设备驱动分析
- 计算机网络的有线接入,台式电脑怎么连接有线网络
- Java中双冒号(::)运算操作符
- 分析1996~2015年人口数据特征间的关系并分析1996~2015年人口数据各个特征的分布分散状况