热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

202017爬网页18js逆向入门(RSA加密非对称加密,安全性高。pem,jsencrypt.min.js)

本文只适用于初学者,只需要会打断点追踪就可以了。前端js代码除了Base64编码和解码,MD5加密,AES加密之外,有时候

本文只适用于初学者,只需要会打断点追踪就可以了。

前端js代码除了Base64编码和解码,MD5加密,AES加密之外,有时候还会用RSA加密。

关于RSA加密详细说明,参见
https://blog.csdn.net/u014044812/article/details/80782448
https://blog.csdn.net/u014044812/article/details/80866759

简介


RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。——维基百科

非对称算法有2个密钥,公钥和私钥。

1.加密和解密核心过程如下:

step1.用公钥 (n,e)加密
其中
e:Modulus,模数(系数)
n:Public exponent,指数

假设要一个字母m=“A”。
在通信传输中只能传输0和1,所以要先将“A”转ascii码为65,即m=65。m必须是整数(字符串可以取ascii值或unicode值),且m必须小于n。
通过以下加密公式算出密文c

密文c = 明文me(mod n)

表示:对明文m进行e次方后再对其用 n 求余,就得到了用RSA加密后的密文

由此,假设公钥为(n,e)=(3233, 17),明文m=65,那么密文c为

c = 6517(mod 3233)

所以,最终发送的密文就是2790

step2.用私钥(n,d)解密
接收方得到密文2790后,就用以下公式解密

明文m = 密文cd (mod n)

表示:将密文求 d 次方后再用 n 求余,就得到了原来的明文m。

此时接收方的私钥为 (n,d) = (3233,2753),明文为

m = 27902753 (mod 3233)

得到还原后的明文65,对应的字母就是A

2.整个RSA加解密过程如下:

  • 发送方获取到接收方的公钥 (n,e) = (3233,17)
  • 发送方选取发送的消息m=A=65。注意m要小于n,如果消息大于n,则可以分段加密!
  • 发送方过加密公式:c = me(mod n) 算出密文c=2790
  • 接收方获取到发送方的密文c=2790
  • 接收方利用自己的私钥 (n,d) = (3233,2753),使用解密公式:m = cd (mod n) 算出明文m=65=A

注意:RSA加密每次加密的结果是不一样的。具体原因参见链接

密钥生成

关于密钥和公钥的生成过程,参见链接

很多时候得到的公私钥是PEM格式,相关说明参见链接

例如

-----BEGIN PUBLIC KEY-----
MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgGeDHRzMP9RAy7Xpxb/GW37uEXDF
HVYHZbJvu4OdO+TNGwdB9vLs1eWRlgkO740WyE9OO33PPNu4JOg0uXH6ehH+CUqM
SUHAeDmGGWYEMKB4IETl/c0c452tMKsm6kcxRUrnHleB0gJsNgW4czlomzpSUHLh
16HDJ7ZQ2r38k0nXAgMBAAE=
-----END PUBLIC KEY-----

这是标准的pem公钥格式,bytes类型,每64字符换一次行。

pem格式是可以转换为指数,模数格式 (n,e)的。
在线转换链接–>http://tool.chacuo.net/cryptrsakeyparse

js使用RSA加密

看个实际的例子
在这里插入图片描述
上面的网站,我输入的密码是123456,但是看form data,jxy_parameter中的password显然是加密了。

搜索"jxy_parameter",打上断点
在这里插入图片描述

先清空COOKIE,local storage和session storage。刷新网页后,开始追踪。
在这里插入图片描述

进去以后就会看到上面界面。
那个函数function O(e),就是典型的RSA加密。

function O(e) {var t = new JSEncrypt;return t.setPublicKey(e.key),function(n) {return t.encrypt(e.hash + n)}}

我们先说一下上图中下面的那个函数,它会产生一个post请求getkey。
可以看一下,它能获得下面的请求结果。
在这里插入图片描述
看到了什么,对了,就是public key公钥。
我们说过,RSA加密需要对方的公钥,所以在网页提交请求后,会先和服务器通讯,获得服务器公钥,然后再继续后面的提交请求步骤。

这个公钥值是不会变化的。你可以尝试多次,结果一样。

除了公钥,getkey请求还得到参数hash,这个值每次请求都会变。它和明文合并后再被加密。

t.encrypt(e.hash + n)

现在继续跟踪function O(e)
在这里插入图片描述
它会进入另外一个js文件,jsencrypt.min.js。
后面就不再展开,有兴趣自己继续跟踪。

我们来说明一下jsencrypt.min.js文件。
在这个文件中你可看到下面的文字

// Copyright (c) 2005-2009 Tom Wu
// All Rights Reserved.
// See "LICENSE" for details.

Tom Wu是什么人?你可以去链接中了解。
在链接的bin目录下,你也能找到那个熟悉的jsencrypt.min.js。

在js中使用RAS加解密方法,似乎都是使用了Tom Wu的jsencrypt.min.js。
斯坦福的链接中能看到Demo。

使用方法很简单。
先引入


然后加密

function 加密(公钥, 明文) { var encrypt = new JSEncrypt();encrypt.setPublicKey(公钥);var 密文 = encrypt.encrypt(明文);return 密文
}

就和我们例子中展现的一致。


推荐阅读
  • Go从入门到精通系列视频之go编程语言密码学哈希算法(二) ... [详细]
  • 如何高效解决Android应用ANR问题?
    本文介绍了ANR(应用程序无响应)的基本概念、常见原因及其解决方案,并提供了实用的工具和技巧帮助开发者快速定位和解决ANR问题,提高应用的用户体验。 ... [详细]
  • 在现代Web开发中,HTML5 Canvas常用于图像处理和绘图任务。本文将详细介绍如何将Canvas中的图像导出并上传至服务器,适用于拼图、图片编辑等场景。 ... [详细]
  • 1.前言PAP和CHAP协议是目前的在PPP(MODEM或ADSL拨号)中普遍使用的认证协议,CHAP在RFC1994中定义,是一种挑战响应式协议&#x ... [详细]
  • vsftpd配置(虚拟用户、匿名用户登录)
    一、ftp服务搭建(一)概述1.ftp连接及传输模式(1)控制连接TCP21,用于发送FTP命令信息 ... [详细]
  • 近期尝试从www.hub.sciverse.com网站通过编程手段获取数据时遇到问题,起初尝试使用WebBrowser控件进行数据抓取,但发现使用GET方法翻页时,返回的HTML代码始终相同。进一步探究后了解到,该网站的数据是通过Ajax异步加载的,可通过HTTP查看详细的JSON响应。 ... [详细]
  • 本文详细介绍了在 Ubuntu 16.04 系统上安装和配置 PostgreSQL 数据库的方法,包括如何设置监听地址、启用密码加密、更改默认用户密码以及调整客户端访问控制。 ... [详细]
  • 理解浏览器历史记录(2)hashchange、pushState
    阅读目录1.hashchange2.pushState本文也是一篇基础文章。继上文之后,本打算去研究pushState,偶然在一些信息中发现了锚点变 ... [详细]
  • 本文通过分析一个具体的案例,探讨了64位Linux系统对32位应用程序的兼容性问题。案例涉及OpenVPN客户端在64位系统上的异常行为,通过逐步排查和代码测试,最终定位到了与TUN/TAP设备相关的系统调用兼容性问题。 ... [详细]
  • 本文详细介绍如何使用Netzob工具逆向未知通信协议,涵盖从基本安装到高级模糊测试的全过程。通过实例演示,帮助读者掌握Netzob的核心功能。 ... [详细]
  • 本文回顾了作者初次接触Unicode编码时的经历,并详细探讨了ASCII、ANSI、GB2312、UNICODE以及UTF-8和UTF-16编码的区别和应用场景。通过实例分析,帮助读者更好地理解和使用这些编码。 ... [详细]
  • 开发日志:高效图片压缩与上传技术解析 ... [详细]
  • 在JUnit测试框架中,确保@Test注解的方法按特定顺序执行是常见的需求。本文总结了三种实现这一目标的策略。首先,介绍了通过方法名称排序来控制执行顺序的基本方法。其次,推荐了一种利用依赖管理插件的方式,这种方法更为灵活且易于维护。最后,探讨了使用第三方库如TestNG或Jupiter扩展来实现更复杂的顺序控制。每种方法都有其适用场景和优缺点,开发者可以根据具体需求选择最合适的方案。 ... [详细]
  • 本文深入解析了JDK 8中HashMap的源代码,重点探讨了put方法的工作机制及其内部参数的设定原理。HashMap允许键和值为null,但键为null的情况只能出现一次,因为null键在内部通过索引0进行存储。文章详细分析了capacity(容量)、size(大小)、loadFactor(加载因子)以及红黑树转换阈值的设定原则,帮助读者更好地理解HashMap的高效实现和性能优化策略。 ... [详细]
  • 《我的世界》Java版种子合集:探索多样世界生成
    本文介绍了《我的世界》Java版中用于生成多样化游戏世界的种子代码。这些种子是由一个或多个字符(包括正整数和负整数)组成的值,能够为玩家带来截然不同的地形和环境体验。通过使用不同的种子,玩家可以探索各种独特的地貌、生物群系和结构,从而丰富游戏的乐趣和挑战性。 ... [详细]
author-avatar
JJ关键词
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有