python - RSA加密

2023-05-16

什么是RSA?这里粘贴一些定义。
RSA公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。

在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。
正是基于这种理论,1978年出现了著名的RSA算法,它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要。
RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现今的三十多年里,经历了各种攻击的考验,逐渐为人们接受,截止2017年被普遍认为是最优秀的公钥方案之一。
SET(Secure Electronic Transaction)协议中要求CA采用2048bits长的密钥,其他实体使用1024比特的密钥。RSA密钥长度随着保密级别提高,增加很快。下表列出了对同一安全级别所对应的密钥长度。

今天笔者想要分享的是另外一种加密,python中的RSA加密,当我们不用selenium和Chromedriver的时候模拟登录问题常常是我们的一大难关,因为登录的时候可能会遇到一些加单的账号或者密码加密,最常见的也就是md5加密了,sha1加密了,bs64加密了诸如此类,今天笔者想要分享的就是登录的时候数据被加密的时候一种分析解密的情况。
第一步:当我们通过提交过数据表单的时候,通过fiddler抓包发现data这个数据并不是我们所提交的数据,而是一串自己也看不懂的代码,这个时候就需要想到可能是账号或者密码被加密了,需要考虑找到加密函数并破解之,这里笔者分享一个自己遇到的加密问题,如下图:
这里写图片描述
从上图可知提交的表单数据显然是经过加密过后的,那么如何寻找加密之前的函数呢?这里为大家一一分享过程。
第一种方法:当然是之前笔者所说最简单的方法,通过fiddler来查找,前提是清除cookies使js重新加载一遍,即可找到想要的js文件。
这里写图片描述
从图片中,我们就可以找到函数到底存在哪一个js文件中。
通过之前笔者分享的:http://www.bm8.com.cn/jsConfusion/ js格式化一下,然后即可找到想要的加密函数。

 $.ajax({
        type: "POST",
        url: $("#ctx").val() + "/login.action",
        data: {
            userAuthInfo: getUserAuthInfo()
        },
        success: function (b) {
            if (b.promptMsg == null) {
                document.cookie = "orgTypeName =" + escape(b.orgTypeName) + ";path=/";

可知需要进一步查找getUserAuthInfo()这个函数,函数如下:

function getUserAuthInfo() {
    var d = $("#loginName").val();
    var a = $.md5($("#password").val());
    var c = $("#validateCode").val();
    var g = $("#loginPageType").val();
    var e = d + ";" + a + ";" + c + ";" + c + ";" + g;
    var b = $.cookies.get("rsaPublicKey");
    var f = new JSEncrypt();
    f.setPublicKey(b);
    return f.encrypt(e)
};

从上中的代码可知 rsaPublicKey 需要这个公钥来加密,显然是rsa加密,那么可以继续查看这个函数。

function getRSAPublicKey() {
    $.ajax({
        type: "POST",
        url: $("#ctx").val() + "/loginRSAPublicKey.action",
        success: function (a) {
            if (a.rsaPublicKey != null && a.rsaPublicKey != "") {
                document.cookie = "rsaPublicKey =" + escape(a.rsaPublicKey) + ";path=/"
            } else {
                $("#validate_img").click();
                $("#tip").text("业务服务器异常")
            }
        },
        error: function () {
            $("#validate_img").click();
            $("#tip").text("业务服务器异常")
        }
    })
}

既然我们知道了是RSA加密,那么通过getUserAuthInfo()这个函数即可获取我们想要的加密文件,那么分析:

function getUserAuthInfo() {
    var d = $("#loginName").val();  // 获取登录账号
    var a = $.md5($("#password").val());  // 获取登录的密码经过md5加密
    var c = $("#validateCode").val();    // 验证码的值
    var g = $("#loginPageType").val();   // loginPageType同样的可通过fiddler查找找到这个值的由来。
    var e = d + ";" + a + ";" + c + ";" + c + ";" + g;
    var b = $.cookies.get("rsaPublicKey");  // 得到加密的公钥,其中的公钥的查找可以在上一个页面上的cookies中找到,这个就简答多了。这里就不分享查找公钥的过程了。
    var f = new JSEncrypt();
    f.setPublicKey(b);   // rsa进行加密
    return f.encrypt(e)
};

既然分析好了过程那么写成python代码如下:

import base64
from hashlib import md5
from Crypto.Cipher import PKCS1_v1_5
from Crypto.PublicKey import RSA

e = '登录密码' + ";" + password+";" + 验证码+";"+ 验证码+";"+ "%s" % loginPageType

public_key = """-----BEGIN PUBLIC KEY-----
{rsaPublicKey}  // 加密所用到的公钥
-----END PUBLIC KEY-----""".format(rsaPublicKey=rsaPublicKey)


rsakey = RSA.importKey(public_key)
cipher = PKCS1_v1_5.new(rsakey)
cipher_text =base64.b64encode(cipher.encrypt(e))
print cipher_text

以上过程为整个加密的获取,当然你也可以通过其他方法解决这类问题,笔者的方法不一定是最好的,随时欢迎讨论。

原创:任何转载需标明作者和来源,违者必究。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python - RSA加密 的相关文章

随机推荐

  • 视觉SLAM

    01 章国锋 xff1a 视觉SLAM最新观点分享 讲座视觉SLAM在AR应用上的关键性问题探讨 xff0c 内含PPT与答疑 直播回放 中国知网回放地址 http k cnki net CInfo Index 6370 B站回放地址 ht
  • python中zmq的基础三种模式

    ZMQ 的三个基本模型 ZMQ 提供了三个基本的通信模型 xff0c 分别是 Request Reply xff0c Publisher Subscriber xff0c Parallel Pipeline 请求应答模式 xff08 Req
  • AI安全01 人工智能的安全性

    前言 提问 xff1a GPT老师 xff0c 我想写一篇阅读量高一点的信息安全博文 xff0c 您可以推荐写作主题吗 xff1f GPT老师 xff1a 人工智能与信息安全 写在前面 xff1a 1 笔者相关知识存储很少 xff0c 这篇
  • 关于linux下进程和线程优先级的一些总结

    1 进程 1 1 基础 进程优先级值越小 xff0c 优先级越大 xff0c 进程的优先级是PRI值不是Nice值 xff0c 普通进程优先级可以通过Nice值调整 xff0c 实时进程不行 Linux的进程分普通进程 xff08 非实时进
  • 采用x11转发实现远程docker容器的图形化显示

    本地ubuntu主机 windows下有多种图形化工具可以用 xff0c 具体可参考wsl2图形化显示 1 主机安装x11 utils 2 xhost 43 进行授权 远程docker 1 安装ssh并修改 etc ssh sshd con
  • JavaScript类型

    为什么有的编程规范要求用 void 0 代替 undefined xff1f 字符串有最大长度吗 xff1f 0 1 43 0 2 不是等于 0 3 么 xff1f 为什么 JavaScript 里不是这样的 xff1f ES6 新加入的
  • ubuntu 内网搭建服务器的一些配置,完美解决https、http、curl、wget、yum 无法访问的问题

    1 一些需求可能要 继承IP 网关才能连接到外网 xff0c linux 不知道在如何配置可以来看看 http proxy 61 http 192 254 1 10 8088 ftp proxy 61 http 192 254 1 10 8
  • 堆、栈、队列、各种变量(静态、动态、全局、局部)的区别和联系

    堆栈都是一种数据项按序排列的数据结构 xff0c 只能在一端 称为栈顶 top 对数据项进行插入和删除 堆 heap 堆 xff08 操作系统 xff09 xff1a 一般由程序员分配释放 xff0c 若程序员不释放 xff0c 程序结束时
  • 论文中baseline是什么意思?

    问题1 xff1a benchmark和baseline的区别 xff1f 在计算机视觉论文中benchmark和baseline的区别 问题2 xff1a 经常在论文中看见baseline但是不明白里面是在写的什么 xff1f 其实就是你
  • linux 执行命令提示无权限排查思路

    问题描述 在root用户下su到普通用户出现权限问题 root 64 hehe su zh su warning cannot change directory to home zh Permission denied su failed
  • C#应用程序界面开发进阶——高级窗体控件(2)——列表视图控件(最后一个代码不行)

    列表视图 xff08 ListView xff09 控件是Windows列表视图控件 xff0c 用于显示带图标的项的列表 创建列表视图控件 为列表视图控件添加项有以下两种方法 xff08 1 xff09 直接单击控件上方的小箭头 xff0
  • ubuntu16.04LTS更换阿里源

    sudo gedit etc apt sources list 替换 xff1a 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 deb cdrom Ubuntu 16 04 LTS Xenial
  • Nginx 配置问题 server directive is not allowed here in /etc/nginx/nginx.conf:69

    前沿 今天在其他服务器上重新配置 nginx conf 文件 xff0c 配置结束启动 nginx 发现遇到了这样一个错误 xff0c 我擦 我配置文件都是从上个服务器上 复制粘贴过来的 xff0c 怎么会遇到这个问题呢 xff1f 百思不
  • labelImg ZeroDivisionError: float division by zero 问题定位和解决方案

    一 前沿 labelImg的使用和安装这里不过多讲解 xff0c 网上一堆教程 二 问题以及解决方案 2 1 问题如下 xff1a Traceback span class token punctuation span most recen
  • Linux系统下查看版本信息

    一 前沿 有时候回去查看Linux的版本信息和内核 xff0c 每次可能都需要百度一下 xff0c 今天记录一下 xff0c 方便以后自己看 二 查看Linux内核版本命令 2 1 第一种方式 显示正在运行的内核版本 1 cat proc
  • Centos7下安装 prometheus+grafana

    一 前言 1 什么是 Prometheus xff1f Prometheus是最初在SoundCloud上构建的开源系统监视和警报工具包 自2012年成立以来 xff0c 许多公司和组织都采用了Prometheus xff0c 该项目拥有非
  • Linux ssh:handshake failed:EOF

    一 前沿 1 Notes xff1a 以下操作均在 京东云服务器 2 在配置好免密登陆之后 xff0c 通过ssh登陆的时候间接性的遇见 ssh handshake failed EOF 真是让人恼火 xff0c 所以给总结一下 二 解决步
  • prometheus 文件配置小技巧优化

    一 前言 很久没看过监控 xff0c 直到公司机器越来越多 xff0c 项目越来越多 xff0c prometheus yml 文件一直在增加显得很杂乱无章 xff0c 这里优化了根据项目文件来改配置文件 二 优化 1 prometheus
  • prometheus通过process-exporter监控进程并实现企业报警

    一 前沿 通过上级篇文章我们已经对 Prometheus监控服务器基础资源做了记录 xff0c 这节课主要记录一下监控服务器上的进程 二 实现步骤 Prometheus机器IPprocess exporter机器IP192 168 1 31
  • python - RSA加密

    什么是RSA xff1f 这里粘贴一些定义 RSA公开密钥密码体制 所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥 xff0c 是一种 由已知加密密钥推导出解密密钥在计算上是不可行的 密码体制 在公开密钥密码体制中 xff0c 加密