前因后果之哗啦啦废话连篇:

这几天本人在 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 模式相关推荐

  1. python3文件处理_简述 Python3 文件处理

    1.文件处理 找到文件 --> 打开文件 --> 操作:读.写 --> 保存 --> 关闭 1.1.1 写文件 (只要牵扯到文件操作,都是字符串:写文件的时候需要把写的数字转换 ...

  2. python分配buffer_Node.js中的buffer如何和python中的buffer相对应

    我的整个需求可以分解为下面几步: step1.Node.js发送Buffer类型数据: 因为Node.js中fs文件系统读取文件后的回掉中均返回的为Buffer类型的数据, 直接通过queryStri ...

  3. js中的4种函数调用模式:函数调用、方法调用、构造器调用、间接调用

    全栈工程师开发手册 (作者:栾鹏) js系列教程4-函数.函数参数教程全解 js中的4种函数调用模式 javascript一共有4种调用模式:函数调用模式.方法调用模式.构造器调用模式和间接调用模式. ...

  4. 国密sm2 js加密后台解密,sm3 js、后台加密,sm4 后台加密

    公司最近进行安全问题修改,所以要用国密系列的sm2,sm3,sm4,这些加密都用在登录模块,因此作为菜鸟的我,从网上找了一堆资料,整理修改后形成符合项目的加密,需要的可以自己去查看相关代码和jar包: ...

  5. vue样式 引入图片_详解Vue.js中引入图片路径的几种方式

    vue --version 3.6.3 记录总结一下的Vue中引入图片路径的几种书写方式 vue中静态资源的引入机制 Vue.js关于静态资源的官方文档 静态资源可以通过两种方式进行处理: 在 Jav ...

  6. java 字符串 加密_如何用JAVA实现字符串简单加密解密?

    展开全部 java加密字符串可以使用des加密算法62616964757a686964616fe4b893e5b19e31333363376462,实例如下: package test; import ...

  7. java中如何设置浏览器宽度_[Java教程]关于JS中获取浏览器高度和宽度值的多种方法(多浏览器)_星空网...

    关于JS中获取浏览器高度和宽度值的多种方法(多浏览器) 2017-08-07 0 三种浏览器获取值方法 IE中: document.body.clientWidth ==> BODY对象宽度 d ...

  8. new 实例化对象是啥意思_二. 初步认识JS中的类和对象

    1 构造函数的定义 在JS中, 没有类(class)的概念, 主要是通过构造函数来模拟的. 语法 function 构造函数名 () {// 函数体} 使用function关键字表示定义一个构造函数 ...

  9. js变量提升_学习笔记:JS中的作用域和预解析

    知识总结:谢静贤.汤昊 在javascript中作用域是非常重要的,本文将会说明作用域以及我们在工作,以及面试中的一些面试题,如果有不足的地方希望大家可以评论指出来,自己一定会及时的改正错误,避免大家 ...

最新文章

  1. 怎样在表格中选出同一类_超超超超实用的年会策划执行表格模板合集!
  2. 使用slice和concat对数组的深拷贝和浅拷贝
  3. android .a .so区别,.so,.la和.a库文件有什么区别?
  4. 一次 .NET Core 中玩锁的经历:ManualResetEventSlim, Semaphore 与 SemaphoreSlim
  5. pxe linux自动安装系统,通过 PXE 自动安装操作系统(1):部署 PXE Server
  6. docker中部署Nginx
  7. oracle语句转成mysql语句_如何监控Mysql语句
  8. Author Topic Model[ATM理解及公式推导]
  9. 扩展或插件 (Extension or Plugin )
  10. VC++ 在两个程序中 传递字符串等常量值的方法:使用了 WM_COPYDATA 消息的
  11. 使用ImageView引起Missing contentDescription attribute on image的问题
  12. 【windows】win键失效
  13. 开心消消乐h5版游戏案例分享
  14. 换个安逸点儿的英文名,希望以后事业顺遂!
  15. 2021清北学堂储备营Day1
  16. 如何安装HDDM,无法使用HDDM
  17. rtd1296 mtd 设备驱动分析
  18. 计算机网络的有线接入,台式电脑怎么连接有线网络
  19. Java中双冒号(::)运算操作符
  20. 分析1996~2015年人口数据特征间的关系并分析1996~2015年人口数据各个特征的分布分散状况

热门文章

  1. 大规模深度学习预测场景下 codegen 的思考与应用
  2. vsftpd服务安装与虚拟用户配置
  3. python中的列表操作
  4. 9月9日项目群管理活动讨论
  5. 柯里化思想--JS中的预处理机制
  6. SQLAlchemy技术文档(中文版)(中)
  7. 【原】Linux find 命令整理
  8. JPA2.0回调函数的使用
  9. Html5版本的全套股票行情图开源了,附带实现技术简介
  10. ABAP將數字輸出前面補0