任何加密都是針對的二進制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執行引擎
有一些參數很複雜,但是你可以嘗試不提交,就是提交 “”,是有可能通過的