使用Python對數據進行AES加密和解密

隨着網絡上爬蟲的橫行和猖獗,各大網站爲了最大限度地限制自家數據被採集,紛紛加入了各種反爬手段,比如:

  • 生成瀏覽器UA指紋識別;
  • 用各種驗證方式(短信、滑塊、點選漢字、點擊)進行識別;
  • ……

這一類的反爬手段都是一層防禦,類似於城堡的城門一樣,只要突破這道防線,就可以爲所欲爲了。

除此之外,還有一些網站,會進行二層防禦,對數據加入各種限制措施,比如混淆、加密等。這就像我們進了城門之後,要是想進某某內城,還得經過門口的官兵對腰牌和核驗。

比如某電商網站就在數據中使用了AES加密,其返回的數據如下圖所示:

經過解密之後,我們可以得到真正的數據爲,如下圖所示:

這就是利用Python進行AES解密實現的,下面,我們來介紹一下在Python中對數據進行AES加密和AES解密。

文章目錄

一、AES算法簡介

以下內容來自於網絡,大家隨便看看,如果想詳細瞭解,可以找專門的資料進行學習:

AES全稱爲高級加密標準,是Advanced Encryption Standard的首字母簡寫。

AES加密標準又稱爲高級加密標準Rijndael加密法,是美國國家標準技術研究所NIST旨在取代DES的21世紀的加密標準。AES的基本要求是,採用對稱分組密碼體制,密鑰長度可以爲128、192或256位,分組長度128位,算法應易在各種硬件和軟件上實現。1998年NIST開始AES第一輪分析、測試和徵集,共產生了15個候選算法。 [1]

1999年3月完成了第二輪AES2的分析、測試。2000年10月2日美國政府正式宣佈選中比利時密碼學家Joan Daemen和Vincent Rijmen提出的一種密碼算法Rijndael作爲AES的加密算法。

AES加密數據塊和密鑰長度可以是128b、192b、256b中的任意一個。AES加密有很多輪的重複和變換。大致步驟如下:①密鑰擴展(Key Expansion);②初始輪(InitialRound);③重複輪(Rounds),每一重複輪又包括字節間減法運算(SubBytes)、行移位(ShiftRows)、列混合(MixColurmns)、輪密鑰加法運算(AddRoundKey)等操作;①最終輪(Final Round),最終輪沒有列混合操作(MixColumns)。

二、AES加密

在這裏,我們選用AES加密算法中的CBC模式來進行演示。

在上面我們提過,AES加密算法的CBC模式採用密鑰和偏移量的方式對數據進行加密,所以我們首先定義幾個公共的參數,包括原始數據、密鑰、偏移量和AES的CBC模式,代碼如下所示:

a = '''{'name':'州的先生','url':'zmister.com','desc':'編程應用實戰'}''' # 原始數據
k = 'zmistercomzmiste'.encode('utf-8')  # 密鑰
iv = b'1234567890asdfgh'  # 偏移量
mode = AES.MODE_CBC  # 模式
加Python學習qq裙:10667510  送全套零基礎學習資料教程,程序員學習交流大本營

在這裏,我們設置的密鑰長度爲16位字符串,也就是128位字節,在AES加密算法中,密鑰的長度必須爲16位字符串(128字節)、34位字符串(192字節)、32位字符串(256字節)。

接着,我們創建一個函數,用來對原始的數據進行加密:

# 加密數據
def cryp_str(value):
    value = value.encode('utf-8') # 對數據進行utf-8編碼
    cryptor = AES.new(k, mode, iv) # 創建一個新的AES實例
    length = 16
    count = len(value)
    # 如果數據長度小於密鑰長度
    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("原始加密數據:",ciphertext)
    ciphertext_hex = b2a_hex(ciphertext) # 字符串轉十六進制數據
    print("十六進制加密:",ciphertext_hex)
    ciphertext_hex_de = ciphertext_hex.decode()
    print("十六進制加密字符串:",ciphertext_hex_de)
    return ciphertext_hex_de

我們將原始數據傳入其中運行,可以得到加密後的數據,如下圖所示:

在完成使用Python對數據進行AES加密之後,我們繼續使用Python對AES加密的數據進行解密。

三、AES解密

相較於AES加密,AES解密要簡單得多。我們首先實例化一個AES類,然後將加密的十六進制數據轉換爲字符串形式,接着調用AES實例的decrypt()方法對數據進行解密即可,最後再對解密的數據進行解碼,就可以得到原始的數據,其代碼如下所示:

# 解密數據
def decry_str(value):
    cryptor = AES.new(k, mode, iv) # 創建一個AES實例
    value_hex = a2b_hex(value) # 將十六進制數據轉換爲字符串
    plain_text = cryptor.decrypt(value_hex) # 對字符串進行解密
    print("解密數據:",plain_text)
    print('解碼解密數據:',bytes.decode(plain_text).rstrip('\0'))
    return bytes.decode(plain_text).rstrip('\0')

我們將之前AES加密的數據作爲參數傳入其中並運行,最後得到解密後的原始數據,如下圖所示:

這樣,我們就完成了使用Python對數據進行AES加密和解密。

四、最後

在實際的網站中,可能數據不僅僅是通過一種加密手段進行的加密,更多的加密數據會使用多種加密手段進行混淆加密。面對這種情況,一定要先摸透數據的加密過程,不能盲目嘗試。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章