目錄
目前成都創(chuàng)新互聯(lián)已為成百上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計、陸港網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。一、MD5
二、URLEncode 和 Base64
1、URLEncode
2、Base64
三、對稱加密
1、AES 加密
2、DES加密
四、非對稱加密
1.RSA
from hashlib import md5
# MD5是一個大的hash算法. 不是加密. 不存在解密邏輯
# hash 算法是不可逆的
salt = b"suibianjiashenmesalt"
# 加密器
obj = md5(salt)
# 準(zhǔn)備好明文
massage = 'DK_COOl'
obj.update(massage.encode('utf-8')) # 需要將字符串編碼成字節(jié)
# 獲取密文
ct_x = obj.hexdigest()
print(ct_x) # 02350223f1dfe2ed625329c51c9cd26f, salt ->8878d4fd97a85c434cc8ffeb70b658b9
注意:創(chuàng)建加密器時,加入 salt,可以使密文不那么容易被撞庫。
MD5可以完成文件的校驗(yàn)。
擴(kuò)展:sha256
不論是sha1,sha256,md5都屬于摘要算法,都是在計算 hash 值. 只是散列的程度不同而已。這種算法有一個特性,他們是散列,不是加密。而且,由于 hash 算法是不可逆的,所以不存在解密的邏輯。
我們在訪問一個url的時候總能看到這樣一種URL:
/file/tupian/20221205/union.jpg?
q=execjs%2E%5Fexceptions%2EProcessExitedWithNonZeroStatus%3A+%281%2C+%27%27%2C+%27%5Bstdin%5D%3A1%5Cn%28function%28program%2C+execJS%29+%7B+execJS%28program%29+%7D%29%28function%28%29+%7B+function%28t%29+%7B%5Cn&rsv_ct=2&rsv_cst=1
此時會發(fā)現(xiàn),在瀏覽器上明明是能看到中文的.但是一旦復(fù)制出來.或者在抓包工具里看到的.都是這種%.那么這個%是什么鬼?也是加密么?
非也,其實(shí)我們在訪問一個ur的時候.瀏覽器會自動的進(jìn)行urlencode操作.會對我們請求的ur進(jìn)行編碼.這種編碼規(guī)則被稱為百分號編碼,是專門為url(統(tǒng)一資源定位符)準(zhǔn)備的一套編碼規(guī)則.
其實(shí)里面的規(guī)則非常簡單.就是把ur中的參數(shù)部分轉(zhuǎn)化成字節(jié)。每字節(jié)的再轉(zhuǎn)化成1個16進(jìn)制的數(shù)字.前面補(bǔ)%。
看著很復(fù)雜在python里直接一步到位
from urllib.parse import urlencode, unquote
# url 的 編碼
base_url = 'https://www.baidu.com/s?'
param_dic = {
"wd": "我餓了"
}
# wd=%E6%88%91%E9%A5%BF%E4%BA%86
result = urlencode(param_dic)
print(result)
url = base_url + result
print(url)
# 解碼
url_1 = 'https://www.baidu.com/s?wd=%E6%88%91%E9%A5%BF%E4%BA%86'
print(unquote(url_1)) # 查看url 中的特殊符號以及中文信息
2、Base64Base64其實(shí)很容易理解。通常被加密后的內(nèi)容是字節(jié),而我們的密文是用來傳輸?shù)?不傳輸誰加密啊)。但是,在http協(xié)議里想要傳輸字節(jié)是很麻煩的一個事兒.相對應(yīng)的,如果傳遞的是字符串就好控制的多.此時base64就應(yīng)運(yùn)而生了.26個大寫字母+26個小寫字母+10個數(shù)字+2個特殊符號(+和/)小組成了一組類似64進(jìn)制的計算邏輯.這就是base64了.
import base64
bs = "我要吃飯,我餓fadksljfkljaskl呵啊噠。吃了么呵啊噠了".encode('utf-8')
# 編碼
# base64主要是處理字節(jié)的
print(bs)
# 把字節(jié) 按照 base64的規(guī)則.進(jìn)行編碼。編碼成base64的字符串形式
# b64的字節(jié) #b64的字符串
s = base64.b64encode(bs).decode("utf-8")
print(s)
# 解碼
s = '5oiR6KaB5ZCD6aWt77yM5oiR6aW/ZmFka3NsamZrbGphc2ts5ZG15ZWK5ZOS44CC5ZCD5LqG5LmI5ZG15ZWK5ZOS5LqG'
bs = base64.b64decode(s)
source_s = bs.decode('utf-8')
print(source_s) # 我要吃飯,我餓fadksljfkljaskl呵啊噠。吃了么呵啊噠了
所謂對稱加密就是加密和解密用的是同一個秘鑰.就好比我要給你郵寄一個箱子.上面懟上鎖.提前我把鑰匙給了你一把,我一把。那么我在郵寄之前就可以把箱子鎖上然后快遞到你那里.你用相同的鑰匙就可以打開這個箱子。
條件: 加密和解密用的是同一個秘鑰.那么兩邊就必須同時擁有鑰匙才可以。
常見的對稱加密:AES,DES,3DES.我們這里討論AES和DES
1、AES 加密import base64
from Crypto.Cipher import AES
s = '這是我要加密的明文'
"""
key ->16, 24, 32
It must be 16, 24 or 32 bytes long (respectively for *AES-128*,
*AES-192* or *AES-256*).
"""
key = b'dkdkcooldkdkcool'
aes = AES.new(key, mode=AES.MODE_CBC, IV=b'0102030405060708')
# ValueError: Data must be padded to 16 byte boundary in CBC mode
# 需要做填充
# 填充最好的方案(通用):缺少字節(jié)的個數(shù) * chr(缺少字節(jié)的個數(shù))
bs = s.encode('utf-8')
que = 16 - len(bs) % 16 # 缺少字節(jié)的個數(shù)
bs += (que * chr(que)).encode('utf-8')
# 加密
result = aes.encrypt(bs) # 要求加密的內(nèi)容必須是字節(jié)
# 可以選擇編碼成 base64
# jL5CgtiUFlRJ1Oi/IGXutF9WLfAeRynlUOexzETGRT8=
b64 = base64.b64encode(result).decode()
print(b64)
# 如果aes對象 經(jīng)過了加密。 就不能再解密了,必須重新寫
miwen = "jL5CgtiUFlRJ1Oi/IGXutF9WLfAeRynlUOexzETGRT8="
aes1 = AES.new(key, mode=AES.MODE_CBC, IV=b'0102030405060708')
# 處理base64
miwen = base64.b64decode(miwen)
result = aes1.decrypt(miwen)
print(result.decode('utf-8').replace('', ""))
2、DES加密跟 AES加密的實(shí)現(xiàn)方式 很像!
from Crypto.Cipher import DES
s = "我愛熱巴"
key = b'dkdkcool'
des = DES.new(key, mode=DES.MODE_CBC, IV=b'01020304')
# 加密
bs = s.encode("utf-8")
que = 8 - len(bs) % 8 # 缺少字節(jié)的個數(shù)
bs += (que * chr(que)).encode('utf-8')
result = des.encrypt(bs)
print(result)
# 解密
miwen = b'\xc2[\xa5/u,\t \x95\xe0{Z\x8e\xc4?\xb7'
des1 = DES.new(key, mode=DES.MODE_CBC, IV=b'01020304')
result = des1.decrypt(miwen)
print(result.decode('utf-8').replace("", ""))
非對稱加密:加密和解密的秘鑰不是同一個秘鑰。這里需要兩把鑰匙:一個公鑰,一個私鑰。公鑰發(fā)送給客戶端.發(fā)送端用公鑰對數(shù)據(jù)進(jìn)行加密.再發(fā)送給接收端,接收端使用私鑰來對數(shù)據(jù)解密.由于私鑰只存放在接受端這邊。所以即使數(shù)據(jù)被截獲了.也是無法進(jìn)行解密的.
常見的非對稱加密算法: RSA,DSA等等,我們就介紹一個.RSA加密,也是最常見的一種加密方案。
# ***************************************************************
# 1.生成私鑰和公鑰
import base64
from Crypto.PublicKey import RSA # 管理秘鑰的
rsa_key = RSA.generate(2048)
private_key = rsa_key.exportKey()
public_key = rsa_key.publickey().exportKey()
print(public_key)
with open("rsa_public_pem.txt", mode="wb") as f:
f.write(public_key)
with open("rsa_private_pem.txt", mode="wb") as f:
f.write(private_key)
# ***************************************************************
# 2. 加密
from Crypto.Cipher import PKCS1_v1_5 # 加密
from Crypto.PublicKey import RSA
import base64
# 2.1 準(zhǔn)備明文
massage = '今天晚上沒吃飯'
# 2.2 讀取公鑰
f = open('rsa_public_pem.txt', mode='r', encoding='utf-8')
# 2.3 把公鑰字符串轉(zhuǎn)化成 rsa_key (object)
rsa_key = RSA.import_key(f.read())
# 2.4 創(chuàng)建加密對象
rsa = PKCS1_v1_5.new(rsa_key)
# 2.5 加密
miwen = rsa.encrypt(massage.encode('utf-8'))
# 2.6 b64處理
miwen = base64.b64encode(miwen).decode('utf-8')
print(miwen)
# ***************************************************************
# 3. 解密
from Crypto.Cipher import PKCS1_v1_5
import base64
from Crypto.PublicKey import RSA
# 3.1 準(zhǔn)備密文
ctx = 'UqkvnZf8Gd5F1dGxi/9+Nq7lBe1OKk1Kpbn0so0UIZivY3zFqH/UOEjau0/to4gOhtOZ0SNJ0CiKD3kIHqlNE07bY/eT15oqNj8qwMLZfGuUYcqnSDCqUi4qad1sZUlg9qrXHT2Ypr2VhZM2RT+6Fb4mUWb1M7RlTLfJUGkId1ixP7xZFeY7qf10eElrckW5dxX5EV6BZ2xRFxKizJV0DrgsPH44Ixn1cipokqFJGVBR2PnwY0Dwoy+Fcr/SjQe0tIxmRKVr2cU7eMjrsZFGBAYHEWujqfwNhWBgeoOmC9nJJS+GaIYKuCECXoQV1nRd9o/2JM2DvxzQi0zlVCYbBQ=='
# 3.2 讀取私鑰
f = open('rsa_private_pem.txt', mode='r', encoding='utf-8')
# 3.3 生成密鑰對象
rsa_key = RSA.import_key(f.read())
# 3.4 生成解密對象
rsa = PKCS1_v1_5.new(rsa_key)
# 3.5 處理bs64,以及解密
mingwen_bytes = rsa.decrypt(base64.b64decode(ctx), None)
# 3.6 utf-8 處理
mingwen = mingwen_bytes.decode('utf-8')
print(mingwen)
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
文章名稱:爬蟲中常用的加密邏輯(python實(shí)現(xiàn))-創(chuàng)新互聯(lián)
文章出自:http://jinyejixie.com/article42/csophc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、網(wǎng)站內(nèi)鏈、關(guān)鍵詞優(yōu)化、網(wǎng)站建設(shè)、定制開發(fā)、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容