隨著網(wǎng)絡(luò)上爬蟲(chóng)的橫行和猖獗,各大網(wǎng)站為了最大限度地限制自家數(shù)據(jù)被采集,紛紛加入了各種反爬手段,比如:
- 生成瀏覽器UA指紋識(shí)別;
- 用各種驗(yàn)證方式(短信、滑塊、點(diǎn)選漢字、點(diǎn)擊)進(jìn)行識(shí)別;
- ……
這一類的反爬手段都是一層防御,類似于城堡的城門一樣,只要突破這道防線,就可以為所欲為了。

除此之外,還有一些網(wǎng)站,會(huì)進(jìn)行二層防御,對(duì)數(shù)據(jù)加入各種限制措施,比如混淆、加密等。這就像我們進(jìn)了城門之后,要是想進(jìn)某某內(nèi)城,還得經(jīng)過(guò)門口的官兵對(duì)腰牌和核驗(yàn)。

比如某電商網(wǎng)站就在數(shù)據(jù)中使用了AES加密,其返回的數(shù)據(jù)如下圖所示:

經(jīng)過(guò)解密之后,我們可以得到真正的數(shù)據(jù)為,如下圖所示:

這就是利用Python進(jìn)行AES解密實(shí)現(xiàn)的,下面,我們來(lái)介紹一下在Python中對(duì)數(shù)據(jù)進(jìn)行AES加密和AES解密。
文章目錄
一、AES算法簡(jiǎn)介
以下內(nèi)容來(lái)自于網(wǎng)絡(luò),大家隨便看看,如果想詳細(xì)了解,可以找專門的資料進(jìn)行學(xué)習(xí):
AES全稱為高級(jí)加密標(biāo)準(zhǔn),是Advanced Encryption Standard的首字母簡(jiǎn)寫。
AES加密標(biāo)準(zhǔn)又稱為高級(jí)加密標(biāo)準(zhǔn)Rijndael加密法,是美國(guó)國(guó)家標(biāo)準(zhǔn)技術(shù)研究所NIST旨在取代DES的21世紀(jì)的加密標(biāo)準(zhǔn)。AES的基本要求是,采用對(duì)稱分組密碼體制,密鑰長(zhǎng)度可以為128、192或256位,分組長(zhǎng)度128位,算法應(yīng)易在各種硬件和軟件上實(shí)現(xiàn)。1998年NIST開(kāi)始AES第一輪分析、測(cè)試和征集,共產(chǎn)生了15個(gè)候選算法。 [1]
1999年3月完成了第二輪AES2的分析、測(cè)試。2000年10月2日美國(guó)政府正式宣布選中比利時(shí)密碼學(xué)家Joan Daemen和Vincent Rijmen提出的一種密碼算法Rijndael作為AES的加密算法。
AES加密數(shù)據(jù)塊和密鑰長(zhǎng)度可以是128b、192b、256b中的任意一個(gè)。AES加密有很多輪的重復(fù)和變換。大致步驟如下:①密鑰擴(kuò)展(Key Expansion);②初始輪(InitialRound);③重復(fù)輪(Rounds),每一重復(fù)輪又包括字節(jié)間減法運(yùn)算(SubBytes)、行移位(ShiftRows)、列混合(MixColurmns)、輪密鑰加法運(yùn)算(AddRoundKey)等操作;①最終輪(Final Round),最終輪沒(méi)有列混合操作(MixColumns)。
二、AES加密
在這里,我們選用AES加密算法中的CBC模式來(lái)進(jìn)行演示。
在上面我們提過(guò),AES加密算法的CBC模式采用密鑰和偏移量的方式對(duì)數(shù)據(jù)進(jìn)行加密,所以我們首先定義幾個(gè)公共的參數(shù),包括原始數(shù)據(jù)、密鑰、偏移量和AES的CBC模式,代碼如下所示:
a = '''{'name':'州的先生','url':'zmister.com','desc':'編程應(yīng)用實(shí)戰(zhàn)'}''' # 原始數(shù)據(jù) k = 'zmistercomzmiste'.encode('utf-8') # 密鑰 iv = b'1234567890asdfgh' # 偏移量 加Python學(xué)習(xí)qq裙:10667510 送全套零基礎(chǔ)學(xué)習(xí)資料教程,程序員學(xué)習(xí)交流大本營(yíng)
在這里,我們?cè)O(shè)置的密鑰長(zhǎng)度為16位字符串,也就是128位字節(jié),在AES加密算法中,密鑰的長(zhǎng)度必須為16位字符串(128字節(jié))、34位字符串(192字節(jié))、32位字符串(256字節(jié))。
接著,我們創(chuàng)建一個(gè)函數(shù),用來(lái)對(duì)原始的數(shù)據(jù)進(jìn)行加密:
# 加密數(shù)據(jù)
def cryp_str(value):
value = value.encode('utf-8') # 對(duì)數(shù)據(jù)進(jìn)行utf-8編碼
cryptor = AES.new(k, mode, iv) # 創(chuàng)建一個(gè)新的AES實(shí)例
length = 16
count = len(value)
# 如果數(shù)據(jù)長(zhǎng)度小于密鑰長(zhǎng)度
if count < length:
add = (length - count)
# \0 backspace
text = value + ('\0' * add).encode('utf-8')
elif count > length:
add = (length - (count % length))
text = value + ('\0' * add).encode('utf-8')
ciphertext = cryptor.encrypt(text) # 加密字符串
print("原始加密數(shù)據(jù):",ciphertext)
ciphertext_hex = b2a_hex(ciphertext) # 字符串轉(zhuǎn)十六進(jìn)制數(shù)據(jù)
print("十六進(jìn)制加密:",ciphertext_hex)
ciphertext_hex_de = ciphertext_hex.decode()
print("十六進(jìn)制加密字符串:",ciphertext_hex_de)
return ciphertext_hex_de
我們將原始數(shù)據(jù)傳入其中運(yùn)行,可以得到加密后的數(shù)據(jù),如下圖所示:

在完成使用Python對(duì)數(shù)據(jù)進(jìn)行AES加密之后,我們繼續(xù)使用Python對(duì)AES加密的數(shù)據(jù)進(jìn)行解密。
三、AES解密
相較于AES加密,AES解密要簡(jiǎn)單得多。我們首先實(shí)例化一個(gè)AES類,然后將加密的十六進(jìn)制數(shù)據(jù)轉(zhuǎn)換為字符串形式,接著調(diào)用AES實(shí)例的decrypt()方法對(duì)數(shù)據(jù)進(jìn)行解密即可,最后再對(duì)解密的數(shù)據(jù)進(jìn)行解碼,就可以得到原始的數(shù)據(jù),其代碼如下所示:
# 解密數(shù)據(jù)
def decry_str(value):
cryptor = AES.new(k, mode, iv) # 創(chuàng)建一個(gè)AES實(shí)例
value_hex = a2b_hex(value) # 將十六進(jìn)制數(shù)據(jù)轉(zhuǎn)換為字符串
plain_text = cryptor.decrypt(value_hex) # 對(duì)字符串進(jìn)行解密
print("解密數(shù)據(jù):",plain_text)
print('解碼解密數(shù)據(jù):',bytes.decode(plain_text).rstrip('\0'))
return bytes.decode(plain_text).rstrip('\0')
我們將之前AES加密的數(shù)據(jù)作為參數(shù)傳入其中并運(yùn)行,最后得到解密后的原始數(shù)據(jù),如下圖所示:

這樣,我們就完成了使用Python對(duì)數(shù)據(jù)進(jìn)行AES加密和解密。
四、最后
在實(shí)際的網(wǎng)站中,可能數(shù)據(jù)不僅僅是通過(guò)一種加密手段進(jìn)行的加密,更多的加密數(shù)據(jù)會(huì)使用多種加密手段進(jìn)行混淆加密。面對(duì)這種情況,一定要先摸透數(shù)據(jù)的加密過(guò)程,不能盲目嘗試。
|