爬虫加密算法学习

任何加密都是针对的二进制bytes: b’\xB3\X3B’

URL encode/decode

URL编码解码:

用于url的参数提交

中文、特殊字符 转换为 %B3%3B%53。。。。。。

from urllib import parse

s = ‘测试url编码=%@#$%^&*()’

# 默认编码为UTF-8

s1 = parse.quote(s) # 编码

print(s1)

s2 = parse.unquote(s1) # 解码

print(s2)

# 对一个的js,是 URLEncode()

base64:

base64是网络上最常见的用于传输8Bit字节码的编码方式之一,

Base64就是一种基于64个可打印字符来表示二进制数据的方法,用于在HTTP环境下传递较长的标识信息

后一两位可能有“=”

防君子不防小人,很容易解密

输出为 A-Z、a-z、0-9和”+”、”/” 字符组成的字符串

很多时候字符串尾部为 1个或2个 “=”

把3个字节的二进制拼接, 24位, 按6位分割,变成4个字节,每个字节小于64

最后留下1个字节的时候,会在尾部添加 2个 ‘=’

最后留下2个字节的时候,会在尾部添加 1个 ‘=’

import base64

s = ‘测试base12’

# 会按57个字节的长度为间隔 加入 \n

s1 = base64.encodebytes(s.encode())

print(s1)

s3 = base64.decodebytes(s1).decode()

print(s3)

# 最常用的base64 加密,可以自定义替换 + 和 /

s2 = base64.b64encode(s.encode())

print(s2)

s4 = base64.b64decode(s2).decode()

print(s4)

# 标准base64加密,等同于不带额外参数的 b64encode

s5 = base64.standard_b64encode(s.encode())

print(s5)

s6 = base64.standard_b64decode(s5)

print(s6.decode())

# url安全的,会把 + 替换为 – , 把 / 替换为 _

# 等同于 base64.b64encode(s.encode(), b’-_’) base64.b64decode(s2, b’-_’)

s7 = base64.urlsafe_b64encode(s.encode())

print(s7)

s8 = base64.urlsafe_b64decode(s7)

print(s8.decode())

MD5

MD5:

Message-Digest Algorithm 5(摘要算法5)

1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。

2、容易计算:从原数据计算出MD5值很容易。

3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。

4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

输出为 128 bit, 每4位二进制组合一个十六进制字符,一般输出为 长度 32 个16进制字符串

import hashlib

s = ‘this is a md5 test.’

m = hashlib.md5()

m.update(s.encode())

print(m.hexdigest())

# 一般的简便写法

print(hashlib.md5(s.encode()).hexdigest())

DES

DES:

全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法

入口参数有三个:Key、Data、Mode

Key为7个字节共56位,是DES算法的工作密钥;

Data为8个字节64位,是要被加密或被解密的数据;

Mode为DES的工作方式,有两种:加密或解密

3DES(即Triple DES)是DES向AES过渡的加密算法,

使用两个密钥,执行三次DES算法,

加密的过程是加密-解密-加密

解密的过程是解密-加密-解密

pycrypto安装指南:帮助文档(https://www.dlitz.net/software/pycrypto/api/current/)

要先安装VC2015:microsoft visual studio 2015(14)

1、http://blog.csdn.net/a624806998/article/details/78596543

在执行 python setup.py install 之前,运行

set CL=/FI”%VCINSTALLDIR%\\INCLUDE\\stdint.h” %CL%

2、出现ImportError: No module named ‘winrandom’错误

处理:修改python3安装目录下的 lib/Crypto/Random/OSRNG/nt.py 文件中找到

import winrandom

修改为

from Crypto.Random.OSRNG import winrandom

# DES 加密

from Crypto.Cipher import DES

from Crypto.Util import Counter

from Crypto import Random

import binascii

key = ‘-8B key-‘ # 长度为8

msg = ‘We are no longer the knights who say ni!’

nonce = Random.new().read(int(DES.block_size/2))

def des_encrypt(key, msg):

ctr = Counter.new(int(DES.block_size*8/2), prefix=nonce)

cipher = DES.new(key, DES.MODE_CTR, counter=ctr)

msg = nonce + cipher.encrypt(msg)

msg = binascii.b2a_hex(msg)

return msg.decode()

print(des_encrypt(key.encode(), msg.encode()))

# 3DES 加密

from Crypto.Cipher import DES3

from Crypto import Random

import binascii

key = ‘Sixteen byte key’

msg = ‘sona si latine loqueris ‘

iv = Random.new().read(DES3.block_size)

print(iv)

def des3_encrypt(key, msg):

cipher = DES3.new(key, DES3.MODE_OFB, iv)

msg = iv + cipher.encrypt(msg)

msg = binascii.b2a_hex(msg)

return msg.decode()

s = des3_encrypt(key.encode(), msg.encode())

print(s)

AES

AES:

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),这个标准用来替代原先的DES

AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特 (16、24和32字节)

大致步骤如下:

1、密钥扩展(KeyExpansion),

2、初始轮(Initial Round),

3、重复轮(Rounds),每一轮又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey,

4、最终轮(Final Round),最终轮没有MixColumns。

from Crypto.Cipher import AES

from Crypto import Random

import binascii

# 加密

key = b’Sixteen byte key’

msg = b’Attack at dawn’

iv = Random.new().read(AES.block_size) # 16字节长度

cipher = AES.new(key, AES.MODE_CFB, iv)

msg = iv + cipher.encrypt(msg)

print(binascii.b2a_hex(msg))

# 解密

cipher = AES.new(key, AES.MODE_CFB, iv)

msg1 = cipher.decrypt(msg)

print(msg1[16:])

RSA

RSA:

公钥加密算法,一种非对称密码算法

公钥加密,私钥解密

3个参数:

rsa_n, rsa_e,message

rsa_n, rsa_e 用于生成公钥

message: 需要加密的消息

import rsa

import binascii

def rsa_encrypt(rsa_n, rsa_e, message):

key = rsa.PublicKey(rsa_n, rsa_e) # 创建公钥

message = rsa.encrypt(message, key) # 加密

message = binascii.b2a_hex(message) # 将加密信息转换为16进制

return message.decode()

pubkey=’EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443′

print(“pubkey length:%s” % len(pubkey))

rsa_n = int(pubkey, 16)

rsa_e = int(‘10001’, 16) # js里面一般是 parseInt(‘10001’, 16)

s = ‘需要加密的字符串’

print(rsa_encrypt(rsa_n, rsa_e, s.encode()))

print(len(rsa_encrypt(rsa_n, rsa_e, s.encode())))

还要很多网站有自定义的加密算法,不是通用的算法,处理方式:

1、破解js,写对应的python算法。优点:执行快,缺点:复杂,难度高,有可能随时需要更新

2、selenium 进行浏览器模拟

3、pyV8,下载这个JS,用pyV8调用这个js的方法

4、PyExecJS,这也是一个JS执行引擎

有一些参数很复杂,但是你可以尝试不提交,就是提交 “”,是有可能通过的

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注