爬蟲加密算法學習

任何加密都是針對的二進制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執行引擎

有一些參數很複雜,但是你可以嘗試不提交,就是提交 "",是有可能通過的



分享到:


相關文章: