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

基于Base64编码的反爬虫

1.Base64的用法#base64的用法importbase64encodestrbase64.b64encode(abcr34r344r.encode(utf-8))pr
1. Base64的用法

# base64的用法
import base64encodestr = base64.b64encode('abcr34r344r'.encode('utf-8'))
print(encodestr) # b'YWJjcjM0cjM0NHI='encodestr = base64.b64encode('abcr34r344r'.encode('utf-8'))
print(str(encodestr, 'utf-8')) # YWJjcjM0cjM0NHI=

以“==”或者“=”结尾的加密字符串,往往就是经过Base64加密得来的。如下代码:

from base64 import b64decodecode = ['d3d3Lmh1YXdlaS5jb20=', 'd3d3Lmp1ZWppbi5pbQ==']
for c in code:string = b64decode(c).decode('utf8')print(string)

执行结果如下:

www.huawei.com
www.juejin.im

基于Base64实现新的编码规则

Base64编码和解码时都是将原本的8位二进制转成6位的二进制数,如果我们改动位数,将其设置为5位或者4位,就可以实现新的编码规则。代码如下:

class Custom64:comparison = {'0': 'A', '1': 'B', '2': 'C', '3': 'D', '4': 'E','5': 'F', '6': 'G', '7': 'H', '8': 'I', '9': 'J','10': 'K', '11': 'L', '12': 'M', '13': 'N', '14': 'O','15': 'P', '16': 'Q', '17': 'R', '18': 'S', '19': 'T','20': 'U', '21': 'V', '22': 'W', '23': 'X', '24': 'Y','25': 'Z', '26': 'a', '27': 'b', '28': 'c', '29': 'd','30': 'e', '31': 'f', '32': 'g', '33': 'h', '34': 'i','35': 'j', '36': 'k', '37': 'l', '38': 'm', '39': 'n','40': 'o', '41': 'p', '42': 'q', '43': 'r', '44': 's','45': 't', '46': 'u', '47': 'v', '48': 'w', '49': 'x','50': 'y', '51': 'z', '52': '0', '53': '1', '54': '2','55': '3', '56': '4', '57': '5', '58': '6', '59': '7','60': '8', '61': '9', '62': '+', '63': '/', '65': '=',}def encode(self, value: str, threshold: int = 4) -> str:# 对传入的字符进行编码,并返回编码结果value = ''.join(['0' + bin(ord(t))[2:] for t in value])inputs = self.shift(value, threshold)result = ''for i in inputs:if i == '0' * threshold:# 全为0则视为补位encoding = 65else:encoding = 0for key, v in enumerate(i):# 二进制数按权相加得到十进制数val = int(v) * pow(2, len(i) - 1 - key)encoding += val# 从对照表中取值after = self.comparison.get(str(encoding))result += afterreturn resultdef decode(self, value: str, threshold: int, group: int = 8) -> str:"""对传入的字符串解码,得到原字符"""result = []coder = self.str2binary(value, threshold=threshold)bins = self.shift(''.join(coder), group)for i in range(len(bins)):binary = ''.join(bins)[i * group: (i + 1) * group]if binary != '0' * group:# 如果全为0则视为补位,无需处理result.append(''.join([chr(i) for i in [int(b, 2) for b in binary.split(' ')]]))return ''.join(result)def str2binary(self, value: str, threshold: int = 6) -> list:"""字符串转十进制再转二进制"""result = []values = self.str2decimal(value)for i in values:# 判断是否为补位if i == '65':val = '0' * thresholdelse:val = '{:0{threshold}b}'.format(int(i), threshold=threshold)result.append(val)return result@staticmethoddef shift(value: str, threshold: int, group: int = 24) -> list:"""位数转换"""remainder = len(value) % groupif remainder:# 如果有余数,则说明需要用0补位padding = '0' * (group - remainder)value += padding# 按照threshold值切割字符result = [value[i:i + threshold] for i in range(0, len(value), threshold)]return resultdef str2decimal(self, value: str) -> list:"""使用Base64编码表做对照,取出字符串对应的十进制数"""keys = []for t in value:for k, v in self.comparison.items():if v == t:keys.append(k)return keysif __name__ == '__main__':# threshold 的值建议为 4/5/6cus = Custom64()encode_res = cus.encode('async', threshold=5)decode_res = cus.decode(encode_res, threshold=5)print(encode_res)print(decode_res)

执行结果如下:

MFZXSbTD=A
async

注意:threshold的值可以设置成4,5,6等。

encode_res = cus.encode('async', threshold=6)
decode_res = cus.decode(encode_res, threshold=6)


推荐阅读
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 深入了解 Windows 窗体中的 SplitContainer 控件
    SplitContainer 控件是 Windows 窗体中的一种复合控件,由两个可调整大小的面板和一个可移动的拆分条组成。本文将详细介绍其功能、属性以及如何通过编程方式创建复杂的用户界面。 ... [详细]
  • Java 实现二维极点算法
    本文介绍了一种使用 Java 编程语言实现的二维极点算法。该算法用于从一组二维坐标中筛选出极点,适用于需要处理几何图形和空间数据的应用场景。文章不仅详细解释了算法的工作原理,还提供了完整的代码示例。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 尽管使用TensorFlow和PyTorch等成熟框架可以显著降低实现递归神经网络(RNN)的门槛,但对于初学者来说,理解其底层原理至关重要。本文将引导您使用NumPy从头构建一个用于自然语言处理(NLP)的RNN模型。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ... [详细]
author-avatar
望尽天涯
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有