热门标签 | 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)


推荐阅读
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • 学习Java异常处理之throws之抛出并捕获异常(9)
    任务描述本关任务:在main方法之外创建任意一个方法接收给定的两个字符串,把第二个字符串的长度减1生成一个整数值,输出第一个字符串长度是 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
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社区 版权所有