热门标签 | 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 中提供的不可变集合(如 `Collections.unmodifiableXXX`)和同步集合(如 `Collections.synchronizedXXX`)的实现原理及使用方法,帮助开发者更好地理解和应用这些工具。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 本文探讨了如何在Classic ASP中实现与PHP的hash_hmac('SHA256', $message, pack('H*', $secret))函数等效的哈希生成方法。通过分析不同实现方式及其产生的差异,提供了一种使用Microsoft .NET Framework的解决方案。 ... [详细]
  • 本文将详细介绍如何在没有显示器的情况下,使用Raspberry Pi Imager为树莓派4B安装操作系统,并进行基本配置,包括设置SSH、WiFi连接以及更新软件源。 ... [详细]
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
  • 本文探讨了在C++中如何有效地清空输入缓冲区,确保程序只处理最近的输入并丢弃多余的输入。我们将介绍一种不阻塞的方法,并提供一个具体的实现方案。 ... [详细]
  • 对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ... [详细]
  • 深入解析for与foreach遍历集合时的性能差异
    本文将详细探讨for循环和foreach(迭代器)在遍历集合时的性能差异,并通过实际代码示例和源码分析,帮助读者理解这两种遍历方式的不同之处。文章内容丰富且专业,旨在为编程爱好者提供有价值的参考。 ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本文介绍了如何使用JavaScript的Fetch API与Express服务器进行交互,涵盖了GET、POST、PUT和DELETE请求的实现,并展示了如何处理JSON响应。 ... [详细]
  • PHP 实现多级树形结构:构建无限层级分类系统
    在众多管理系统中,如菜单、分类和部门等模块,通常需要处理层级结构。为了高效管理和展示这些层级数据,本文将介绍如何使用 PHP 实现多级树形结构,并提供代码示例以帮助开发者轻松实现无限分级。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 近期我们开发了一款包含天气预报功能的万年历应用,为了满足这一需求,团队花费数日时间精心打造并测试了一个稳定可靠的天气API接口,现正式对外开放。 ... [详细]
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社区 版权所有