将6位或者7位数字加密成22位数字字母大小写的加密方法。
采集数据时,遇到对Url进行加密的网站,大致加密情形如下
1.编译加密前的url
在列表页的url如下
2.加密后的Url
除了端口这块没了,还有就是其他地方也变了
3.仔细观察参数变化:
4.第一步先初略过一遍所有的Js文件,排除后确定加密文件为下图的jquery.lyh-1.1.0.js
5.第二步查看js作用,
emmmmm,看了下,还是放弃吧,看不懂。。。复制一段代码网上查看,看到博客 https://www.cnblogs.com/libo0125ok/p/7668026.html
前端实现部分代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试加密</title>
<script src="./files/jquery.min.js"></script>
<script src="./files/jquery.cookie.js"></script>
<script src="./files/jquery.hiSlider.js"></script>
<script src="aes.min.js"></script>
</head>
<body>
<script>
/**
* 加密(需要先加载lib/aes/aes.min.js文件)
* @param word
* @returns {*}
*/
function encrypt(word){
var key = CryptoJS.enc.Utf8.parse("qnbyzzwmdgghmcnm");
var srcs = CryptoJS.enc.Utf8.parse(word);
var encrypted = CryptoJS.AES. encrypt(srcs, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});//加密方法加密
console.log("加密结果揭晓阶段:");
console.log("解密结果:",encrypted.toString().slice(0,22));
alert(encrypted.toString().slice(0,22));
return encrypted.toString(); //返回加密结果
}
/**
* 解密
* @param word
* @returns {*}
*/
function decrypt(word){
var key = CryptoJS.enc.Utf8.parse("abcdefgabcdefg12");
var decrypt = CryptoJS.AES.decrypt(word, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
return CryptoJS.enc.Utf8.stringify(decrypt).toString();
}
</script>
<input type="button" onclick="encrypt(3187083)" value="点击测试加密效果">
</body>
</html>
结果
发现加密出的数据和我们要的很像,emmmm,就是一样的,抱歉我提前用了加密参数了。。。
确定了网站对数据的加密方式就是Aes,那么接下来就是借助Python复写实现解密了。
但是前提是我们找到了这个加密参数,就是参数key
6.第三步:js打断点
一直调的话就会出现参数
7.Python代码实现
# -*- coding: UTF-8 -*-
'''
@Author :Jason
'''
from Crypto.Cipher import AES
import base64
import re
class Decrypt(object):
def process_num_url(self,partUrl):
while len(partUrl) % 16 != 0:#while
partUrl += (16-len(partUrl) % 16) * chr(16-len(partUrl)%16)
return str.encode(partUrl)
def encrypt_num_url(self,partUrl,key):
aes = AES.new(str.encode(key), AES.MODE_ECB)
encrypted_partUrl = str(base64.encodebytes(aes.encrypt(self.process_num_url(partUrl))), encoding='utf8').replace('\n', '') # 加密
process_encrypted_partUrl = encrypted_partUrl.replace('/', "^")
return process_encrypted_partUrl[:-2]
def get_partUrl(self,url):
need_url = re.findall(r'/(\d+)\.jhtml',url)
if need_url:
return need_url[0]
else:
return ""
def encrypt_fullUrl(self,partUrl,url,encryptedpartUrl):
return url.replace(str(partUrl),str(encryptedpartUrl))
def main(self,url,key):
partUrl = self.get_partUrl(url=url)
encryptedpartUrl = self.encrypt_num_url(partUrl,key)
encryptedfullUrl = self.encrypt_fullUrl(partUrl,url,encryptedpartUrl)
print(encryptedfullUrl)
if __name__ == "__main__":
url = "http://ggzyjy.shandong.gov.cn:80/jsgczbgg/3186567.jhtml?type=1" # 原始链接
key = "qnbyzzwmdgghmcnm" # 加密参数
decrypt = Decrypt()
decrypt.main(url,key)
解决:
参考
https://blog.csdn.net/hh775313602/article/details/78991340
https://www.cnblogs.com/libo0125ok/p/7668026.
html https://blog.csdn.net/qq_43500579/article/details/97615479