逆向案例14——cnki学术翻译AES加密分析,涉及保持会话和获取token值

news2024/11/15 13:39:54

python代码:

import execjs
import requests
UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
token_url = "https://dict.cnki.net/fyzs-front-api/getToken"
url = 'https://dict.cnki.net/fyzs-front-api/translate/literaltranslation'
session = requests.session()
def get_token():
    headers = {
        'User-Agent': UA,
    }
    response = session.get(url=token_url,headers=headers).json()
    token = response['data']
    return token
def get_encrypted_words(words):
    js_code = execjs.compile(open('demo.js','r',encoding='utf-8').read())
    encrypted_words = js_code.call('s',words)
    return encrypted_words

def get_translated_words(token,encrypted_words):
    headers = {
        'User-Agent': UA,
        'Token':token,
    }
    data = {
        'translateType': "0",
        'words': encrypted_words,
    }
    response = session.post(url=url,json=data,headers=headers)
    result = response.json()['data']['mResult']
    return result

if __name__ == '__main__':
    words = input('请输入你要翻译的句子:')
    token = get_token()
    encrypted_words = get_encrypted_words(words)
    translated_words = get_translated_words(token,encrypted_words)
    print('翻译结果为:',translated_words)

js代码:

const CryptoJS = require('crypto-js');
n = "4e87183cfd3a45fe"

function s(t) {
    var e = {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    }
        , i = CryptoJS.enc.Utf8.parse(n)
        , s = CryptoJS.AES.encrypt(t, i, e)
        , r = s.toString().replace(/\//g, "_");
    return r = r.replace(/\+/g, "-"),
        r
}

结果展示:

 

首先抓包,发现翻译请求为post请求且有翻译的内容加密。

 

先请求获取数据,发现请求头不加token是获取不到数据的,获取token要专门去访问一个网址获得,且为了保持请求翻译时登陆状态一致,需要用session发送请求。

 

如何定位 words的加密位置呢,两种方法,一搜索translateType关键字,在去打断点定位。

二是因为这是xhr请求,因此可以xhr断点请求。释放xhr断点,接着在这里打断点,点击翻译。在右侧可以找到加密的words值

 

接着往上跟栈,找没有被加密的地方。最后发现在这里

 

释放其他断点,点击翻译,在这里打上断点

在控制台打开,发现由h.encrypto函数加密,进入它 ,即函数s(t)

 

 

释放其他断点,在return处打上断点,点击翻译。

 

发现a是一个标准AES加密算法,复制代码,复制n,在js中调用专门的库,替换a

注意:获取token的网址我也不知道咋来的,看别人的代码。

写代码遇到的错误:{"timestamp":"2024-04-07T20:03:35.755+0800","status":415,"error":"Unsupported Media Type","message":"Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported","path":"/fyzs-front-api/translate

这个错误表明服务器不支持请求中指定的媒体类型。具体地说,服务器不支持 'application/x-www-form-urlencoded;charset=UTF-8' 这种媒体类型。
要解决这个问题,您可以尝试使用其他媒体类型发送请求,例如 'application/json'。您需要确保将请求的数据转换为 JSON 格式,并使用适当的请求头来指定媒体类型为 JSON。
teraltranslation"}

思考:以后遇到请求头需要token值,去哪里找到token值呢?

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1575401.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

测试工程师求职是选自研公司还是选外包公司呢?

大家好, 今天我们一起来聊一聊测试工程师求职是选自研公司&还是选外包公司呢? 今天来谈谈我的个人看法,作为一个在测试岗位上多年的我来说,自研公司比较好,外包公司其实也不会差。各自都有特点特色,根据…

能否安全地删除 Mac 资源库中的文件?

在管理Mac电脑存储空间时,用户确实可能考虑对资源库(Library)文件夹进行清理以释放空间。Mac资源库是一个系统及应用程序存放重要支持文件的地方,其中包括但不限于配置文件、临时文件、缓存、插件、偏好设置、应用程序支持数据等。…

Django路由配置

简单说一下django路由配置,发现很多同学出错。 首先,先创建自己的app文件(用 python manage.py startapp myApp来创建自己的app) 这个是自己 在Django的配置文件setting.py添加自己的项目文件myapp ok,此时就可以添加路…

JavaWeb后端——Mybatis

概述 Mybatis:Java程序来对数据库进行操作,一款优秀的持久层框架,用于简化JDBC的开发 SSM:SpringMVC、Spring、Mybatis 快速入门 步骤2:注意数据库连接的四要素 application.properties:springboot 的默…

百度富文本编辑器配置(vue3)

今天分享一下我做的项目里面的一个百度富文本的配置问题,安装配置流程以及如何解决的 1.首先是安装组件 # vue-ueditor-wrap v3 仅支持 Vue 3 npm i vue-ueditor-wrap3.x -S # or yarn add vue-ueditor-wrap3.x 2. 下载 UEditor UEditor 并不支持通过 npm 的方式…

mid格式是什么文件?怎么把mid转换成MP3?

MID(Musical Instrument Digital Interface)文件格式可以追溯到20世纪80年代,当时音频技术正在蓬勃发展。为了促进不同音乐设备之间的数据交流,MID格式应运而生。其初衷是作为一种标准的音乐数据传输协议,使得各类乐器…

C之结构体初始化10种写法总结(九十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

【NLP】关于BERT模型的一些认知

BERT(Bidirectional Encoder Representations from Transformers)模型是由Google在2018年提出的预训练Transformer模型,用于自然语言处理任务。 一. BERT模型的架构 1.1 输入表示 / Encoder模块 BERT中的Encoder模块是由三种Embedding&…

初识C++ · 类和对象(上)

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 4.1 访问限定符 4.2 封装 5.类的作用域 6.类的实例化 7.类的对象大小的计算 8.类成员函数的this指针 1.面向过程和面向对象初步认识 C语言是一门面向过程的语言,注重的…

ASP.Net添加Swagger注释

文章目录 Swagger添加Swagger注释 Swagger 添加Swagger注释 1、右击项目->选择属性->点击生成->输出,选中文档文件 2、配置服务 在program.cs 文件里配置SwaggerUI //增加项一 builder.Services.AddSwaggerGen(c> {c.SwaggerDoc("v1", ne…

pytorch 演示 tensor并行

pytorch 演示 tensor并行 一.原理二.实现代码 本文演示了tensor并行的原理。如何将二个mlp切分到多张GPU上分别计算自己的分块,最后做一次reduce。 1.为了避免中间数据产生集合通信,A矩阵只能列切分,只计算全部batch*seqlen的部分feature 2.因为上面的步骤每张GPU只有部分featu…

Leetcode刷题-哈希表详细总结(Java)

哈希表 当我们想使⽤哈希法来解决问题的时候,我们⼀般会选择如下三种数据结构。 数组set (集合)map(映射) 当我们遇到了要快速判断⼀个元素是否出现集合⾥的时候,就要考虑哈希法。如果在做⾯试题⽬的时候…

搭建好WordPress网站后的基本操作流程

考虑到很多朋友是第一次使用WordPress,这里给大家分享一下基本的WordPress操作流程,你可以跟着实际情况决定操作步骤。 1.设置网站SSL安全证书。 我采用的是Hostease家的Linux主机产品,自带免费SSL证书 。支持一键安装wordpress程序。 2.进…

智慧驿站式的“智慧公厕”,给城市新基建带来新变化

随着智慧城市建设的推进,智慧驿站作为一种多功能城市部件,正逐渐在城市中崭露头角。这些智慧驿站集合了智慧公厕的管理功能,为城市的新基建带来了全新的变革。本文以智慧驿站智慧公厕源头实力厂家广州中期科技有限公司,大量精品案…

MyBatis操作数据库(1)

前言 在应用分层的学习时, 我们了解到web应用程序一般分为三层,即Controller, Service, Dao. 之前的案例中, 请求流程如下: 浏览器发起请求, 先请求Controller, Controller接受到请求后,调用Service进行业务逻辑处理, Service再调用Dao, 但是Dao层的数据是Mock的, 真实的数据…

基于 Vue3 + Webpack5 + Element Plus Table 二次构建表格组件

基于 Vue3 Webpack5 Element Plus Table 二次构建表格组件 文章目录 基于 Vue3 Webpack5 Element Plus Table 二次构建表格组件一、组件特点二、安装三、快速启动四、单元格渲染配置说明五、源码下载地址 基于 Vue3 Webpack5 Element Plus Table 二次构建表格组件&#x…

【白菜基础】蛋白组学之生信分析(1)

刚换了一个新课题组,新老板的研究方向为蛋白组学,从未接触过蛋白组学的我准备找一组模拟数据进行生信分析的入门学习。 蛋白组学数据挖掘流程图,参考公众号:蛋白质组学数据挖掘思路解析 (qq.com) 一、认识数据 我们组的数据主要…

【高校科研前沿】中国科学院南京地理与湖泊研究所肖启涛博士为一作在Sci. Bull发文:我国湖泊二氧化碳从大气的源向汇转变

目录 1.文章简介 2.研究内容 3.文章引用 1.文章简介 论文名称:Lakes shifted from a carbon dioxide source to a sink over past two decades in China 第一作者及通讯作者:肖启涛(博士生),段洪涛(研究…

【已解决】HalconDotNet.HOperatorException:“HALCON error #1201: Wrong type of control

前言 最近在学习Halcon视觉和C#的联合开发,碰到一个比较有意思的问题记录一下,大致的报错信息是说我用的halcondotnet版本和我在halcon导出的使用的halcondotnet.dll版本不一致,所以才报错的! 解决 首先你得找到你安装halcon的…

接口自动化入门:Jmeter的多组数据测试、JDBC驱动及数据断言!

在进行接口测试时,我们经常需要对接口进行多组数据测试,以验证接口在不同输入条件下的表现。同时,我们也需要对接口返回的数据进行断言,以确保接口返回的数据符合预期结果。JMeter正是一个强大的工具,可以帮助我们实现…