大家好,我是小小明,今天我要帶大家學(xué)習(xí)AES加密的基本原理,并爬取一個(gè)經(jīng)過(guò)AES加密的接口。一起來(lái)學(xué)習(xí)吧! AES編碼解碼基礎(chǔ)AES簡(jiǎn)介AES(Advanced Encryption Standard)是取代其前任標(biāo)準(zhǔn)(DES)而成為新標(biāo)準(zhǔn)的一種對(duì)稱(chēng)加密算法。 被選定為AES的Rijndael算法全世界的企業(yè)和密碼學(xué)家提交了多個(gè)對(duì)稱(chēng)密碼算法作為AES的候選,最終在2000年從這些候選算法中選出了一種名為 Rijndael的對(duì)稱(chēng)密碼算法,并將其確定為了AES。 Rijndael分組密碼算法,會(huì)多次重復(fù)以下4個(gè)步驟:SubBytes、ShiftRows、MixColumns、AddRoundkey。
Rijndael的分組長(zhǎng)度和密鑰長(zhǎng)度可以分別以32比特為單位在128比特到256比特的范圍內(nèi)進(jìn)行選擇。不過(guò)在AES的規(guī)格中,分組長(zhǎng)度固定為128比特,密鑰長(zhǎng)度只有128、192和256比特三種。 流密碼與分組密碼對(duì)數(shù)據(jù)流進(jìn)行連續(xù)處理的密碼算法稱(chēng)為流密碼,流密碼一般以1bit、8bit、32bit等單位進(jìn)行加密解密運(yùn)算。 分組密碼則每次只處理特定長(zhǎng)度的一塊數(shù)據(jù),一個(gè)分組的比特?cái)?shù)(bit)就稱(chēng)為 分組長(zhǎng)度。DES、AES等多數(shù)對(duì)稱(chēng)加密算法都屬于分組密碼。 AES的分組長(zhǎng)度是128bit(16字節(jié)),因此一次可以加密128bit的明文,并生成128bit的密文。每次處理完一個(gè)分組就結(jié)束了,不需要通過(guò)內(nèi)部狀態(tài)來(lái)記錄加密的進(jìn)度。 分組密碼算法只能加密固定長(zhǎng)度的分組數(shù)據(jù),對(duì)于一段很長(zhǎng)的明文,需要不斷迭代出固定的長(zhǎng)度進(jìn)行加密;對(duì)于最后不夠固定長(zhǎng)度的明文需要補(bǔ)齊至固定長(zhǎng)度,最終全部加密。 AES常用的分組模式有:
目前筆者只見(jiàn)過(guò)ECB和CBC兩種密碼模式,下來(lái)針對(duì)這兩種模式介紹: ECB模式ECB模式的全稱(chēng)是 Electronic CodeBook mode(電子密碼本模式)。在ECB模式中,將明文分組加密之后的結(jié)果將直接成為密文分組。 加密: 解密: 使用ECB模式加密時(shí),相同的明文分組會(huì)被轉(zhuǎn)換為相同的密文分組??梢岳斫鉃槭且粋€(gè)巨大的“明文分組→密文分組”的對(duì)應(yīng)表,因此ECB模式也稱(chēng)為電子密碼本模式。 當(dāng)最后一個(gè)明文分組的內(nèi)容小于分組長(zhǎng)度時(shí),需要用一些特定的數(shù)據(jù)進(jìn)行填充( padding)。
CBC模式CBC模式的全稱(chēng)是Cipher Block Chaining(密文分組鏈接)模式,因?yàn)槊芪姆纸M是像鏈條一樣相互連接在一起的。 在CBC模式中,首先將密文分組與前一個(gè)密文分組進(jìn)行XOR運(yùn)算,然后再進(jìn)行加密。 當(dāng)加密第一個(gè)明文分組時(shí),由于不存在“前一個(gè)密文分組”,因此需要事先準(zhǔn)備一個(gè)(長(zhǎng)度為一個(gè)分組的隨機(jī)數(shù)據(jù))來(lái)代替“前一個(gè)密文分組”,這個(gè)隨機(jī)數(shù)據(jù)就稱(chēng)為:初始化向量(IV)。 加密: 解密:
參考:《圖解密碼技術(shù)》 AES支持的填充方式前面說(shuō)到當(dāng)最后一個(gè)明文分組的內(nèi)容小于分組長(zhǎng)度時(shí),需要用一些特定的數(shù)據(jù)進(jìn)行填充( padding)。 AES支持支持的填充方式:
簡(jiǎn)單介紹一下: NoPadding:表示不填充。 ISO10126Padding:填充字節(jié)序列的最后一個(gè)字節(jié)填充字節(jié)序列的長(zhǎng)度,其余字節(jié)填充隨機(jī)數(shù)據(jù)。 示例(塊長(zhǎng)度為 8,數(shù)據(jù)長(zhǎng)度為 9): 數(shù)據(jù): FF FF FF FF FF FF FF FF FF ISO10126 填充: FF FF FF FF FF FF FF FF FF 7D 2A 75 EF F8 EF 07 Zeros : 填充字符串由設(shè)置為零的字節(jié)組成。 PKCS7 :填充字節(jié)序列,每個(gè)字節(jié)填充該字節(jié)序列的長(zhǎng)度。 示例(塊長(zhǎng)度為 8,數(shù)據(jù)長(zhǎng)度為 9): 數(shù)據(jù): FF FF FF FF FF FF FF FF FF ISO10126 填充: FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07 PKCS5與PKCS7的區(qū)別 在PKCS5Padding中,明確定義Block的大小是8位,而在PKCS7Padding定義中,對(duì)于塊的大小可以在1-255之間,填充值的算法都是一樣的。PKCS7填充方式在設(shè)定塊長(zhǎng)度為 8時(shí),與 PKCS5 填充方式等價(jià)。 Python爬取ECB加密數(shù)據(jù)示例這次我們爬取的網(wǎng)站是:https://www./data/market-ratio/ 目的是抓取比特幣市值占比數(shù)據(jù): 接口地址https://gate./w1/home/head_pair 發(fā)現(xiàn)一個(gè)需要校驗(yàn)的加密字段,現(xiàn)在我們需要對(duì)它進(jìn)行JS逆向分析: 根據(jù)參數(shù)名secretKeyVersion我們可以嘗試全局搜索。 控制臺(tái)全局搜索快捷鍵是:Ctrl+ Shift+ F 由于并沒(méi)有做很復(fù)雜的JavaScript混淆,直接搜索到了對(duì)應(yīng)的加密代碼。對(duì)于這種json數(shù)據(jù),一般搜索JSON.stringify都能找到相應(yīng)的加密入口。 下面我們?yōu)閟ign打上斷點(diǎn),游覽器一步步跟蹤。 僅僅進(jìn)入第一層,我們已經(jīng)清楚了加密算法是AES,采用ECB模式,Pkcs7填充方式,密鑰是WTAHAPPYACTIVITY。 被加密的文本包含appId、timestamp和serverCode三個(gè)參數(shù)。 理解這些我們就可以開(kāi)始編碼了,首先獲取參數(shù)e:
加密后tostring方法通過(guò)簡(jiǎn)單的追蹤未找到具體的實(shí)現(xiàn),但根據(jù)最終結(jié)果可以推測(cè)是經(jīng)過(guò)了base64加密,于是對(duì)上面的json參數(shù)加密并base64編碼再進(jìn)行相應(yīng)的文本替換:
結(jié)果形式已經(jīng)與前端的參數(shù)大致一致,但多了\n換行符。雖然不清楚具體機(jī)制,我們繼續(xù)把它替換掉即可,最終代碼為:
然后我們就可以直接爬取接口的數(shù)據(jù)了:
可以看到已經(jīng)成功的抓取到了相應(yīng)的數(shù)據(jù)。 對(duì)于pair_ext_info那列可以使用字典分列,擴(kuò)展到當(dāng)前表中:
|
|
來(lái)自: 小小明代碼實(shí)體 > 《待分類(lèi)》